解决vmware虚拟机占用磁盘空间过大的问题

起因

早都想解决vmware磁盘占用过大的问题,尝试了网上的几种方法没有任何优化。最近脑磁盘又开始飘红,忍无可忍,无需再忍,这次下定决心优化一下这个问题。

先查看一下优化前Ubuntu 18.04.2 (64bit).vmdk占用内存大小,竟然占用220g,实在是夸张,感觉像是装了一个3a大作一样。

image-20251106223757760

不止于此,此前为了防止一个虚拟机占用过大的空间,我在做每个项目的时候都会单独复制一份虚拟机,用完就删除,后面发现随便复制一个虚拟机,都能从10g轻松扩充到60多g。

image-20251106224100684

原因

虚拟机的磁盘是 “稀疏(growable/sparse)” 类型,VMware 一开始只创建一个小文件,但随着系统运行、文件写入,它会按需自动膨胀,直到达到创建时的最大值。

为什么我已经在虚拟机中把下载的文件删除了,而vmdk占用空间并没有减少?

即便你在 Ubuntu 里删除了很多文件,这些空闲块没有被“归零”,对宿主机来说仍然占用空间。

因此解决方法就是将这些空闲块清零,然后通过VMware shrink 工具将这些清零块回收,从而达到释放磁盘空间的目的

解决方法

1) 在ubuntu虚拟机中将空闲块清零

碎片整理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#打开Ubuntu虚拟机

sudo apt-get autoremove
sudo apt-get clean
sudo dd if=/dev/zero of=/zero.fill bs=1M status=progress || true
sudo rm /zero.fill

#清除回收站文件与缓存文件
sudo rm -rf .local/share/Trash/*
sudo rm -rf .cache/*
sudo sudo dd if=/dev/zero of=/tmpfile
#将碎片空间填充上0,结束的时候会提示磁盘空间不足,忽略即可
sudo rm -rf /tmpfile
#删除第二步的填充,如果用df -h 会发现可用的虚拟空间增加许多,但是实际的磁盘空间没有缩减


2) 在windows下使用shrink回收清零块

碎片回收

1
./vmware-vdiskmanager.exe -k "H:\dky-ubuntu18.04\ubuntu18.04_vscode_imx6ull_pro\Ubuntu 18.04.2 (64bit).vmdk"

结果

image-20251107134511666

经过漫长的等待之后,发现从原本的220g减少到201g。

还是不够理想。

终极大法

重新生成磁盘文件结构,而不仅是 shrink

1
D:\LinuxLearningInstall\VMware\vmware-vdiskmanager.exe  `  -r "H:\dky-ubuntu18.04\ubuntu18.04_vscode_imx6ull_pro\Ubuntu 18.04.2 (64bit).vmdk" `  -t 1 "H:\dky-ubuntu18.04\ubuntu18.04_vscode_imx6ull_pro\Ubuntu-compact.vmdk" 
  • -r:从旧盘读取。

  • -t 1:创建 split growable(2 GB 分片)稀疏磁盘,体积会根据实际数据动态增长。

  • 新生成的 Ubuntu-compact.vmdk 会自动剔除所有无效块

预期效果

最终为几十g,取决于实际ubuntu使用了多少空间。

如果上述操作没有明显效果,建议在此之前再清零一次

1
2
3
4
5
6
7
sudo apt-get clean
sudo rm -rf /tmp/*
sudo journalctl --vacuum-time=1d
sudo dd if=/dev/zero of=/zero.fill bs=1M status=progress || true
sync
sudo rm /zero.fill
sudo poweroff

上述操作原理

VMware 的 .vmdk 就相当于一块“虚拟硬盘”。

  • vmware-vdiskmanager -k:只在文件层面做压缩,不会动里面的数据。
  • vmware-vdiskmanager -r ... -t ...:相当于“克隆硬盘”,把原磁盘里所有有效的数据块(操作系统、配置文件、用户文件等)完整复制到一个新磁盘文件中。
    它不改动 Ubuntu 内部文件系统,只是重建磁盘结构、去掉空白区。

所以:

  • Ubuntu 内的 /home/你的用户名/ 目录下的文件、桌面、配置、下载、VS Code 工作区、ROS、IMX6ULL 工程文件等都会完好无损;
  • Ubuntu 的用户账号、密码、包管理配置也都保留;
  • 克隆完成后虚拟机启动起来,看起来和原来一模一样

注意

  1. 需要把快照删除
  2. 需要预留两倍磁盘空间
  3. 以上操作耗时很久