@月黑风高食肉虎 噗噗虎的技术博客

VirtualBox压缩虚拟硬盘文件


长期使用Mac的同学,一定对虚拟机占用硬盘空间不断扩大感到非常头疼吧,尤其是硬盘空间比较小的同学。 今天我们就来聊聊如何压缩VirtualBox的虚拟硬盘vdi文件。

根据VirtualBox手册的8.23 VBoxManage modifyhd一节的说明,使用该命令并带上--compact即可压缩vdi文件,但光使用该命令是不够的,必须要先zero out虚拟机硬盘上空的硬盘空间,根据不同的系统,做法如下:

Windows 系统

Windows系统上需要使用sdelete工具,可以在微软官方网站下载到。

下载解压缩后,把exe文件复制黏贴到C:\windows\system32下,然后使用Win + R快捷键打开CMD,使用下列命令压缩c盘,当然,压缩前先清空硬盘最好。

  C:\> sdelete -z C:

等待命令执行完成后关闭虚拟机即可开始压缩硬盘了。

Ubuntu 系统

Ubuntu上可以使用zerofree工具来清理硬盘。首先通过apt安装:

  $ sudo apt-get install zerofree -y

安装完成后,通过man zerofree可以看到使用说明。根据使用说明,zerofree处理的对象filesystem必须未被挂载或者挂载为只读。如果要处理根系统,你可以使用telinit 1命令切换到单用户模式下运行。

我尝试使用了telinit 1切换到单用户模式,结果虚拟机黑屏死机了。后经过谷歌发现,这是一个未解决的非常老的Ubuntu的碧油鸡……

后来,尝试使用修复模式进入Ubuntu就可以了,操作如下:

首先,使用sudo passwd rootroot根管理员加一个密码,并记住这个密码。

然后,重启系统,在系统启动时按住Shift键进入GRUB的选择界面,选择Advanced options for Ubuntu,然后再选择Ubuntu, with Linux x.xx.x-xx-generic (recover mode)进入修复模式。如果你看到很多recover mode的话,一般选择从上至下第二个即可。

进入Recovery Menu之后,选择root - Drop to root shell prompt选项,然后输入前面修改的根管理员密码。

进入root shell之后,输入zerofree -v /dev/sda1既可开始清理。注意这里的/dev/sda1换成你系统的filesystem。如果不知道是哪个可以用mount命令查看。

等待命令执行完成后关闭虚拟机即可开始压缩硬盘了。

压缩虚拟机硬盘

在虚拟机中清理完硬盘之后,我们就可以用VBoxManage modifyhd --compact命令来压缩虚拟硬盘了。

可以直接使用

  $ VBoxManage modifyhd <filename> --compact

命令来压缩,其中<filename>指的是vdi文件所在位置。

当然可以用先用

  $ VBoxManage list hdds

来查看在VirtualBox中注册的所有虚拟硬盘,然后用

  $ VBoxManage modifyhd <UUID> --compact

命令来压缩注册的硬盘,其中<UUID>指的是在list命令中列出的虚拟硬盘的uuid。

等待命令执行完成即可。

去看看虚拟硬盘文件是不是缩小点了?硬盘空间是不是多出来了?