Disk shrink does not work on ESXi guests
EHLO everyone! My first post on the StackOverflow network :)
We're running some ESXi 5.0/vCenter infrastructure to host mainly Debian 6/amd64 guest systems with ext3 partitions and open-vm-tools
compiled from source per debian bug 471784.
Got an issue that is seen being raised all around the internet, but without a conclusive answer given anywhere.
When trying to shrink a thin-provisioned disk in independent-persistent mode, with no snapshots, parents, clones whatsoever, I consistently get the following error:
root@linux64:~# vmware-toolbox-cmd disk list
Shrink disk is disabled for this virtual machine.
Shrinking is disabled for linked clones, parents of linked clones,
pre-allocated disks, snapshots, or due to other factors.
See the User's manual for more information.
(By the way, what are the "other factors", and which of the ton of white papers and technical manuals is the User's manual?:)
I know that I can stuff the partitions with zeros (in fact, I do use shred -fuzn0
when deleting large files) then shut down the guest in question and use various methods like vmkfstools
, cloning or vMotioning disks around in thin-provision mode, etc, but all of them either incur the downtime penalty for the guest being shirnked, or result in an unwarranted moving of data between datastores and/or hosts.
And the answer is: No shrinking under ESX/ESXi (as of version 5).
The documentation reads:
IMPORTANT Shrinking disks is not allowed under the following circumstances:
The virtual machine is hosted on an ESX/ESXi server. ESX/ESXi Server can shrink the size of a virtual disk only when a virtual machine is exported. The space occupied by the virtual disk on the ESX/ESXi server, however, does not change.
The virtual machine has a Mac guest operating system.
You preallocated all the disk space to the virtual disk when you created it.
The virtual machine contains a snapshot.
The virtual machine is a linked clone or the parent of a linked clone.
The virtual disk is an independent disk in nonpersistent mode.
The file system is a journaling file system, such as an ext4, xfs, or jfs file system.
No wonder there is an option to shrink in VMWare Workstation but not in vSphere client connected to an ESXi or vCenter instance.
Solution 1:
http://www.vmware.com/pdf/vmware-tools-cli.pdf Page 13 :
Shrinking disks is not allowed under the following circumstances:
The virtual machine is hosted on an ESX/ESXi server. ESX/ESXi Server can shrink the size of a virtual disk only when a virtual machine is exported. The space occupied by the virtual disk on the ESX/ESXi server, however, does not change.
Solution 2:
Actually, there is a way to shrink a VM on ESXi, although you need to shut down the VM for it. Here's how:
-
Zero all unused space inside the VM:
dd if=/dev/zero bs=1048576 of=/zero ; sync ; rm /zero
Do the same with other mount points, swap partitions, etc.
Shut down the VM.
-
SSH to ESXi, and issue this command:
vmkfstools -K /vmfs/volumes/volumename/vmname/vmname.vmdk
This will take some time... vmkfstools "punches holes" inside your VMDK, e.g. deallocates all blocks that are filled with zeros, effectively shrinking your VMDK.