VirtualBox 虚拟机的容量会随着使用自动扩容,这本来是个好事;不过在实际使用过程中,由于系统错误日志疯狂写入等原因,也可能会导致系统容量被明显扩充变大。容量变大之后,无论是转换虚拟盘格式,还是导入导出,均不能减小容量。特别是做虚拟机备份导出时,白白浪费了大量的空间。因此,进行虚拟机磁盘容量的压缩,势在必行!

以下两个系统我都用了很长时间,也都测试过方法的可行性,可供参考。

虚拟机磁盘格式转换

需要注意的是,虽然 VirtualBox 默认的磁盘格式为 vdi,可是经过导入、导出等一系列操作后,硬盘格式往往都是 wmdk;本文所讨论的磁盘压缩方法,只对 vdi 格式的磁盘有效;因此,磁盘压缩之前,往往都需要进行磁盘格式转换!

  1. 在 VirtualBox 管理界面上,还需要重新删除原有的 vmdk 磁盘(否则 uuid 冲突导致无法导入 vdi 磁盘)、然后指定系统需要使用的磁盘为新的 vdi 磁盘(否则无法使用后续的磁盘压缩功能)。

    释放、删除硬盘

  2. 转换虚拟机磁盘文件格式为 vdi

     cd "C:\Program Files\Oracle\VirtualBox\"
     "VBoxManage.exe" clonehd "e:\source.vmdk" "e:\target.vdi" --format vdi

    将VMDK硬盘转换为VDI格式

  1. 将新磁盘关联到虚拟机中

    将VDI硬盘挂载到系统中

    将VDI硬盘挂载到系统中

Windows 虚拟机磁盘的压缩

毫无疑问,Windows 平台的磁盘压缩比较简单,在主机系统中直接执行以下命令即可。

 "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd "e:\target.vdi" --compact

多年前,我曾进行过上述操作,并截图,可是现在找不到之前的截图了,有空再补了。

CentOS 虚拟机磁盘的压缩

一开始,我尝试使用网上泛滥的手动将磁盘剩余空间写 0 的方法,可是,过了很久,不过没有看到磁盘空间变小,反而越来越大——我本来虚拟机才25GB,不到半个小时变成了 60 GB,本来主机硬盘容量就很小,吓得我赶紧终止了。

dd  if=/dev/zero   of=/empty    bs=1M
#dd if=/dev/zero   of=/dev/sda3
rm -f /empty

多天以后,做完了手上的工作,重新去外网上学习相应的处理方法,发现了有个叫做 zerofree 工作的做法没有尝试过,因此我重新导入了一个虚拟机进行尝试,结果成功了,过程如下:

  1. 使用 yum 下载安装 zerofree 程序包

     su
     yum -y install zerofree
  2. 重新启动系统,并在系统 GRUB 启动菜单出现时点击 Enter 键进入编辑模式

    • 选择含有 vmlinuz 字样菜单行,按 e 进入内容编辑状态

      选择含有vmlinuz字样的菜单进行编辑

    • 在菜单末尾增加 init=/bin/bashEnter 返回上级菜单

      增加init参数以进入救援模式

      内核启动参数 含义 备注
      init=/sbin/init 告诉内核用 /sbin/init 作为它的 init 程序
      init=/bin/bash 只启动 bash,在紧急恢复时有用 救援模式
      root=/dev/foo 告诉内核用 /dev/foo 作为根设备
      single 引导进入单用户模式 单用户模式
    • 然后按 b 重新启动系统

      按b字符启动进入系统

    • 进入救援模式初始界面

      救援模式初始界面

  1. 查看系统的磁盘名称

     df
  2. 执行清理(请根据前一步的查询结果进行确定需要清理的磁盘)

     zerofree -v /dev/sda1
     zerofree -v /dev/sda3

    zerofree填充

    至此,虚拟机磁盘容量 已经明显变小。然后强制关机,重新进入系统。

    无法使用常规关机命令,只能硬件关闭

  3. 在宿主机中,打开命令行,笔者这里是Windows系统,如下执行

     "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd "e:\target.vdi" --compact

版本说明

参考文献

  1. mowkeeper.VirtualBox压缩vdi文件[EB/OL].http://mowblog.com/virtualbox%E5%8E%8B%E7%BC%A9vdi%E6%96%87%E4%BB%B6/, 2021/01/08.

  2. Canonical Ltd.Ubuntu Manpage: zerofree — zero free blocks from ext2, ext3 and ext4 file-systems[EB/OL].http://manpages.ubuntu.com/manpages/hirsute/en/man8/zerofree.8.html, 2021/01/10.

变更说明

  • 1.0.0,2021/01/19 20:55:03,初始版本。

  • 1.0.1,2021/02/12 19:36:23,补充 Linux 内核启动参数表。