Domainserver für kleines Geld und große Ansprüche
Start virtueller Maschinen bei Bedarf
Einige virtuelle Maschinen müssen nicht permanent laufen, sodass man diese nur bei Bedarf manuell starten will. Damit man sich dafür nicht immer auf der Basismaschine anmelden und das Startskript auf der Command-Line aufrufen muss, wurden Startmöglichkeiten mittels xinet und per wake-on-lan implementiert.
Mittels xinet
Bei der Ausgabe einer virtuelle Maschine über das Netzwerk, wobei die Daten mittels xinet ausgeben werden sollen, müssen diese per Standard-I/O angeboten und entgegengenommen werden. Qemu erlaubt es, die Ausgabe von VNC über einen Socket zu leiten. Dann können die Daten mittels socat
vom Socket abgeholt und die Eingaben wieder in den Socket eingespeist werden.
Ein beispielhafter Konfigurationseintrag für xinet ist im folgenden Listing aufgezeigt.
service vnc5 { disable = no type = UNLISTED port = 5905 flags = IPv4 server = /home/winxp/start-winxp.sh server_args = vnc socket_type = stream protocol = tcp user = winxp groups = yes wait = no }
Nach einem (re-)Start des xinetd-Servers lauscht dieser dann an dem angegebenen Port (hier 5905). Wenn sich über diesen Port ein Programm verbindet, wird die Zeile server
ausgewertet und das darin angegebene Startskript vom angegebenen user und mit der Option vnc
(steht hinter dem Eintrag server_args
) aufgerufen. Das zweite Listing zeigt den dafür zuständigen Teil des Startskripts:
function startVM ( ) { ( flock --nonblock 9 || exit 1 nohup kvm ${OPTIONS[@]} >/dev/null 2>&1 ) 9>"/var/lock/kvm-${IMG}.lock & # $IMG enthält den Namen der VM" } # $OPTIONS ist ein Array mit qemu/kvm Aufrufoptionen OPTIONS=("${OPTIONS[@]}" "-vnc unix:${VNC_SOCKET}" "-usbdevice tablet") startVM number_of_attempts="0" max_attempts="10" socket_missing="1" while [ "$socket_missing" -ne 0 -a "$number_of_attempts" -lt "$max_attempts" ] do socat -T 0.1 - "UNIX-CONNECT:${VNC_SOCKET}" >/dev/null 2>&1 socket_missing="$?" if [ "$socket_missing" -ne 0 ] then sleep 0.1 fi number_of_attempts="$(($number_of_attempts + 1))" done if [ "$socket_missing" -eq 0 ]; then socat – "UNIX-CONNECT:${VNC_SOCKET}" exit $? else exit 1 fi
Per Wake-On-Lan
Da eine virtuelle Maschine immer eine eindeutige MAC-Adresse benötigt, wenn sie im Netzwerk erreichbar sein soll, kam die Idee auf, eine virtuelle Maschine mittels Wake-On-Lan zu starten.
Natürlich lauscht eine ausgeschaltete virtuelle Maschine nicht am (virtuellen) Netzwerk, um ein Wake-On-Lan-Paket zu erkennen, sodass diese Aufgabe von einem Server – letztlich einem Proxy – übernommen werden musste. Ein Perl-Programm, abgeleitet aus dem Programm »wakeonlan«, horcht nun stellvertretend an der echten Netzwerkschnittstelle und schaut in einer Tabelle nach, wie der zugehörige Rechner heißt, dessen MAC-Adresse empfangen wurde. Steht ein entsprechender Eintrag in einer Konfigurationsdatei, so wird die entsprechende Maschine gestartet. Mit wake-on-lan können dann sowohl virtuelle als auch reale Maschinen eingeschaltet werden.
Systemstart
Selbstverständlich sollen Internetzugangsrechner, Router, OpenVPN-Rechner und der OwnCloud-Rechner beim Starten des Servers hochgefahren werden. Dazu wird ein entsprechendes Startskript benötigt. Dieses ruft die Startskripte der virtuellen Maschinen mit den Optionen auf, die in einem Array in /etc/kvm/virtualmachines.conf
hinterlegt wurden. Das Startskript der virtuelle Maschine verhindert, dass eine Maschine mehrfach gestartet werden kann.
Beenden einer virtuellen Maschine
Alle virtuellen Maschinen werden so gestartet, dass sie über einen Socket zur virtuellen Hardware, den qemu-monitor erreichbar sind. Über diesen können Informationen zur laufenden Maschine erfragt werden (z.B. durch eine Terminalanbindung mit unixterm
) oder Schnittstellen ein- beziehungsweise abgeschaltet werden. Die virtuelle Maschine selbst kann vom Monitor mittels des Befehls system_powerdown
beendet werden, was zum geordneten Herunterfahren der Maschine führt, so als ob man den Ein-/Ausschalter an einem physisch vorhandenen Rechner gedrückt hätte. Diese Möglichkeit nutzt das Skript des Systemstarts beim Shutdown aus, anstatt die virtuelle Maschine mit einem Kill-Signal zu beenden.
Man kann den system_powerdown
-Befehl auch per Commandline-Aufruf auf dem Basisrechner mittels socat
schicken. Der Befehl sieht dann wie folgt aus:
# echo system_powerdown | socat – UNIX-CONNECT:/var/run/kvm/socket_der_virtuellen Maschine