在 Windows 宿主机上压缩 Ubuntu 虚拟机 VDI 文件的完整指南
一、问题背景
- 现象:VirtualBox 虚拟磁盘文件(
.vdi
)远大于虚拟机内实际使用空间。 - 原因:虚拟机删除文件后,虚拟磁盘不会自动释放空白区域。
- 目标:通过清理和压缩,使
.vdi
文件接近实际使用大小。
二、操作步骤
步骤 1:清理虚拟机内部空间
在 Ubuntu 虚拟机内执行以下命令,释放无用文件:
# 清理包缓存和旧内核
sudo apt clean
sudo apt autoremove --purge
# 删除旧内核(保留最新的 1-2 个)
sudo apt purge linux-image-<旧版本号>
# 清空回收站和临时文件
rm -rf ~/.cache/* ~/.local/share/Trash/* /tmp/*
步骤 2:零填充剩余空间(关键!)
通过 zerofree
将未使用空间标记为 0,便于 VirtualBox 识别压缩:
# 安装 zerofree
sudo apt install zerofree
# 重启进入单用户模式(关闭所有服务)
sudo init 1
# 运行 zerofree(假设根分区是 /dev/sda1)
zerofree -v /dev/sda1
# 完成后重启
sudo reboot
步骤 3:在 Windows 宿主机压缩 VDI 文件
- 关闭虚拟机:确保虚拟机完全关闭(非休眠状态)。
- 执行压缩命令(以管理员身份运行 CMD/PowerShell):
cd "C:\Program Files\Oracle\VirtualBox"
.\VBoxManage.exe modifymedium disk "F:\vb\2004-buildroot-ratrak\2004-buildroot-ratrak-disk1.vdi" --compact
三、常见问题解决
问题 1:zerofree
报错 /dev/sda1 is mounted rw
原因:文件系统以读写模式挂载,需强制挂载为只读。
解决方案:
方法 1:通过恢复模式(Recovery Mode)
- 重启进入恢复模式:GRUB 菜单 → Advanced options → Recovery mode。
- 选择 root shell,执行:
# 终止占用进程
fuser -k /
# 卸载虚拟文件系统
umount /proc /sys /dev/pts
# 重新挂载根分区为只读
mount -o remount,ro /dev/sda1
# 运行 zerofree
zerofree -v /dev/sda1
方法 2:使用 Ubuntu Live CD
- 从 ISO 启动进入 Live 环境。
- 挂载根分区并执行:
sudo apt install zerofree
sudo mount -o ro /dev/sda5 /mnt
sudo zerofree -v /dev/sda5
问题 2:mount: /: mount point is busy
原因:进程或虚拟文件系统占用根目录。
解决方案:
# 查看并终止占用进程
fuser -vm /
fuser -k /
# 卸载虚拟文件系统
umount -l /proc /sys /dev/pts
# 强制挂载为只读
mount -o remount,ro /dev/sda1
问题 3:压缩后 VDI 文件未缩小
- 检查快照:删除所有虚拟机快照(快照会阻止压缩)。
- 启用 TRIM:在虚拟机内配置自动 TRIM:
sudo crontab -e
# 添加行:@weekly /sbin/fstrim /
四、操作验证
- 检查虚拟机内空间:
df -h /
- 查看宿主机 VDI 文件大小:
dir "D:\VMs\Ubuntu-16.04.vdi"
五、注意事项
- 备份数据:操作前备份虚拟机重要文件。
- 确认分区设备名:通过
df -h /
确认根分区(如/dev/sda2
)。 - 避免日志干扰:可临时禁用文件系统日志:
sudo tune2fs -O ^has_journal /dev/sda1 # 操作后需重新启用
六、总结
通过 虚拟机清理 → 零填充 → 宿主机压缩 三步,可有效减小 VirtualBox 虚拟磁盘文件。若遇到文件系统占用问题,优先通过恢复模式或 Live CD 解决。
相关工具:
扩展阅读:
文章标签:#VirtualBox
#Ubuntu
#VDI压缩
#虚拟机优化