解决vmware虚拟机占用磁盘空间过大的问题起因早都想解决vmware磁盘占用过大的问题,尝试了网上的几种方法没有任何优化。最近脑磁盘又开始飘红,忍无可忍,无需再忍,这次下定决心优化一下这个问题。
先查看一下优化前Ubuntu 18.04.2 (64bit).vmdk占用内存大小,竟然占用220g,实在是夸张,感觉像是装了一个3a大作一样。
不止于此,此前为了防止一个虚拟机占用过大的空间,我在做每个项目的时候都会单独复制一份虚拟机,用完就删除,后面发现随便复制一个虚拟机,都能从10g轻松扩充到60多g。
原因虚拟机的磁盘是 “稀疏(growable/sparse)” 类型,VMware 一开始只创建一个小文件,但随着系统运行、文件写入,它会按需自动膨胀,直到达到创建时的最大值。
为什么我已经在虚拟机中把下载的文件删除了,而vmdk占用空间并没有减少?
即便你在 Ubuntu 里删除了很多文件,这些空闲块没有被“归零”,对宿主机来说仍然占用空间。
因此解决方法就是将这些空闲块清零,然后通过VMware shrink 工具将这些清零块回收,从而达到释放磁盘空间的目的
解决方法1) 在ubuntu虚拟机中将空闲块清零碎片整理
12345678910111213141516#打开Ubuntu虚拟机sudo apt-get autoremovesudo apt-get cleansudo dd if=/dev/zero of=/zero.fill bs=1M status=progress || truesudo 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"
结果
经过漫长的等待之后,发现从原本的220g减少到201g。
还是不够理想。
终极大法重新生成磁盘文件结构,而不仅是 shrink1D:\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使用了多少空间。
如果上述操作没有明显效果,建议在此之前再清零一次
1234567sudo apt-get cleansudo rm -rf /tmp/*sudo journalctl --vacuum-time=1dsudo dd if=/dev/zero of=/zero.fill bs=1M status=progress || truesyncsudo rm /zero.fillsudo poweroff
上述操作原理VMware 的 .vmdk 就相当于一块“虚拟硬盘”。
vmware-vdiskmanager -k:只在文件层面做压缩,不会动里面的数据。
vmware-vdiskmanager -r ... -t ...:相当于“克隆硬盘”,把原磁盘里所有有效的数据块(操作系统、配置文件、用户文件等)完整复制到一个新磁盘文件中。 它不改动 Ubuntu 内部文件系统,只是重建磁盘结构、去掉空白区。
所以:
Ubuntu 内的 /home/你的用户名/ 目录下的文件、桌面、配置、下载、VS Code 工作区、ROS、IMX6ULL 工程文件等都会完好无损;
Ubuntu 的用户账号、密码、包管理配置也都保留;
克隆完成后虚拟机启动起来,看起来和原来一模一样
注意
需要把快照删除
需要预留两倍磁盘空间
以上操作耗时很久