经常在Windows机下安装虚拟Linux操作系做实验,为了节省硬盘空间,并最大地让虚拟机适应将来的要求,把虚拟硬盘的容量定义很大,然后设置动态分配属性使其按需扩展。虚拟硬盘的动态扩展和Oracle的表空间类似,是单方向的,也就是增大后就不能自动缩小。虚拟机使用的真实空间其实远远小于宿主机上的虚拟磁盘大小,因此需要经常性的Shrink下虚拟磁盘对节约硬盘资源意义重大。
网上对缩小虚拟硬盘文件存储容量的方法有很多,其中比较靠谱的一种办法是在虚拟机操作系统中执行dd命令创建一个由0构成的巨大文件,然后接着将其删除,在宿主机删使用VBoxManage工具对磁盘进行压缩,这种做法不是对每类文件系统都有效,于是通过搜索整理了行之有效的办法。
1、使用System Rescue CD启动虚拟机操作系统,这里采用这类CD的原因是它适应性比别的Live CD强,其实Ubuntu Live CD也是可以的,下载地址为http://www.sysresccd.org/Download。
2、进入Live CD的操作系统后找到需要缩减的磁盘对应的设备,执行如下命令
root@sysresccd /root % zerofree -v /dev/sda1
root@sysresccd /root % fsck.ext2 -f /dev/sda1
如果存在多个非swap分区,依次执行
对swap分区执行如下命令
dd if=/dev/zero of=/dev/sda3
3、关闭虚拟机操作系统,退出VirtualBox,在宿主机中执行
VBoxManage.exe modifyhd --compact e:\VMs\RHEL\RHEL.vdi
注:zerofree貌似无法完成包含加密文件系统的设备读写。
Windows的虚拟机只需进行磁盘碎片整理,使用SDelete执行sdelete -c重启后再执行VBoxManage.exe进行磁盘压缩即可,再次就不尝试了。