KVM - Kernel-based Virtual Machine

Virtuelle Maschinen braucht das Land!

Wohin mit der Rechenleistung moderner Computer? Ein Möglichkeit wäre, mehrere Betriebssystem auf einem Computer parallel laufen zu lassen. Das spart jede Menge Hardware und Installationsaufwand, z.B. beim Testen von neuen Programmen oder kompletten Systemen.

KVM - das unbekannte Wesen

KVM ist Bestandteil des Linux-Kernels ab Version 2.6.20 und aus einem Kernel-Modul und einer Userspace-Programm, dass auf dem Quellcode von QEMU basiert. KVM hat mich persönlich wegen seiner Geschwindigkeitsvorteile überzeugt. Na gut, andere Leute haben vielleicht andere Erfahrungen gemacht. :-)

Wer hat, der kann!

KVM unterstützt die Virtualisierungstechniken von AMD (AMD-V oder SVM) und Intel (Intel VT). Dafür benötigen Sie einen modernen Prozessor. Ob, dass System die Technik unterstützt, können Sie mit folgendem Befehl feststellen:

   $ egrep '^flags.*(vmx|svm)' /proc/cpuinfo

   Die Antwort sollte etwa so aussehen:

   flags        : fpu vme de pse tsc msr pae mce cx8 apic 
                  sep mtrr pge mca cmov pat pse36 clflush 
                  dts acpi mmx fxsr sse sse2 ss ht tm pbe 
                  nx lm constant_tsc pni monitor ds_cpl vmx 
                  est tm2 ssse3 cx16 xtpr lahf_lm
   flags        : fpu vme de pse tsc msr pae mce cx8 apic 
                  sep mtrr pge mca cmov pat pse36 clflush 
                  dts acpi mmx fxsr sse sse2 ss ht tm pbe 
                  nx lm constant_tsc pni monitor ds_cpl vmx 
                  est tm2 ssse3 cx16 xtpr lahf_lm

Falls Sie alle Voraussetzungen erfüllen, dann sollten Sie noch jede Menge RAM haben, ab 1 GB wird empfohlen.

Zutaten

Ausgangslage hier: Debian/Etch
Linux-Kernel 2.6.25.17
Userspace-Programm: kvm (kvm-72)
eine Life-CD: hier soll getestet werden: Sidux
qemu ist auch installiert

Kochanleitung

Hier kommt eine Intel-CPU zum Einsatz: das Kernelmodul kvm-intel sollte sich problemlos laden lassen; falls das funktioniert kann man es auch in /etc/modules eintragen.

Nach der Installation von kvm sollte eine Gruppe kvm vorhanden sein. In diese Gruppe kommen alle User, die die virtuellen Maschinen starten dürfen.
Hinweis: meine virtuelle Maschinen sind zentral abgelegt...

So, nun noch schnell eine virtuelle Festplatte anlegen,
dorthin wird später Sidux installiert:

	  
   $ qemu-img create -f qcow sidux.img 10G
   Formating 'sidux.img', fmt=qcow, size=10485760 kB
   $ ls -l sidux.img
   -rw-r--r-- 1 user user 41008 2007-03-09 18:21 sidux.img

Dieses Image lege ich zentral unter /srv/kvm/img ab.
Die Gruppenberechtigung wird auf kvm geändert und die Gruppe bekommt Schreibrechte.

   $ ls -l /srv/kvm/img/sidux.img
   -rw-rw-r-- 1 root kvm 2991284224 2007-03-09 13:33 /srv/kvm/img/sidux.img

(Die Dateigröße stimmt in diesem Beispiel nicht, weil Sidux ja schon installiert ist...)

Das Image der Sidux-Life-CD wurde schon auf der Festplatte abgelegt:

   $ ls -l /srv/kvm/iso/sidux-2007-1.iso
   -r--r--r-- 1 root root 726722560 2007-02-21 19:52 /srv/kvm/iso/sidux-2007-1.iso

Okay, nun machen wir mal einen ersten Startversuch:

   $ kvm -hda /srv/kvm/img/sidux.img -cdrom /srv/kvm/iso/sidux-2007-1.iso -boot d: -m 512 -no-kvm

Eine kleine Erklärung dazu:

  • -hda /srv/kvm/img/sidux.img - legt die erste Festplatte fest
  • -cdrom /srv/kvm/iso/sidux-2007-1.iso - legt die CDROM fest
  • -boot d: - legt fest, dass von der CD gebootet wird
  • -m 512 - legt den RAM-Speicher der verwendet wird in MB fest
  • -no-kvm - ist hier notwendig, dazu später mehr
  • -smp 2 - Anzahl der CPUs, falls Sie 2 Pinguine beim Booten sehen wollen :-), funktioniert z.Z. nur beim Booten von CD

