K4YT3X
A place where I post my notes and interesting stories.
将 VMWare 虚拟机精简分配的磁盘空间返还给宿主机

在给虚拟机分配磁盘时,为了不让分配的磁盘立马占用大量宿主机空间,可以使用精简分配(thin provisioning)。虚拟机的磁盘文件大小会随着磁盘中内容的增多而增加,但是却不会随着文件的删除而减少。这是因为操作系统在删除文件时并不会将文件完全删除(用 0 复写删除的内容),而是将该磁盘空间标记为已删除。为了让这部分空间返还给宿主机,仅仅删除是不够的。这篇文章将介绍如何把虚拟机精简分配的磁盘空闲的空间返还给宿主机。

在进行操作之前,请切记有快照的磁盘是不能够被 vmware-vdiskmanagervmkfstools 工具调整的。*

概念

要想返还未使用的空间,首先 VM 必须用 0 复写所有未使用的空间,然后宿主机将用 VMWare 自带的工具(vmkfstools 或者 vmware-vdiskmanager)消减内容为 0 的磁盘空间。

Windows VM 复写未使用空间

在 Windows VM 中,可以使用 SysInternals 工具中的 SDelete 来用 0 复写磁盘中未使用的空间。

1
sdelete.exe -z [盘符]

例如,如果要复写 C 盘中的内容的话,则该执行:

1
sdelete.exe -z C:

Linux 复写未使用空间

在 Linux 中,可以使用从 /dev/zero 中不断读取 0 并且写入到一个文件中直到把文件系统占满为止的方式来复写未使用的空间。最后会将该文件删除来标记空间为已删除。注意以下命令均应该以 root 权限执行,尤其是复写 root 分区的操作。

第一种方式为使用 cat 命令:

1
2
3
4
5
# 复写 root 分区
cat /dev/zero > /zero.fill;sync;sleep 1;sync;rm -f /zero.fill

# 复写挂载点的分区
cat /dev/zero > /[挂载点]/zero.fill;sync;sleep 1;sync;rm -f /[挂载点]/zero.fill

第二种方式为使用 dd 命令:

1
2
3
4
5
# 复写 root 分区
dd if=/dev/zero of=/zeroes && rm -f /zeroes

# 复写挂载点的分区
dd if=/dev/zero of=/[挂载点]/zeroes && rm -f /[挂载点]/zeroes

使用 VMWare 工具重新调整磁盘大小

在将未使用的空间归零以后,宿主机必须使用 VMWare 自带的硬盘工具重新自动调整精简分配磁盘的大小来缩小磁盘体积。

如果宿主是 VMWare Workstation Pro,则可以使用以下命令:

1
vmware-vdiskmanager -k [虚拟机磁盘].vmdk

如果宿主是 ESXi,则可使用以下命令:

1
vmkfstools -K [虚拟机磁盘].vmdk

参考文章