Login
Newsletter
Werbung

Do, 12. Mai 2016, 15:00

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

Kommentare (Insgesamt: 9 || Alle anzeigen )
Re[2]: Wirklich? (Contra, Do, 23. Juni 2016)
Danke für den Artikel... (Peter Lustig, der Zweite, Di, 17. Mai 2016)
Re: Wirklich? (Pete, Sa, 14. Mai 2016)
Re: Wirklich? (Baldr, Fr, 13. Mai 2016)
RPC100 (spfef, Fr, 13. Mai 2016)
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung