多年来,我一直将VMware Workstation用于软件测试、技术支持和应用程序虚拟化。我明白了一点:经过了长期使用,尤其是操作系统升级后,虚拟磁盘使用的实际磁盘空间会变得远大于其虚拟空间,可能会导致性能下降。VMware Workstation图形化工具并非总是能够收回这部分空间,但是你只要采用特定的操作程序和一些可下载的VMware工具,就可以清理臃肿的磁盘。
不用快照或链接克隆
不妨先说一个重要的注意事项。如果你在使用VMware Workstation中的快照或链接克隆(linked clone),那么就别采用我在本文中概述的操作程序。通过快照或链接克隆运行的虚拟机是通过虚拟磁盘来运行的,而这些虚拟磁盘好比是原始虚拟机的覆盖层(overlay)。如果你试图为原始虚拟机或克隆机整理碎片,就会大大增添复杂性,保证你实际上会遇到性能更糟糕的情况。覆盖机制已经尽量减小了用于虚拟磁盘的空间数量;你可能要增加用于克隆磁盘的空间数量。
注意:可以使用本文介绍的一些方法来清理VMware所谓的完全克隆(full clones)。完全克隆通过一套完整的原始源虚拟机创建而成,但并未与它捆绑在一起。如果你不确信VMware机器是不是克隆、快照还是源虚拟机,那么只要看一下VMware Workstation中的机器详细资料。克隆和快照明确提到了克隆或快照来源,如图1所示。图2所示的机器是非链接,只显示了VMware Workstation的版本。
图1:克隆机的机器详细资料
图2:非链接机器的机器详细资料
我需要为虚拟磁盘整理碎片吗?
碎片现象给虚拟磁盘带来了不一样的性能和大小问题,具体要看多个因素。我运用了两条简单的经验法则。
首先,如果我认为我发现虚拟机的性能大幅下降,那么机器可能需要清理。其次,我将磁盘所在的虚拟机磁盘格式(VMDK)文件的大小与虚拟机内部报告用于该驱动器的空间数量作一番比较。如果你的VMware磁盘使用预先分配的空间,这种比较就没有参照意义。固定磁盘仍得益于碎片整理,但是VMDK文件对虚拟机磁盘来说总是最大的大小。
想找到该文件直接使用的空间,鼠标右击VMware Favorites列表中的虚拟机,从上下文菜单选择Settings(设置)。在打开的Virtual Machine Settings(虚拟机设置)窗口中(如图3所示),选择窗口左边Hardware(硬件)选项卡下方Device(设备)这一列下面的硬盘。然后,关注窗口右半边的Capacity(容量)区域。Current size(当前大小)值显示了磁盘上文件的当前大小。接下来,启动访问操作系统,找到它声称所使用的空间数量。如果访客操作系统声称的使用量远小于VMDK文件所列的数量,那么你可能会得益于为磁盘整理碎片和减肥瘦身。
图3:虚拟机设置
第一步:从访客操作系统来清理
第一步是从访客操作系统里面为磁盘整理碎片。这时候可能正好可以执行一般性的维护,比如操作系统和应用程序更新。(执行维护后,这些更新会立即带来一些碎片,增加已使用空间。)整理碎片后,关闭虚拟机。
第二步:使用VMware工具来整理碎片和减肥瘦身
虽然VMware Workstation有一些选项,可通过虚拟机设置窗口中的Utilities(实用工具)按钮,加载和缩减虚拟磁盘,但是这些选项很少对虚拟磁盘的大小产生重大影响。比如说,我有一个Windows 2000 Professional VMDK文件,有大量闲置空间。Win2K访客操作系统报告,它只使用了2.31GB的空间,但是磁盘文件占用了6.6GB的空间。使用GUI工具并没有减小磁盘空间方面的要求。我而是建议你应该使用VMware可下载的命令行工具:vmware-vdiskmanager和vmware-mount,对磁盘来一次效果显著的减肥瘦身。
开始,你要从VMware网站获得工具。你需要向VMware注册,然后搜索tool download(工具下载)。在运行VMware Workstation 7.1的Windows 7上,我使用了VMware虚拟磁盘开发工具包(VDDK),该工具包含有上面两款工具。安装VDDK,确保记下安装VDDK的文件夹。在32位Windows系统上,该文件夹通常类似C:\program files\vmware\vmware virtual disk development kit\bin;在64位Windows系统上,它通常类似C:\program files (x86)\vmware\vmware virtual disk development kit\bin。现在你可以准备开始:
1. 使用拥有管理权限的帐户,打开命令提示符。
2. 使用这个命令:pushd
把你的当前目录设置成VDDK文件夹,如代码片段1中标注 A部分的代码所示。这一步确保,VMware工具——以及更重要的是,它们的支持性DLL——在命令搜索路径的前面。如果你运行64位Windows,我强烈建议执行这一步,哪怕你认为自己知道有一种更好的办法。如果先搜索其他路径,VMware虚拟磁盘加载工具vmware-mount经常会失败。
3. 使用VMware工具,为虚拟磁盘整理碎片。在命令提示符下,运行这个命令:vmware-vdiskmanager
使用-d(表示碎片整理)选项和虚拟磁盘文件的完整路径。代码片段1中标注 B部分的代码显示了这个命令,VMDK文件在E:\win2k pro\w2kprodisk1.vmdk。
4. 这时候,你要使用vmware-mount,把文件映射为磁盘。你必须为VMDK文件指定未使用的驱动器符和路径。代码片段1中标注 C部分的代码把驱动器Z映射成W2kProDisk1.vmdk文件。
5. 为了让磁盘准备减肥瘦身,使用这个命令:vmware-vdiskmanager
使用-p(表示准备)选项和加载VMDK文件的驱动器对应的驱动器符,而不是VMDK文件的路径。首次尝试为磁盘减肥瘦身时,使用错误的驱动器符是第二种导致问题的根源;这时候,你要依赖驱动器符。代码片段1中标注 D部分的代码显示了作为磁盘Z加载文件的正确操作程序。你会收到不断更新的百分比显示,告诉你磁盘擦除方面的进度。擦除掉的不是整个磁盘,而是文件中的空白区。
6. 接下来卸载磁盘,为此使用这个命令:vmware-mount -d
如代码片段1中标注 E部分所示。在这个命令中,“d”表示“卸载”。
7. 最后,缩减VMDK文件,为此使用这个命令:vmware-vdiskmanager -k
如代码片段1中标注 F部分所示。在这个命令中,“k”是个助记符号,表示“缩减”这个词;字母“s”用于另一个选项。
这时候,你大功告成了。这个方法极其有效。我前面提到的Win2K磁盘文件(访客操作系统明明只用了2.3GB空间,它却占用了6.65GB空间)缩减到了只有2.32GB。你可以对占用过多空间的每个访客操作系统重复执行这个过程。
第三步:为主机磁盘整理碎片
作为提升性能的最后一步,从主机操作系统为虚拟机驻留在上面的物理磁盘整理碎片。如果你因访客驱动器的碎片现象而遇到性能或存储空间问题,这一步有望解决问题。
自动为磁盘减肥瘦身
虽然我觉得需要时手动执行访客操作系统维护最简单,但是VMware磁盘碎片整理和缩减操作很容易实现自动化。(它们通过命令行来运行。)
可以下载批文件ShrinkVmdk.cmd,使之前过程的第二步实现自动化。这个文件所作的一个假定是,驱动器Z未使用;如果实际情况不是这样,就要修改靠近批文件顶部的这一行:set tmpdrive=Z:,并指向闲置的驱动器符。
你安装了VDDK后,可以开启一个已经提升权限的命令行窗口,以需要整理碎片的那个VMDK文件的完整路径来运行脚本。如果使用批文件,你可以为示例虚拟磁盘文件整理碎片,只要使用这个命令:shrinkvmdk "E:\Win2k Pro\W2kProDisk1.vmdk"
凭我的经验,VMware的虚拟磁盘一般没有麻烦,并不经常需要全面清理。不过,当你确实发现虚拟磁盘在占用过多的驱动器空间时,可以使用这个方法来迅速解决问题。
代码片段1:ShrinkVmdk.cmd