====== KVM - Convert qcow2 to raw ======
Convert qcow2 disk images to raw disk images for performance.
The **qcow2** disk format has some decent features like encryption, compression and copy to write support. However, the compression and the copy processes make it quite a bit slower than raw disk images. Sometimes you want to convert the disk images so that the VM will perform better.
===== Benchmark =====
For me it has a performance boost. Using a RAID 1 setup with two 5900 RPM disks and the **deadline** on the host and the **noop** scheduler without caching on a raw image in the guest resulted in a boost over the default **deadline** scheduler on a qcow2 image on the guest:
Test command:
dd if=/dev/zero of=test bs=64k count=16k conv=fdatasync
Default Ubuntu 12.04 vmbuilder created vm on a qcow2 image without caching and with the deadline scheduler in the VM:
1073741824 bytes (1.1 GB) copied, 658.396 s, 1.6 MB/s
The same VM, disk image converted to raw image without caching and using the noop scheduler in the VM:
1073741824 bytes (1.1 GB) copied, 13.646 s, 78.7 MB/s
That's quite a performance boost. The KVM host has the following result with the **dd** command:
1073741824 bytes (1.1 GB) copied, 10.4034 s, 103 MB/s
===== Converting the image =====
I'll convert the disk image for the example vm **vm1**. Change the name and disk paths for your setup.
First shut down the VM:
virsh shutdown vm1
Then convert all the disk images using this command for each disk image:
qemu-img convert /var/lib/libvirt/images/vm1/ubuntu-kvm/tmp20ePgc.qcow2 /var/lib/libvirt/images/vm1/ubuntu-kvm/tmp20ePgc.raw
Edit the VM config:
virsh edit vm1
Change the **disk** section to point to the new raw image:
Change the lines **** and **** to **** and ****. Like so:
<disk type='file' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<source file='/var/lib/libvirt/images/vm1/ubuntu-kvm/tmp20ePgc.raw'/>
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
That's it. Start the VM:
virsh start vm1
If it all works, remove the qcow2 image:
rm /var/lib/libvirt/images/vm1/ubuntu-kvm/tmp20ePgc.qcow2
===== Disk scheduler =====
To change the default disk scheduler in your VM, you can use the following command:
echo $scheduler > /sys/block/$device/queue/scheduler
To check the current scheduler:
cat /sys/block/sda/queue/scheduler
Output:
noop [deadline] cfq
Here the **deadline** scheduler is being used. To change it:
echo noop > /sys/block/sda/queue/scheduler
Now the **noop** scheduler is being used:
cat /sys/block/sda/queue/scheduler
[noop] deadline cfq
Remember to add this command to /etc/rc.local to make it survive a reboot. On ubuntu you can also define it in /etc/default/grub. Change GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" to GRUB_CMDLINE_LINUX_DEFAULT="quiet splash elevator=noop" and run an update-grub2 to make it permanent