Thursday, February 19, 2009

Using kvm/qemu with virtio

Using kvm/qemu with virtio

Since kernel 2.6.25, linux kernel have virtio support, virtio is different
with full device virtualization, it doesn't have to behave as the realhardware,
the guest driver actually knows it is running under a virtual environment, thus
in theory it's should be faster and more efficient than the full virtualized
hardware.

Newer qemu (svn version, not 0.9.1) have virtio support, recent kvm also have
virtio support.

In order to utilize virtio, you will need a recent kernel (> 2.6.25) with
virtio (variants) support, and a recent qemu/kvm.

How to use Virtio

* Get kvm version >= 60 (or recent svn verstion qemu)
* Get Linux kernel with virtio drivers for the guest

Get Kernel >= 2.6.25 and activate (modules should also work, but take care of initramdisk)
+

CONFIG_VIRTIO_PCI=y (Virtualization -> PCI driver for virtio devices)
+

CONFIG_VIRTIO_BALLOON=y (Virtualization -> Virtio balloon driver)
+

CONFIG_VIRTIO_BLK=y (Device Drivers -> Block -> Virtio block driver)
+

CONFIG_VIRTIO_NET=y (Device Drivers -> Network device support -> Virtio network driver)
+ CONFIG_VIRTIO=y (automatically selected)
+ CONFIG_VIRTIO_RING=y (automatically selected)
+ you can safely disable SATA/SCSI and also all other nic drivers if you only use VIRTIO (disk/nic)

As an alternative one can use a standard guest kernel for the guest > 2.6.18 and make use sync backward compatibility option

Backport and instructions can be found in kvm-guest-drivers-linux.git
* Use model=virtio for the network devices and if=virtio for disk
Example

qemu/x86_64-softmmu/qemu-system-x86_64 -boot c -drive file=/images/xpbase.qcow2,if=virtio,boot=on -m 384 -net nic,model=virtio -net tap,script=/etc/kvm/qemu-ifup

Another Example of using virtio:

I use qemu/kvm to install a distro like arch linux, I can't use virtio at the
begining because the official arch linux kernel (archlinux 2009.2, kernel
2.6.28.5-2) can not boot via virtio devices. so:

qemu-img create -f qcow2 arch-x86.img 1G
sudo kvm -cdrom archlinux-2009.02-core-x86_64.iso -hda arch-x86.img -boot 'd' -net nic,model=e1000 -net tap

NOTE: root partition mount point in /etc/fstab should be UUID or LABEL based
because later the device interface (sda->vda) might be changed. ie:

LABEL=/arch / ext4 noatime 0 0

after finishing archlinux installation, we could use our own kernel to utilize
virtio, ie:

cd ~/linux/linux-2.6

build a kernel with VIRTIO support.

sudo kvm -kernel arch/i386/boot/bzImage -append 'root=/dev/vd1 ro console=ttyS0,115200' -drive file=~/arch-x86.img,if=virtio,boot=on -m 256 -net nic,model=virtio -net tap

refs:
http://kvm.qumranet.com/kvmwiki/Virtio
http://wiki.libvirt.org/page/Virtio

No comments:

Post a Comment