在 Windows 宿主机上压缩 Ubuntu 虚拟机 VDI 文件的完整指南

在 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 文件

  1. 关闭虚拟机:确保虚拟机完全关闭(非休眠状态)。
  2. 执行压缩命令(以管理员身份运行 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)
  1. 重启进入恢复模式:GRUB 菜单 → Advanced optionsRecovery mode
  2. 选择 root shell,执行:
# 终止占用进程
fuser -k /
# 卸载虚拟文件系统
umount /proc /sys /dev/pts
# 重新挂载根分区为只读
mount -o remount,ro /dev/sda1
# 运行 zerofree
zerofree -v /dev/sda1
方法 2:使用 Ubuntu Live CD
  1. 从 ISO 启动进入 Live 环境。
  2. 挂载根分区并执行:
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 /

四、操作验证

  1. 检查虚拟机内空间
df -h /
  1. 查看宿主机 VDI 文件大小
dir "D:\VMs\Ubuntu-16.04.vdi"

五、注意事项

  1. 备份数据:操作前备份虚拟机重要文件。
  2. 确认分区设备名:通过 df -h / 确认根分区(如 /dev/sda2)。
  3. 避免日志干扰:可临时禁用文件系统日志:
sudo tune2fs -O ^has_journal /dev/sda1  # 操作后需重新启用

六、总结

通过 虚拟机清理 → 零填充 → 宿主机压缩 三步,可有效减小 VirtualBox 虚拟磁盘文件。若遇到文件系统占用问题,优先通过恢复模式或 Live CD 解决。


相关工具

扩展阅读


文章标签#VirtualBox #Ubuntu #VDI压缩 #虚拟机优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值