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

Wednesday, February 18, 2009

Gentoo QEMU/KVM ethernet bridging nano HOWTO

Qemu could use tun/tap to emulate bridged network, so the guest could have a real ip as host. ie:

[code]qemu -net nic -net tap[/code]

or

[code]kvm -net nic -net tap[/code]

Under gentoo, in order to use that, we have to:

* kernel requirements:

CONFIG_BRIDGE, CONFIG_TUN must be included (y/m) CONFIG_KVM_INTEL/CONFIG_KVM_AMD must be selected in order to use kvm

CONFIG_IP_PNP and CONFIG_ROOT_NFS must be included to use nfsroot/diskless mounted filesystem. Host side NIC driver must also be compiled into kernel (y).

* user space application:

bridge-utils, qemu/kvm

Networking interface layout:

br0: bridge interface, binded with real IP address for network access. eth0: interface of br0, no IP. tapX: interface of guest, no IP.

NOTE: switch interfaces don't have an IP address.

Network configuration in gentoo:

*) make sure NetworkManager/dhcdbd is not started, network interface must not be managed by NetworkManager. ie:

[code]

$ cd /etc/init.d/ $ ln -s net.lo net.eth0 $ ln -s net.lo net.br0 $ rc-update add net.eth0 default $ rc-update add net.br0 default

[/code]

*) /etc/conf.d/net configration, ie:

[code]

bridge_br0="eth0" config_br0=("dhcp") config_eth0=("null")

[/code]

You have to insert some modules if neccessary like:

[code]

$ modprobe tun kvm_amd

[/code]

Start using qemu/kvm:

[code]

$ kvm -kernel bzImage -append "root=/dev/nfs rw nfsroot=192.168.2.xxx:/home/gentoo-x86 ip=on" -net nic,model=e1000 -net tap

[/code]

Note: kvm have it's own network startup/stop scripts /etc/kvm/kvm-if{up,down} in gentoo, if you're using qemu, you have to write your own /etc/qemu-if{up,down} scripts, just copying /etc/kvm/kvm-if{up,down} it's essential.

.refs:

http://www.linuxfoundation.org/en/Net:Bridge gentoo's /etc/conf.d/net.example

1st post of my blog ;)

very happy to become a blogger ;-)