Is there any way to shrink qcow2 image without converting it raw?
I cannot convert it to raw because I don't have disk space enough for raw image.
Is there any way to shrink qcow2 image without converting it raw?
I cannot convert it to raw because I don't have disk space enough for raw image.
Noop conversion (qcow2-to-qcow2) removes sparse space:
qemu-img convert -O qcow2 source.qcow2 shrunk.qcow2
You can also try add compression (-c
) to the output image:
qemu-img convert -c -O qcow2 source.qcow2 shrunk.qcow2
Before running above command be sure to shutdown the VM. After you are satisfied with the result, you can rename shrunk.qcow2 to original name your VM config wants.
Try virt-sparsify
- it will zerofill the unused blocks in the image and then deduplicate the zeroes.
I use virt-sparsify
:
virt-sparsify /path/to/source.qcow2 --compress /path/to/output.qcow2
I have been successfully using this procedure many times now. In short, first in the virtual guest fill all free space on all partitions with zeroes:
dd if=/dev/zero of=zerofile bs=1M
When done, empty the disk cache with sync
, remove the zerofile(s) and shut down the guest. On the host side convert the image (raw to qcow2 in this example):
qemu-img convert -f raw -O qcow2 guest.img guest-copy.qcow2
This will automatically sparsify the image. Also remember to update the vm definition file if the image file suffix is changed.
A benefit of this method over virt-sparsify
is that in this method the guest can be up while the zeros are written, and hence the downtime is shorter. If you can afford a longer downtime, then use virt-sparsify
, as it takes care of the whole process with just one command, and also gives useful feedback during the process.
First, shrink the partition & filesystem from inside the VM. Windows guests can do this from Disk Management. Linux can do this with resize2fs and fdisk. If you are not comfortable with this process use a bootable ISO like gparted instead.
When you are done there should be unused space AT THE END of the disk. For example, in Windows this is what is looks like to have 11MB of free space at the end of the disk (in a real example you should have more than 11MB):
Now that we have moved all your data to the front of the disk we are going to chop off the end. You should be 100% sure you are not about to chop off real data. Some tools count GB/GiB differently so you should probably give yourself some padding (ex shrink partition by 60GB then chop off 50GB). You can always re-grow the partition after the chop.
This command will resize myhd.qcow2
to 200GB, chopping off any data that comes after the first 200GB:
qemu-img resize --shrink myhd.qcow2 200G