(Shrinking is still tedious, but at least it now works. Expanding is much simpler).
Look at the original disk image and decide what scope there is for shrinking it. In this case we could reduce the size by as much as 5.5GB, but for the purpose of this test I will only shrink the image from 10GB to 7GB.
$ virt-df /tmp/disk.img Filesystem 1K-blocks Used Available Use% disk.img:/dev/sda1 495844 29565 440679 6% disk.img:/dev/vg_f13x64/lv_root 7804368 2077504 5647596 27%
We can expand guests automatically, but virt-resize is much more conservative about the complex business of shrinking guests. You have to first use guestfish on (a copy of) the original disk to manually shrink the content of the partitions you want to shrink. In this case I manually shrink the root filesystem, its LV, and the PV.
$ guestfish -a /tmp/disk.img Welcome to guestfish, the libguestfs filesystem interactive shell for editing virtual machine filesystems. Type: 'help' for a list of commands 'man' to read the manual 'quit' to quit the shell ><fs> run ><fs> resize2fs-size /dev/vg_f13x64/lv_root 4G libguestfs: error: resize2fs_size: resize2fs 1.41.12 (17-May-2010) Please run 'e2fsck -f /dev/vg_f13x64/lv_root' first.
This known problem with resize2fs is documented.
><fs> e2fsck-f /dev/vg_f13x64/lv_root ><fs> resize2fs-size /dev/vg_f13x64/lv_root 4G ><fs> lvresize /dev/vg_f13x64/lv_root 4096 ><fs> pvresize-size /dev/sda2 6G libguestfs: error: pvresize_size: /dev/vda2: /dev/vda2: cannot resize to 191 extents as later ones are allocated.
This is unexpected: pvresize does not “defrag”. Perhaps in a future version of pvresize, pvmove or libguestfs we will add this, but for now I have to workaround it by deleting the troublesome swap partition, doing the resize, then recreating the swap.
><fs> lvremove /dev/vg_f13x64/lv_swap ><fs> pvresize-size /dev/sda2 6G ><fs> lvcreate lv_swap vg_f13x64 512 ><fs> mkswap /dev/vg_f13x64/lv_swap ><fs> exit
Now I can perform the resize operation itself using virt-resize. Note this is also a copy operation, since virt-resize never changes the source disk.
$ truncate -s 7G /tmp/disk2.img $ virt-resize --shrink /dev/sda2 /tmp/disk.img /tmp/disk2.img Summary of changes: /dev/sda1: partition will be left alone /dev/sda2: partition will be resized from 9.5G to 6.5G Copying /dev/sda1 ... [########################################################] Copying /dev/sda2 ... [########################################################]
After a test boot, the final guest worked(!)
Pingback: KVM Guest Disk Resizing | dimokaragiannis
Pingback: LVM ile yapılandırılmış XFS Disk Alanını Küçültmek – Catborise's Blog