I see vmkfstools -punchzero quite a bit as one of the search terms leading to my other posts about vmkfstools, so thought it would be worthwhile giving this useful feature its own post.
Thin provisioned disks allow you to assign storage to virtual machines, without actually using up that space on the datastore. For example, if you allocate a 20GB disk as Thin, then it’s size on the datastore will start at zero bytes, and will grow as files are written to the disk up to a maximum of 20 GB. So, if I copy a 5 GB file to the disk, then the thin provisioned disk will grow to ~5 GB. However, if I then delete the 5GB file, the virtual disk does not shrink, it remains at 5 GB. This is where vmkfstools -K or vmkfstools –punchzero comes in handy.
The best way to demonstrate this is with a real example. We’ll start with a VM with a single thin provisioned disk. Looking at its size on the datastore (remember to use ‘du’ rather than ‘ls’ to get the true size) we can see that it is currently using 1.9 GB of space on the datastore:
# du -ah vma-flat.vmdk 1.9G vma-flat.vmdk
We’ll add some data to the thin provisioned disk. As this is a linux virtual machine I’ll use the following method to create a 500Mb file. The following command needs to be run within the guest OS:
dd if=/dev/zero of=test.file bs=500000000 count=1
Going back to the host, the virtual disk has now grown to 2.3GB as expected:
# du -ah vma-flat.vmdk 2.3G vma-flat.vmdk
Following deletion of the file in the guest OS, the virtual disk remains at 2.3GB. In order to reclaim that 500Mb we can use vmkfstools -K or vmkfstools –punchzero. However, before we can run that command we need to shutdown the virtual machine to release the lock the host has on the .vmdk file.
Once the VM is shutdown we can run:
# vmkfstools --punchzero vma.vmdk vmfsDisk: 1, rdmDisk: 0, blockSize: 1048576 Hole Punching: 19% done.
It will take a little while depending on the size of the virtual disk. Once complete, the virtual disk has returned to its original size:
# du -ah vma-flat.vmdk 1.9G vma-flat.vmdk
And, confirmed in the datastore browser:
Bear in mind that you can also achieve a similar result by using svMotion to move a thin provisioned disk, however this remains useful if you prefer to leave the disk in its current location, albeit with the downside of having to shutdown the virtual machine in order to reclaim the space.