So, bis hierhin sollte alles funktionieren; Sidux startet; der Installer ist nicht zu übersehen - installieren Sie Sidux (geht sehr schnell)

Nach der Installation starten Sie Sidux von der virtuellen Platte:

   $ kvm -hda /srv/kvm/img/sidux.img -m 512 -no-kvm

Das sollte auch funktionieren. Jetzt kümmern wir uns darum, dass die Option -no-kvm wegkommt. Gehen Sie in die GRUB-Konfiguration von Sidux und kommentieren Sie die Zeile gfxmenu (hd0.1)/boot/message.
Nun können Sie ohne die Option -no-kvm starten. Das sieht dann zwar nicht mehr so schön aus, aber die KVM sollte jetzt voll unterstützt werden.
(ist wahrscheilich ein Bug mit gfxmenu)

Nachspeise

Noch mal nachgedacht: durch meine zentrale Ablage muss der mehrfache Start der gleichen Maschine noch verhindert werden. Die Maschinen sollen sich auch untereinander alle im gleichen Netzwerk unterhalten können.

Ich habe für jede virtuelle Maschine ein Startskript angelegt.
Hinweis: diese Startskript ist ohne spezielle Vorbereitungen nicht lauffähig!
(Das Beispiel ist in dieser Form nur für eine grafische Oberfläche geeignet.)

Die Lage des Skriptes und seine Berechtigungen:

   $ ls -l /srv/kvm/script/kvm_sidux_start.sh
   -rwxr-x--- 1 root kvm 572 2007-03-09 13:16 /srv/kvm/script/kvm_sidux_start.sh

Und so sieht es aus:

   #!/bin/bash
   
   TMP_LOCK_DIR="/tmp/kvm_sidux_lock"
   
   if [ -d "${TMP_LOCK_DIR}" ]; then
     xmessage -center "${TMP_LOCK_DIR} found, $0 already running?"
     exit 1
   fi
   
   if [ ! -d "${TMP_LOCK_DIR}" ]; then
     mkdir "${TMP_LOCK_DIR}" || exit 1
   fi
   
   USERID=`whoami`
   INTERFACE=`sudo /usr/sbin/tunctl -b -u $USERID`
   
   kvm -hda /srv/kvm/img/sidux.img \
    -m 512 \
    -net nic,vlan=0,macaddr=52:54:00:12:34:56,model=e1000 \
    -net tap,vlan=0,ifname=$INTERFACE,script=/etc/kvm/kvm-bridge \
    -localtime
   
   sudo /usr/sbin/tunctl -d $INTERFACE &> /dev/null
   
   if [ -d "${TMP_LOCK_DIR}" ]; then
     rm -rf "${TMP_LOCK_DIR}"
   fi
   
   ### eof

Vor dem Start von KVM wird eine temporäres Verzeichnis angelegt. Der Check auf dieses Verzeichnis soll einen doppelten Start der Maschine verhindern. Der temporäre Verzeichnis wird nach Beenden von KVM wieder gelöscht. Ist vielleicht nicht optimal, funktioniert aber...

Was passiert noch? Ein tap-Interface wird angelegt und nach Beendigung von KVM wieder entfernt.

Ein Hinweis zur Angabe der Mac-Adresse: wenn man mehrere virtuelle Maschinen einsetzt, kann es passieren, dass z.B. ein Router nicht damit klarkommt, dass mehrere Maschinen die gleiche Mac-Adresse verwenden. Bei mehreren Maschinen also bitte gleich verschiedene gültige Mac-Adressen vergeben. Wenn ein Ping nicht mehr sauber ankommt, sollten Sie an diesen Tipp denken. Um Probleme reichtzeitig zu erkennen, empfiehlt sich der Einsatz einer guten Monitoring-Software. Das wird um so wichtiger, wenn die virtuellen Maschinen ohne grafische Oberfläche starten.

Abbildung: Überwachung von KVM
Probleme sofort sichtbar: Monitoring mit Nagios

Wichtige Vorbereitungen für dieses Skript!

  1. Installation des Paketes bridge-utils
  2. Umstellung der Netzwerk-Konfiguration
  3. Anlegen eines Skriptes /etc/kvm/kvm-bridge
  4. Sudo-Konfiguration einrichten

