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

68,152

Solution 1

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

Solution 2

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

Tools

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

Solution 3

This worked really well for me. It compresses and shrinks the 0 blocks in the disk image. The image will expand over time as it's over written to again.

qemu-img convert -c -O qcow2 vmdisk.qcow2 vmdisk-comp.qcow2
Share:
68,152

Related videos on Youtube

Cerin
Author by

Cerin

Updated on September 18, 2022

Comments

  • Cerin
    Cerin almost 2 years

    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?

    • Ansgar Wiechers
      Ansgar Wiechers over 11 years
      Do you actually need to downsize the virtual disk, or would compacting it suffice? You could do the latter with something like qemu-img -O qcow2 vm1.img vm1-compact.qcow2.
    • Cerin
      Cerin over 11 years
      @AnsgarWiechers, Yes, I still need to use the disk, and I've allocated far more space than I'll ever need.
  • Michael Hampton
    Michael Hampton over 11 years
    He is trying to make the image smaller, not larger.
  • Cerin
    Cerin over 11 years
    The hard part is "Shrink the filesystem". I'm using an LVM, which no tool I've found support resizing. Not even a GParted Live CD.
  • Farooq Knights
    Farooq Knights over 11 years
    I think this covers it, I've not used it so please report good or bad tcpdump.com/kb/os/linux/lvm-resizing-guide/shrink.html
  • Ansgar Wiechers
    Ansgar Wiechers over 11 years
    There are 2 main points to observe: 1) Do things in order (first shrink the filesystem, then shrink the partition, then shrink the disk). 2) The procedure/tools for resizing a filesystem depend heavily on the actual filesystem (which the OP chose not to reveal). The article @daxroc posted won't work for filesystems other than ext[234].
  • Cerin
    Cerin over 11 years
    @daxroc, I need to reduce both the logical and physical volumes. Your link only covers reducing the logical volume.
  • David Corsalini
    David Corsalini over 11 years
    agreed. backup, new disk, restore is safest and easiest
  • Farooq Knights
    Farooq Knights over 11 years
    @Cerin You would still need to mirror the re-sized partitions to a new image to reclaim the free space. You can use dd to accomplish this.
  • Cerin
    Cerin over 11 years
    @daxroc, That's a bit complicated solution. See my post below about simply using qemu-img resize.
  • Farooq Knights
    Farooq Knights over 11 years
    Yes and no, Once you have completed the task a few times it does get easier / mostly can be scripted. Will definitely try qemu-img (+1)
  • Louis Loudog Trottier
    Louis Loudog Trottier over 6 years
    qemu-img is a great tools when it comes to working with disk images for kvm. 3 years later your link seems broken, here the manual page from die.net linux.die.net/man/1/qemu-img
  • oemb1905
    oemb1905 about 5 years
    And if anyone wants this convenience, and is stuck with (does not want) a .qcow2 VM, convert it first qemu-img convert -f qcow2 -O raw image.qcow2 image.img and then you can run the above command.
  • Community
    Community over 2 years
    Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.