如何压缩 VirtualBox 磁盘

原理

大概是对可用空间写 0,文件系统自动整理
然后 VBoxManage 回收文件系统中的未分配的大块 0 区域

所以,应该可以使用 dd 按以下步骤操作,替代 zerefree

# 写临时文件,直至报磁盘空间不足(No space left on device)退出
dd if=/dev/zero of=zerofree.bin bs=1M
# 然后删除临时文件
rm zerofree.bin

当然,manpage 中列出了 zerofreedd 命令优秀的几条理由:

  1. 速度快
  2. 不需要真的写满整个磁盘(如果是动态分配的虚拟磁盘,dd 会使磁盘实际分配空间 = 虚拟分配空间)
  3. 不干扰其他程序的写磁盘操作

步骤

  1. 用一个 ISO 文件,挂载目标磁盘,进入 Live 模式
  2. 安装 zerofree:sudo apt install -y zerofree
  3. 填充 0:sudo zerofree -v /dev/sdb1
  4. 执行结束之后,关闭 Live 系统
  5. 在 VBOX 宿主机上:VBoxManage modifymedium disk --compact /path/to/vdi

参考