Using IVS with libvirt (KVM)
Using IVS with libvirt (KVM)
Prerequisites
Follow the instructions at the IVS Installation Guide to get IVS installed and running.Â
Installation
Install the packages required for kvm
sudo apt-get install kvm libvirt-bin virtinst
Remove the bridge created by libvirt
(Do this step only if you are exclusively using xenon for your virtual network topology on this host.)
sudo virsh net-destroy default; sudo virsh net-autostart \--disable default
Create the following script (call it "/etc/ivs-ifup") which adds the TAP interface to the xenon switch when machines are started
#!/bin/sh /sbin/ifconfig $1 0.0.0.0 up /usr/sbin/xenon-ctl add-port indigo $1
Make the configuration scripts executable
sudo chmod+x /etc/ivs-ifup
Add the following configuration snippet to the bottom of "/etc/apparmor.d/abstractions/libvirt-qemu" to configure apparmor to allow the necessary network configuration changes when virtual machines are started/stopped.
/etc/apparmor.d/abstractions/libvirt-qemu
# needed to make network changes capability net_admin, #network configuration scripts/binaries /usr/sbin/ivs-ctl rmix, /sbin/ifconfig rmix, /etc/ivs-ifup rmix,
Reload apparmor to apply the configuration changes.
sudo /etc/init.d/apparmor reload
Add the following configuration snippet to the bottom of /etc/libvirt/qemu.conf to allow libvirt to make networking changes.
user = "root" group = "root" cgroup_device_acl = [ "/dev/null", "/dev/full", "/dev/zero", "/dev/random", "/dev/urandom", "/dev/ptmx", "/dev/kvm", "/dev/kqemu", "/dev/rtc", "/dev/hpet","/dev/net/tun", ]
Restart libvirt-bin to apply the changes
sudo /etc/init.d/libvirt-bin restart
Configure any virtual machines with the following interface statement under <devices> to attach them to the IVS switch.
sudo virsh edit <vmname>
<interface type='ethernet'> <script path='/etc/ivs-ifup'/> </interface>
Here is a full sample of an XML configuration for a VM running on a IVS switch.
<domain type='kvm'> <name>newvm2</name> <uuid>cd4e4b03-487d-6583-0b95-d4a41cc2503b</uuid> <memory>262144</memory> <currentMemory>262144</currentMemory> <vcpu>1</vcpu> <os> <type arch='x86_64' machine='pc-1.0'>hvm</type> <boot dev='hd'/> </os> <features> <acpi/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/home/administrator/newvm2/tmpRVK6eg.qcow2'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' unit='0'/> </disk> <controller type='ide' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> </controller> <interface type='ethernet'> <mac address='52:54:00:d6:48:b1'/> <script path='/etc/ivs-ifup'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'> <listen type='address' address='127.0.0.1'/> </graphics> <video> <model type='cirrus' vram='9216' heads='1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </video> <memballoon model='virtio'> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </memballoon> </devices> </domain>
After starting your virtual machines, you should be able to see the tap interfaces connected to the switch with ivs-ctl show.
~$ ivs-ctl show indigo: kernel lookups: hit=0 missed=390 lost=12 kernel flows=0 ports: 0 indigo (internal) rx: packets=12 bytes=720 errors=0 dropped=0 tx: packets=0 bytes=0 errors=0 dropped=0 1 tap0 rx: packets=35 bytes=4213 errors=0 dropped=0 tx: packets=35 bytes=4402 errors=0 dropped=0 2 tap1 rx: packets=35 bytes=4402 errors=0 dropped=0 tx: packets=35 bytes=4213 errors=0 dropped=0 1023 gre (gre) rx: packets=0 bytes=0 errors=0 dropped=0 tx: packets=0 bytes=0 errors=0 dropped=362