How to decrease the size of a KVM virtual machine disk image?

How do you decrease or shrink the size of a KVM virtual machine disk?

I allocated a virtual disk of 500GB (stored at /var/lib/libvirt/images/vm1.img), and I'm finding that overkill, so now I'd like to free up some of that space for use with other virtual machines. There seems to be a lot answers on how to increase image storage, but not decrease it. I found the virt-resize tool, but it only seems to work with raw disk partitions, not disk images.

Edit: I'm using an LVM with an Ext4 formatted partition.

Edit: GParted screenshot showing my LVM parition layout. I need to do a lot more then just resize the filesystem. I know of no safe way to resize an LVM. And please don't tell me to use pvresize. Despite its name, it does not support resizing LVMs.

GParted screenshot

I did try sudo pvresize /dev/vda5, but it just says physical volume "/dev/vda5" changed but doesn't actually reduce the size.

I tried start parted to manually set the partition size (very dangerous), but doing print all just gives me the error "/dev/sr0 unrecognised disk label".

Edit: By following these instructions, I was able to successfully shrink both my logical and physical volumes (although I had to remember to activate and deactivate lvm before and after certain commands, which the instructions omit.

Now GParted is showing 250G of unallocated free space. How do I remove this from the KVM disk image and give it back to the underlying hypervisor?


Thanks to those who posted, but your answers were way too vague to be of any help.

After hours of Googling, I finally found a guide(link redacted) providing step-by-step instructions on how to shrink my filesystem, logical volumes, and physical volumes. The trick that most guides miss is the need to actually delete the physical partitions, and recreate them with the correct size, because parted is unable to resize lvm partitions.

I then found this documentation on qemu-img, which explains how to shrink a raw-formatted virtual disk image by running:

sudo qemu-img resize /var/lib/libvirt/images/myvm.img 255G

What you need to do,

  • Take a backup
  • Shrink the file system(s) *don't do this on a live system, I recommend using a live cd.
  • Create a new disk image of desired size.
  • Run a live os, with the new and old images attached as (virtual) hard disks (not mounted)
  • Create the new partition(s) the same size as the resized partitions on the old disk
  • Use dd to mirror the data to the new partition.
  • You'll possibly need to purge / regenerate grub(2) to boot successfully.

This can be accomplished through both GUI and CLI

Resources

  • fdisk partitioning - http://linux.die.net/HOWTO/Partition/fdisk_partitioning.html
  • dd man page - http://linux.die.net/man/1/dd

Tools

  • gparted ( link omitted due to Spam, not enough rep )