在 VMware 中,虚拟机的磁盘(通常是精简置备/Thin Provision)会随着内部数据的增加而变大,但删除内部文件后,物理宿主机上的 .vmdk 磁盘文件并不会自动缩小。这是因为宿主机不知道 Ubuntu 内部哪些数据块已经被标记为“已删除”。
要缩小物理磁盘占用,你需要执行两个核心步骤:1. 将虚拟机的可用空间用“零”填充;2. 让 VMware 压缩并回收这些全零的区块。
以下是具体的操作指南(请注意:在执行收缩操作前,必须删除该虚拟机的所有“快照”,否则无法压缩磁盘!)。
方法一:最简单的方法(使用自带的 Open VM Tools)
这是最推荐的方法,如果你安装了带桌面的 Ubuntu,通常已经内置了这个工具。它会自动完成“填零”和“压缩”两个步骤。
- 启动并登录你的 Ubuntu 虚拟机。
- 确保安装了
open-vm-tools(通常已默认安装):sudo apt update sudo apt install open-vm-tools - 执行以下命令开始自动缩小根目录(
/)所在的磁盘:sudo vmware-toolbox-cmd disk shrink /注意:如果你的日志在其他挂载点(比如
/var是独立分区的),请把/换成对应的路径,或者直接使用sudo vmware-toolbox-cmd disk shrinkonly。 - 等待完成。屏幕上会显示一个进度条,它会先在客户机内填充零,然后触发宿主机的 VMware 软件自动回收空间。
方法二:手动填零 + 宿主机压缩(如果方法一报错或失效)
如果 vmware-toolbox-cmd 因为某些权限设置无法直接压缩宿主机磁盘,你可以采用传统的手动两步法:
第一步:在 Ubuntu 虚拟机内部“填零”
这步的目的是创建一个全都是0的文件,把剩余空间全部占满,然后再把它删掉。
- 在 Ubuntu 终端中运行以下命令(请确保在执行期间不要进行其他写操作):
sudo dd if=/dev/zero of=/zero_file bs=1M - 注意: 这个命令会一直运行,直到提示“No space left on device(设备上没有空间)”为止。这是正常的预期现象! 意味着所有空闲空间都被填满零了。
- 填满后,删除这个全零文件:
sudo rm -f /zero_file - 关闭(Shut Down)虚拟机。 (必须关机才能进行第二步)。
第二步:在 VMware 宿主机上压缩磁盘
关闭虚拟机后,在你的物理机(Windows/Mac)上操作:
如果你用的是 VMware Workstation (Windows/Linux):
- 在虚拟机列表中右键点击该虚拟机 -> 设置 (Settings)。
- 选择 硬件 (Hardware) 选项卡下的 硬盘 (Hard Disk)。
- 在右侧面板中,点击 碎片整理 (Defragment)(可选,但推荐先点一下)。
- 完成后,点击 压缩 (Compact)。VMware 会开始扫描全零区块并真正减小
.vmdk文件的体积。
如果你用的是 VMware Fusion (Mac):
- 点击菜单栏的 虚拟机 (Virtual Machine) -> 设置 (Settings)。
- 选择 硬盘 (Hard Disk)。
- 展开“高级选项”,点击 清理磁盘 (Clean up disk) 或使用主界面提示的“可回收空间”功能。
⚠️ 重要注意事项:
- 快照拦截: 如果你的虚拟机有快照(Snapshots),磁盘是绝对无法缩小的!因为快照锁定了之前的磁盘状态。请务必在 VMware 菜单栏中打开“快照管理器”,删除所有快照后再进行上述操作。
- 宿主机可用空间: 在进行压缩时,宿主机物理硬盘上最好留有足够的空余空间,因为 VMware 可能会在合并数据时产生临时文件。
- 耗时较长: 无论哪种方法,由于涉及到大量的磁盘 I/O 读写,可能会花费十几分钟到数小时不等,请耐心等待。