Durch die Umstellung auf VDE ergaben sich neue Herausforderungen. Die Versionen von libvirt unterstützen zum Releasezeitpunkt von Ubuntu Hardy und Intrepid leider noch kein VDE. Daher hatte ich in einem vergangenen Artikel kurz beschrieben, wie man KVM-Instanzen auch manuell starten kann.

Nutzt man hingegen KVM in einer produktiven Umgebung, so benötigt man recht bald ein Init-Skript, dass zum einen die Instanzen in geordneter Reihenfolge starten und stoppen kann, zum anderen eine Möglichkeit, ACPI-events wie z.B. Powerbutton-pressed zu senden. Das folgende Skript und eine Beispielverzeichnisstruktur zeigen, wie man das mit der Bash lösen kann.

Das Skript orientiert sich an einem gewöhnlichen sysvinit-Konzept. Ich habe mich entschieden, Start- / Stoppskripten innerhalb von /etc/kvm zu platzieren. Dort muss zu erst ein Ordner instances erstellt werden. In diesem dann ein Ordner rc

mkdir -p /etc/kvm/instances/rc

Innerhalb von /etc/kvm/instances werden alle Gast-Skripten abgelegt. Diese müssen in der Form gastname (beliebiger Name ohne Extension) vorliegen.

Im nächsten Schritt werden innerhalb des rc-Ordners die Gäste verlinkt. Hier ein Beispiel meines Test-Servers:


lrwxrwxrwx 1 root root    9 2008-12-09 09:01 K87www -> ../www
lrwxrwxrwx 1 root root    8 2008-12-09 09:01 K88mx -> ../mx
lrwxrwxrwx 1 root root    9 2008-12-09 09:00 K89dns -> ../dns
lrwxrwxrwx 1 root root    8 2008-12-09 09:00 K90db -> ../db
lrwxrwxrwx 1 root root    8 2008-12-09 09:00 S00db -> ../db
lrwxrwxrwx 1 root root    9 2008-12-09 09:00 S01dns -> ../dns
lrwxrwxrwx 1 root root    8 2008-12-09 09:00 S02mx -> ../mx
lrwxrwxrwx 1 root root    9 2008-12-09 09:01 S03www -> ../www

Wie man sieht, gibt es S und K Skripten. S steht hierbei für Start und K für Stopp (Kill).

Diese symbolischen Links regeln die Reihenfolge, in der Gäste später gestartet und beendet werden. Dies ist bei mir recht wichtig, da ich nicht alle Gäste synchron hochfahren möchte. Grund ist, dass die Datenbank und der Nameserver essentielle Voraussetzungen für weitere Gäste darstellen.

Ein Gastskript hat nun in etwa folgende Struktur:


#!/bin/sh

vdekvm -m 256 -smp 2 \
  -name www \
  -boot c \
  -drive file=/dev/mapper/vg01-kvm3--disk,if=virtio,boot=on \
  -net nic,vlan=0,macaddr=00:16:3e:bf:e6:be,model=virtio \
  -net nic,vlan=1,macaddr=00:16:3e:bf:e6:bd,model=virtio \
  -net vde,vlan=0,sock=/var/run/vde2/vde0.ctl \
  -net vde,vlan=1,sock=/var/run/vde2/vde1.ctl \
  -k de \
  -vnc 127.0.0.1:2 \
  -monitor tcp:127.0.0.1:2023,server,nowait \
  -serial none \
  -parallel none \
  -localtime \
  -daemonize > /dev/null 2>&1

# vim: ts=2 sw=2 expandtab

In der aktuellen Version kann kvm oder der Wrapper vdekvm genutzt werden. Das Skript erkennt dies automatisch.

Wichtige Punkte sind hier der Gastname und die -monitor Option. -serial, -parallel und -localtime sind optional.

Das folgende Skript ist nun das abschließende init-Skript, welches den Start aller oder einzelner Gäste und Beendigung vice versa durchführt.

WICHTIG: Das Skript kann im Regelfall nur als Benutzer “root” ausgeführt werden! Bei Ubuntu also einfach mal ein sudo -i absetzen und weiter geht´s.

Achtung! Ich entwickle das Skript immer noch weiter. Also einfach mal von Zeit zu Zeit hier schauen, ob es eine neue Version gibt.

Hier der Download-Link des Skripts

Da auch Urs inzwischen viel an diesem Script gearbeitet hat, stelle ich hier seine Version zum Download bereit: KVM.zip

Auf die genauen Details möchte ich nicht hinweisen. Grob gesagt arbeitet das Skript über die PIDs der einzelnen Gäste und kümmert sich ebenfalls um verwaiste vdekvm-Wrapper-Skripten.

Wer interesse hat oder Fragen, kann hier ja wie immer gerne Kommentieren. Ich freue mich über jede Anregung.

Kleines Beispiel mit telnet zur Verwaltung einer VM:

Beispiel:
$ # ./kvm-manage monitor db
use telnet to monitor VM db at: 127.0.0.1:2023

$ # telnet 127.0.0.1 2023
Dann “help” tippen, um eine Liste der Kommandos von qemu zu erhalten

Man kann das Script übrigens auch nach /etc/init.d vershieben. Bindet man es beispielsweise unter Ubuntu wie folgt ein

update-rc.d kvm-manage defaults 90 00

so werden die Gäste auch beim Starten/Herunterfahren sauber prozessiert.

Viel spaß und Danke für Anregungen.