VMware 虚拟机收缩磁盘文件

VMware 虚拟机的磁盘文件( .vmdk )会随着使用而越来越大,在虚拟机内部删除文件后,也并不会收缩,要手工回收才行,甚至还要多做些其他步骤。

以 VMware® Workstation 17 Pro 为例,其他版本大概没有多少差别。

虚拟机磁盘文件,并不是把整个整个磁盘一股脑的镜像到文件,而是一般为稀疏文件。写入文件时,对于实际有数据的部分,才真正写入到文件,一般是一块一块的写入磁盘文件中,对于全部是0的块,则不写,只记录个偏移位置。删除数据时,一般并不对抹除数据区,而只是标记了索引记录。于是删除文件后,直接回收磁盘文件,并不能让缩小文件,经常完全没有效果。原因就是没有抹掉数据区,于是”清零“是是回收磁盘空间前必须要做的步骤。

对于Windows虚拟机,好像可以直接回收空间,通过 “菜单 – 虚拟机 -管理 – 清理磁盘”,或者 ”虚拟机设置 – 磁盘实用工具 – 压缩“ 实现。大概是 vmware 针对 NTFS 做了专门的支持。

而对于 linux ,好像是就必须手工抹除数据区,即 磁盘清零

Linux 下,通用性最好的方法,dd if=/dev/zero of=./zero.fill bs=1M 直到满,再 rm /zero.fill

对支持 TRIM 的虚拟磁盘,还可以 fstrim -av

只读挂载或单用户模式下,还可以 zerofree /dev/sda1

Windows 下,推荐 Sysinternals SDelete, 使用 -z 参数,举例 sdelete.exe -z C:

或新建一个全部为 0 的文件,比如,fsutil file createnew zero.bin <大小> 直到磁盘满,再删除。这与 dd 是同样的逻辑,也可以通过 cygwin 等工具使用 dd ,不过经验上效果远远远远不如 Linux 下,

一个实际使用场景的记录:

单磁盘,有两个分区 sda1(/boot) 及 sda2(逻辑卷),希望再加一块磁盘 sdb ,把整个逻辑卷到 sdb 上,sda 只保留一个 sda1,回收掉 sda2,并把 sda磁盘缩小,sdb上逻辑卷也减小。 这与上面所述稍有不同。

一系列 lvm 操作,使用 fdisk 对 sdb 分区,仅一个 sdb1 ,  逻辑卷操作,pvcreate /dev/sdb1, vgextend gp0 /dev/sdb1, lvcreate … , pvmove -n /dev/vg0/root /dev/sda2 /dev/sdb1, vgreduce, pvremove… (实际上还收缩逻辑卷,对于 ext4 在救援模式下直接收缩,xfs 的先 xfsdump 备份到文件,删除lv,再建小容量 lv ,xfsrestore 回去)

对 sda2 清0, 这里并不是写到某个普通文件,而是直接写到 sda2 设备文件上,因为要清的是整个分区 dd if=/dev/zero of=/dev/sda2 bs=4096000

fdisk 删除 sda2 ,vmware 里收缩磁盘。

 

Last Updated on 2025/10/23

发表评论

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理