Virtio block device is a para-virtualized device for kvm guest. It is different from normal emulated hard drive, because it is simply faster. This small how-to is about how to make a disk para-virtualized and boot from it.
- create a disk and install os to it by appending "-hda <your_disk_image>" to your virtual machine
- in your guest os, upgrade kernel to 2.6.25 which contains virtio_* drivers. or ubuntu 8.04 also has it.
- in guest os, change /boot/grub/device.map from "(hd0) /dev/sda" to "(hd0) /dev/vda"
- in guest os, change /boot/grub/menu.list from "root=/dev/sda1" to "root=/dev/vda1", if you are using UUID, then no need to do this step.
- enable para-virtualization by changing "-hda <your_disk_image" to "-drive file=<your_disk_image>,if=virtio,boot=on"
you may experience this error while grub is booting. I solved it by making the /boot the first partition and make it 32MB.
I have problem to boot from qcow2 format image, it will hang while kernel booting. you may convert your disk image to raw format by "qemu-img convert -f qcow2 <your_disk_image> -O raw <a_new_location>".
Booting with lilo
You must add this to your lilo.conf:
boot=/dev/vda disk=/dev/vda bios=0x80 max-partitions=7
and after your image clausule change:
where vda1 is your boot partition
Updating the guest initramfs with the virtio driver
If you are hosting a debian guest then you may want to update its initramfs with the virtio driver as explained in Using VirtIO NIC
Windows driver installation is a bit tricky.
- In your guest, download the Windows driver
- Stop the machine and create a new image that you will add as a second disk
kvm-img create -f qcow2 fake.qcow2 1G
- Start the machine. You will be prompted to install the driver. This is enough to allow to boot on the virtio disk
kvm -drive file=windows.qcow2,if=ide,boot=on -drive file=fake.qcow2,if=virtio ...
- Restart the machine, but with the virtio driver on the first disk
kvm -drive file=windows.qcow2,if=virtio,boot=on
- You will be prompted once again to install the driver.