故障现象

我移动硬盘有300G空间为ext4分区格式,而我的Ubuntu一直装在VMware的虚拟机里。这样我使用VMware的挂载物理磁盘的功能来使用移动硬盘上的300G空间。以前一直好好的,最近突然出现挂载错误的情况。具体表现就是,当我启动虚拟机的时候,VMware会弹出对话框:

\"VMware错误提示\"

如果我点“重试”,则一直弹出这个错误。如果点“继续”,大概点十来次就不见了,但是300G空间的数据变为只读。如果点“取消”,那么整个虚拟机就会崩溃。

问题所在

刚开始我以为磁盘损坏了,用LinuxReader工具读取分区,发现没什么问题。然后我就去网上搜,最终找到一篇:《Setting a disk to offline in order to make physical disk access work in [Windows 7] on [VMware]》。文章的整体的意思是,Windows7在磁盘在线状态下是无法使用VMware的物理磁盘挂载功能的,将磁盘脱机就可以了。经过我实验,发现文章的说法是错误的,但是歪打正着,还是解决了我的问题。

其实我碰到这个问题,是因为我的分区对应的卷脱机了。Windows下有磁盘脱机和卷脱机两种脱机状态。至于我的卷怎么脱机的我也不太清楚,估计是因为,我的ext4分区被Windows分配盘符后,我害怕不小心被格式化了,将盘符删除了,结果Windows顺便把我的卷标记为了脱机状态。关于卷和分区的关系,平时我们的普通分区仅仅是卷的一种,叫做基本卷。卷可以实现比分区更多的功能,比如跨磁盘、组建RAID等。类似于Linux下的LVM。

解决方法

以管理员方式运行cmd,然后运行diskpart,用list volume列出所有卷的状态,对于脱机的卷,找到其编号,然后用select volume <编号>命令选择这个卷,再使用online volume将选择的卷联机。

以下是操作的详细步骤:

C:>diskpart

Microsoft DiskPart 版本 6.3.9600

Copyright (C) 1999-2013 Microsoft Corporation.
在计算机上: VIRTAO-PC

DISKPART> list volume

  卷 ###      LTR  标签          FS      类型        大小     状态       信息
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
  卷     0     Z                       DVD-ROM         0 B  无介质

  卷     1     E   系统         NTFS   磁盘分区         131 GB  正常     页面文件

  卷     2     F   软件         NTFS   磁盘分区         800 GB  正常

  卷     3     C               NTFS   磁盘分区          80 GB  正常     系统

  卷     4     D               NTFS   磁盘分区          31 GB  正常

  卷     5     G   我的SD卡     exFAT  可移动           29 GB  正常

  卷     6     K   虚拟机       NTFS   磁盘分区          85 GB  正常

  卷     7     J   移动存储     NTFS   磁盘分区         380 GB  正常

  卷     8     H                       可移动             0 B  无介质

  卷     9     I                       可移动             0 B  无介质


DISKPART> select volume 8

卷 8 是所选卷。

DISKPART> online volume

DiskPart 成功使所选卷联机。

DISKPART> exit

退出 DiskPart...

C:>

DiskPart

这个工具是Windows下的专业命令行磁盘管理工具,类似Linux下的fdisk。这里只介绍有关卷和磁盘状态修改的命令。

首先是list命令,可以列出系统中的磁盘、分区或者卷的各类信息,包括后文要用到的编号:

list disk
list partition
list volume

然后是select命令,这个命令用来选择当前要操作的磁盘或者卷。只有使用这个命令选择目标磁盘或者卷后,才能进行进一步的操作。

select disk <编号>
select partition <编号>
select volume <编号>

第三个是控制联机和脱机的命令。

online disk
online volume
offline disk
offline volume

使用之前要先选择分区。

其它命令的详细用法,可以输入命令后查看帮助,也可以用help命令。

VMware挂载物理磁盘时,使用PhysicalDriveX的方式标记物理磁盘。不过,这个编号很容易变化,比如你挂载的是一块移动硬盘的某个分区,或者虚拟机复制到了其它机器上。由于只是编号的变化,我们只需要修改一下编号,就可以让虚拟机找到正确的磁盘。

首先,我们需要确定新的编号是多少。在命令提示符输入以下命令:
wmic diskdrive list
上面命令可能显示的内容太多,可以输入以下命令精简一下内容:
wmic diskdrive list brief
根据驱动器的名称,我们很容易找到物理磁盘编号。比如我的是:
C:\Users\Virtao>wmic diskdrive list brief
Caption DeviceID Model Partitions Size
ST950042 3AS USB Device \\.\PHYSICALDRIVE1 ST950042 3AS USB Device 2 500105249280
SSK HE-T300 USB Device \\.\PHYSICALDRIVE2 SSK HE-T300 USB Device 3 500105249280
INTEL SSDSA1M080G2HP \\.\PHYSICALDRIVE0 INTEL SSDSA1M080G2HP 2 80023265280
找到了SSK的移动硬盘编号是PHYSICALDRIVE2。

然后,我们需要修改VMware的配置文件。到虚拟机根目录下,可以看到有好多vmdk后缀的文件,这些就是对虚拟机磁盘的描述。命名方式一般是“<虚拟机名>-<编号>.vmdk”。我们如何确定哪个是我们的物理磁盘配置文件呢?很简单,去“VM→Settings…→Hardware”,在列表里找到你的磁盘,Disk file就是相应磁盘的配置文件。我的是“Ubuntu 64-bit-1.vmdk”。

用UltraEdit或者其它高级文本编辑器打开Ubuntu 64-bit-1.vmdk(此文件用的是Linux换行符,因此最好不要用Windows自带的文本编辑器),会有一行类似以下的内容:
RW 587223882 FLAT “\\.\PhysicalDrive4” 389544183 partitionUUID \\?\usbstor#disk&ven_ssk&prod_he-t300&rev_9072#0000000000000052&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

将PhysicalDrive4改为PhysicalDrive2即可。

最后,保存退出编辑,用VMware打开虚拟机,即可正常运行。

注意,这个只能解决同一个物理磁盘编号改变的问题,无法解决磁盘迁移的问题(即你想以当前的配置文件挂载新的物理磁盘)。