[opensuse-virtual] QCOW2 resizing magic explained
QCOW2 resizing magic explained Hello all, I don't know about you but Ipersonally have been rather irritated about the fact that in the past you could not shrink a qcow2 image online while the virtual machine was running. I've found that this is already possible for some time and actually rather simple to do. Now don't get your hopes up to high there's still a few drawbacks that you will have to deal and live with (for now). The first drawback being that unless you already use a (virtio-)scsi device you will need to reinstall your vm or migrate your vm-images to (virtio-)scsi, depending on your config you should decide which is the least hassle.
From now on to keep the virt-install commands readable I will use a couple variables containing values that are always the same and of no influence on the resizing of the images.
Another requirement is that you have a running kvm setup with a bridge. BRIDGE=br0 CDISO=/path/to/installation.iso STORAGEDIR=/var/lib/libvirt/images DISKIMAGE=$STORAGEDIR/disk.qcow2 STDOPTS="--name=testmachine --ram=1024 --vcpus=1 --os-type=linux --os-variant=opensuse12" STDOPTS="$STDOPTS --network bridge=$BRIDGE --disk $CDISO,device=cdrom" So the first requirement is to create a virtual machine with a scsi or virtio-scsi controller. Issue the following commandto create a vm using a scsi disk image virt-install $STDOPTS \ --disk $DISKIMAGE,bus=scsi Issue the following command to creat a vm with a virtio-scsi disk. (add the Virtualization repo if you want this in opensuse) virt-install $STDOPTS \ --disk $DISKIMAGE,format=qcow2,size=16,bus=scsi \ --controller scsi,model=virtio-scsi Now choose the installation of your personal liking and wait for it to complete. Once the machine is done you need to change a few entries in the fstab. In my example I have created an installation using an lvm partition schema. My opensuse installation produced the following fstab: /dev/system/swap swap swap defaults 0 0 /dev/system/root / ext4 acl,user_xattr 1 1 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-0-part1 /boot ext4 acl,user_xattr 1 2 /dev/system/home /home ext4 acl,user_xattr 1 2 The discard option must be added to all filesystems that support it. /dev/system/swap swap swap defaults 0 0 /dev/system/root / ext4 discard,acl,user_xattr 1 1 /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-0-0-0-part1 /boot ext4 discard,acl,user_xattr 1 2 /dev/system/home /home ext4 discard,acl,user_xattr 1 2 Save and close the fstab Now since I've used an lvm based partition schema I need to explain to lvm to use the discard option. Edit /etc/lvm/lvm.conf find the line that says : issue_discards = 0 and change it to : issue_discards = 1 save and close the file We have almost reached our goal. Shut down the vm Edit the virtual machine settings with virsh. virsh edit testmachine and find the entry for your harddisk. Mine looks like this : <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/disk.qcow2'/> <target dev='sda' bus='scsi'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> add the discard=unmap option to line 2 : <disk type='file' device='disk'> <driver name='qemu' type='qcow2' discard='unmap'/> <source file='/var/lib/libvirt/images/disk.qcow2'/> <target dev='sda' bus='scsi'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> save and close the file check the file size of the disk image ls -als /var/lib/libvirt/images/disk.qcow2 1222792 -rw------- 1 root root 1252261888 Feb 7 15:14 /var/lib/libvirt/images/disk.qcow2 start the vm log in as root on the vm and create a big file dd if=/dev/urandom of=/bigfile count=1024k bs=1k sync check the file size of the disk image ls -als /var/lib/libvirt/images/disk.qcow2 2271560 -rw------- 1 qemu qemu 2327248896 Feb 7 15:24 /var/lib/libvirt/images/disk.qcow2 delete the bigfile from the vm rm /bigfile sync and check the file of the disk image again ls -als /var/lib/libvirt/images/disk.qcow2 1222984 -rw------- 1 qemu qemu 2327248896 Feb 7 15:27 /var/lib/libvirt/images/disk.qcow2 Notice the first number has shrunk back to a smaller size, the second is still big. This is normal behaviour, the image is sparse therefore it claims to be already 2.2G while it only consumes 1.2G on the hd. You now have a virtual disk image that automatically shrinks and grows depending on the usage. But wait, I said there were multiple drawbacks and I've named only one yet. So here are the others. You might have already deduced that this causes fragmentation of the images on your drive. This is one of the drawbacks that you will have to live with. Next there is the performance impact from doing this, but there is a solution to this. You can do the discarding manually, or in a cronjob at a time that pleases you. To do the manual discards, remove the discard option from the /etc/fstab. If you use lvm leave it in /etc/lvm/lvm.conf. Now simply issue in the vm: fstrim <mountpoint> In my example this would be fstrim / fstrim /home fstrim /boot And for the last catch, older kernels do not pass the discard option properly when using qcow2 images. rhel6.5 and lower don't support this, I haven't tested this in sles11 yet. However they do support it on raw images (as do the newer kernels). You will just have to live with the fact that your snapshots of those systems do not support discarding. Well that is all there is to it Oh p.s. on a side note and completely unrelated to this subject. Did you know there has been a new qcow release ? Probably not since it has been done rather quietly. Check http://wiki.qemu.org/Features/Qcow3 But what would you care, and I would say performance. So to add a nice finishing touch to the vm creation using qcow3...errr I mean qcow2 compat=1.1 mode (I'm so happy they took care not to confuse people) issue the following two commands : qemu-img create -f qcow2 -o preallocation=metadata,lazy_refcounts=on,compat=1.1 \ $DISKIMAGE 16G virt-install $STDOPTS \ --disk $DISKIMAGE,bus=scsi --controller scsi,model=virtio-scsi If you want to check what qcow version an image is, you will need a hex editor to look at the first eight bytes of the qcow image. Byte number eight will be a three when using qcow3 and a two for qcow2. Glad to see they made it easy to tell the difference....<cough> <cough> Enjoy your new fully dynamic qcow image resizing. Rob Verduijn -- To unsubscribe, e-mail: opensuse-virtual+unsubscribe@opensuse.org To contact the owner, e-mail: opensuse-virtual+owner@opensuse.org
participants (1)
-
Rob Verduijn