压缩 VM 磁盘文件

虚拟机创建后,随着日常使用,物理机中的磁盘文件 vmdk 会越来越大,严重占用主机空间,并且磁盘文件只会增大不会缩小,即使删除虚拟机中的文件,物理机中的磁盘文件 vmdk 也不会减小

首先可以使用 VM 中的压缩磁盘功能,其中碎片整理花费时间可能比较长: (感觉效果不太好)

压缩 VM 磁盘文件1.png

除此之外,在 VMware Workstation 的安装目录下,有一个 vmware-vdiskmanager.exe 程序

从物理机拖到Linux虚拟机中的文件消失了15.png

注意:使用此方法虚拟机需要挂起或关机,同时虚拟机不能有快照

在该目录下打开终端,输入:

vmware-vdiskmanager.exe -k "vmdk 文件路径"

如果安装虚拟机时选择的是将磁盘存储为多个文件,而非存储为单个文件,则只需选择名为:虚拟机名.vmdk 的那个 vmdk 文件 (文件名不带 s 的那种)

这样就可以使用 vmware-vdiskmanager.exe 程序对 VM 磁盘文件 vmdk 进行压缩

执行过程会显示压缩进度,完成后会提示:

Shrink: 100% done.
Shrink completed successfully.

Linux 虚拟机空间回收

有时候使用 vmware-vdiskmanager.exe 压缩的效果也不太好,是因为虚拟机中的一些数据虽然在虚拟机中被删除了,但是并不会回收这部分空间

参考文章:解决VMware中Ubuntu占用空间过大的问题(Ubuntu虚拟机空间回收)ubuntu虚拟机占空间太大-CSDN博客

对于 Windows 虚拟机可以通过关机后在 VM 中直接:虚拟机 --> 管理 --> 清理磁盘

Linux 虚拟机空间回收2.png

但是 Linux 系列虚拟机只能通过 VMware 的虚拟机工具来回收空间

注意:虚拟机不能有快照,否则会显示:“为该虚拟机禁用了磁盘压缩。”

在虚拟机开机状态下,在终端输入:

sudo vmware-toolbox-cmd disk list

会输出可以回收的磁盘:

/
/boot/efi   # 尽量不要压缩这个,虽然不会造成严重后果,但可能会让系统存在小 Bug

然后针对输出的磁盘,使用如下指令:

sudo vmware-toolbox-cmd disk shrink /

运行该指令后,Linux 虚拟机的终端会显示开始回收,走完里面的进度条之后,会启动物理机中 VMware 的程序开始压缩,也会有进度条,物理机的进度条走完之后就压缩完成了

Linux 虚拟机空间回收1.png

回收完后,虚拟机磁盘 vmdk 文件大小会大幅降低

注意:回收的过程中磁盘占用会先上升后下降,请保证物理机的磁盘上空间足够再执行这个命令!! (推荐预留两倍当前虚拟磁盘大小)

我的 Ubuntu 22.04 直接从 82 GB 变成了 46 GB,整个人都清静了,简直 yyds


导出 OVF 清除原来占用的磁盘

VMware 有时候删除虚拟机快照出现错误,但是快照图标已经消失,导致无法再通过 VMware 删除该快照,造成文件残留,就这样越堆越多,无法清理

参考文章:三种方法给Vmware虚拟机占用空间清理瘦身 - 皎陽 - 博客园 (cnblogs.com)

这个方法属于杀手锏,在其他方法效果不大的时候使用,比较适用虚拟机空间极度需要清理的情况,将当前虚拟机另存为 OVF 文件,清空原有盘来节省空间

优点:可以释放大量空间
缺点:只能保留 VMware 虚拟机当前的状态和文件,丢失其他快照 (可以按需先转到某个快照再导出 OVF,这样就可以保留快照时的状态了。同样,会丢失其他快照的状态)

压缩 VM 磁盘文件2.png

导出后,直接使用 VMware 打开 OVF 文件即可

如果 OVF 可以正常开机使用,就可以把虚拟机之前的磁盘文件清空释放空间
如果虚拟机不正常,可以试试重新导出 OVF


合并 VM 多磁盘文件为单磁盘文件

在创建虚拟机时,若选择了将硬盘存储为多个文件,后续也可以将多个磁盘文件重新合并为单个文件

首先关闭虚拟机

硬盘存储为多个文件:

从物理机拖到Linux虚拟机中的文件消失了16.png

其中,有一个名字不带 s 的 vmdk 文件 Kali-2022.4.vmdk,大小比其他 vmdk 文件小很多:

从物理机拖到Linux虚拟机中的文件消失了17.png

这个文件是用来记录硬盘文件的拆分信息的,将多个硬盘文件联系在一起;而其他的带 s 的 vmdk 文件才是真正用来存储数据的硬盘文件

在 VMware Workstation 的安装目录下

使用 vmware-vdiskmanager.exe 程序对多个 VM 磁盘文件 vmdk 进行合并:

vmware-vdiskmanager.exe -r "不带 s 的 vmdk 文件路径" -t 0 "合并后新的单个 vmdk 磁盘文件的存放路径"

完成后显示:

  Convert: 100% done.
Virtual disk conversion successful.

合并后得到新的磁盘文件:

从物理机拖到Linux虚拟机中的文件消失了18.png

将之前 Kali 虚拟机目录下的 Kali-2022.4.vmdkKali-2022.4-s001.vmdk ~ Kali-2022.4-s013.vmdk 等等文件全部删除

将合并后的 Kali-2022.4.vmdk 文件移动到虚拟机目录下

无需做额外配置,直接开启虚拟机,可以正常开机

VM 中已经识别为单个硬盘文件:

从物理机拖到Linux虚拟机中的文件消失了19.png


拆分 VM 单磁盘文件为多磁盘文件

在创建虚拟机时,若选择了将硬盘存储为单个文件,后续也可以将单个磁盘文件重新拆分为多个文件

首先关闭虚拟机

在 VMware Workstation 的安装目录下

使用 vmware-vdiskmanager.exe 程序对单个 VM 磁盘文件 vmdk 进行拆分:

vmware-vdiskmanager.exe -r "vmdk 文件路径" -t 1 "拆分后新的 vmdk 磁盘文件的存放路径"