After some time qcow2 images tend -especially after taking snapshots- to grow bigger and bigger, even bigger than the maximum size specified at creation time.
QEMU provides a tool called virt-sparsify (install
libguestfs-tools package in CentOS 7) that can effectively make a virtual machine disk thin provisioned (space is not preallocated, only the actual space needed is used).
virt-sparsify has a nice number of options, the most interesting one is
--in-place, it tells QEMU to shrink the volume in place without requiring any addition space.
BEFORE RUNNING THE COMMAND POWER OFF THE VIRTUAL MACHINE
[root@CentOS vm]# time virt-sparsify --in-place image.qcow2
Trimming /dev/sda1 ...
Trimming /dev/sda2 ...
Clearing Linux swap on /dev/sda3 ...
Sparsify in-place operation completed with no errors.
libguestfs utilities cannot be installed, QEMU’s own images manipulation tool comes to rescue; it does not shrink the image file
in-place but it is still better than nothing.
Zerofill the all the unused space in the virtual disk drive prior to running
qemu-img convert command to maximize its effectiveness.
[root@CentOS vm]# dd if=/dev/zero of=/mytempfile && rm /mytempfile
[root@CentOS vm]# time qemu-img convert -O qcow2 image.qcow2 image-shrinked.qcow2
Be aware that the command
ls does not understand sparseness, use
df -h or
du -sh to check the actual space used before and after the shrinking operation.