Das Paket bridge-utils benötigen wird zur Einrichtung und Konfiguration einer Netzwerk-Bridge.

Die Datei /etc/network/interfaces habe ich wie folgt eingerichtet:

   # The loopback interface
   # automatically added when upgrading
   auto lo
   iface lo inet loopback
   
   # The bridge network interface(s)
   auto br0
   iface br0 inet static
     address 192.168.1.108
     network 192.168.1.0
     netmask 255.255.255.0
     broadcast 192.168.1.255
     gateway 192.168.1.1
     dns-nameservers 192.168.1.1
     bridge_ports eth0
     bridge_fd 9
     bridge_hello 2
     bridge_maxage 12
     bridge_stp off
   # eof

Das Netzwerk auf dem Host sollte damit noch funktionieren. Die Optionen kann jeder anpassen, wie er gerne möchte...

Die ausführbare Datei /etc/kvm/kvm-bridge beinhaltet folgendes:

   #!/bin/sh
   sudo /sbin/ifconfig $1 0.0.0.0 promisc up
   sudo /usr/sbin/brctl addif br0 $1
   # eof

Nun richten wir noch die Sudo-Konfiguration mittels visudo ein.
Beispiel:

   %kvm ALL=NOPASSWD:/sbin/ifconfig
   %kvm ALL=NOPASSWD:/usr/sbin/brctl
   %kvm ALL=NOPASSWD:/usr/sbin/tunctl

Hier wird der Gruppe kvm voller Zugriff auf die Programme ifconfig, brctl und tunctl gegeben.
(Sicher kann man die Einträge zusammenfassen, aber für mich ist das so übersichtlicher.)

Nach dem Start der virtuellen Maschine über /srv/kvm/script/kvm_sidux_start.sh, sollte jetzt in Sidux Ihr lokales Netzwerk zur Verfügung stehen. Falls auf dem Router dhcp eingerichtet ist brauchen Sie nichts tun. Andernfalls sollten Sie das Netzwerk von Hand einrichten.

Eine weitere modifizierte Variante ...

Wir verzichten auf den Skriptaufruf von /etc/kvm/kvm-bridge,
und richten die Bridge gleich im Skript ein (vereinfacht):

   USERID=`whoami`
   INTERFACE=`sudo /usr/sbin/tunctl -b -u $USERID`

   # neues Interface der Bridge hinzufügen
   sudo /usr/sbin/brctl addif br0 $INTERFACE
   # Interface hochfahren
   sudo /sbin/ifconfig $INTERFACE up
    
   kvm -hda /srv/kvm/img/sidux.img -m 512 \
    -net nic,vlan=0,macaddr=52:54:00:12:34:56 \
    -net tap,vlan=0,ifname=$INTERFACE

   # Nach Beenden der KVM, Interface stoppen und entfernen
   sudo /sbin/ifconfig $INTERFACE down
   sudo /usr/sbin/tunctl -d $INTERFACE &> /dev/null

Die Sudo-Konfiguration mittels visudo könnte man noch verfeinern.
Beispiel:

   # Gruppe kvm darf Bridge br0 für KVM modifizieren
   %kvm ALL=NOPASSWD:/usr/sbin/tunctl
   %kvm ALL=NOPASSWD:/usr/sbin/brctl addif br0 tap*
   %kvm ALL=NOPASSWD:/sbin/ifconfig tap* up
   %kvm ALL=NOPASSWD:/sbin/ifconfig tap* down

KVM mit nographic im Hintergrund starten

Da ich meine virtuellen Maschinen nicht immer interaktiv starten und stoppen möchte, habe ich mir ein paar Skripte gebastelt, die meine KVM automatisch beim Hochfahren des Systems im Hintergrund mit der Option nographic starten. Wird das Host-System runtergefahren, werden auch alle KVM runtergefahren. Getestet wurde erstmal nur mit Debian, neuerdings gibt es aber auch eine experimentelle Möglichkeit WIN-XP in der KVM gesittet herunterzufahren.

Das Programm ist - wie immer - nur über mein Debian Repository erreichbar.
Hier ist der Eintrag für /etc/apt/sources.list:

### kvm-helper for Debian GNU/Linux
deb http://www.alinux.de/debian/ ./

Anregungen, Wünsche und Fehlermeldungen bitte im Userforum melden.

Die kleine Anleitung erhebt keine Anspruch auf Exaktheit oder Richtigkeit!

Hier noch ein Link dazu: http://kvm.qumranet.com/

... und Tschüß!