Boot from virtio block device

From KVM
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Introduction

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.

Linux

Steps

  1. create a disk and install os to it by appending "-hda <your_disk_image>" to your virtual machine
  2. in your guest os, upgrade kernel to 2.6.25 which contains virtio_* drivers. or ubuntu 8.04 also has it.
  3. in guest os, change /boot/grub/device.map from "(hd0) /dev/sda" to "(hd0) /dev/vda"
  4. 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.
  5. enable para-virtualization by changing "-hda <your_disk_image" to "-drive file=<your_disk_image>,if=virtio,boot=on"

note: current debian lenny default kernel (2.6.26-2-amd64) will not give any output when running "dmesg | grep virtio"

Error 18

you may experience this error while grub is booting. I solved it by making the /boot the first partition and make it 32MB.

qcow2

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:

root=/dev/vda1

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 XP

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.