Ich habe ein kleines Script geschrieben, um eine virtuelle Maschine mit Arch-Linux automatisch zu updaten und auf Funktionalität zu überprüfen. Dazu wird der Befehl "pacman -Syu" zunächst nur auf einem qemu-overlay-Image ausgeführt, der Webserver neu gestartet und wenn er dann noch online ist wird das Overlay-Image commitet. Wenn hingegen beim Update-Prozess ein Fehler auftrat, so dass die virtuelle Maschine danach nicht mehr bootet, bzw. gar keinen Webserver mehr bereitstellt hat man immernoch das Original qemu-Image als Fallback-Lösung. So hat man einen Kompromiss aus einem top-aktuellen Webserver einerseits und einer hohen Stabilität andererseits. Hier das Script:
#!/bin/bash
QEMUIMAGE="harddrive-archlinux.img"
BOOTWAIT=30 # 30 Sekunden auf Booten warten
# https://bian-fu.net/doku.php?id=wissensdatenbank:it:webserver_testen
# 1. Overlay Image erzeugen
qemu-img create -b $QEMUIMAGE -f qcow2 overlay.ovl
# 2. Updates einspielen
qemu-system-x86_64 -hda overlay.ovl -m 256 -enable-kvm -redir tcp:8022::22 -redir tcp:8080::80 &
sleep $BOOTWAIT
ssh -p 8022 root@localhost 'pacman -Syu --noconfirm'
ssh -p 8022 root@localhost 'reboot'
# 3. Funktionalität überprüfen
sleep $BOOTWAIT
WEBSERVER="localhost"
# Der netcat Befehl darf erst ausgeführt werden, wenn der Webserver bereits gestartet ist. Sonst ist der Webserver niemals erreichbar.
WEBSERVER_TEST=$(echo -e "GET / HTTP/1.0\n" | nc $WEBSERVER 8080)
if [ "$WEBSERVER_TEST" != "" ]; then
echo "Der Webserver \"$WEBSERVER\" ist erreichbar."
FAIL=0
else
echo "Der Webserver \"$WEBSERVER\" ist NICHT erreichbar."
echo "Overlay-Datei wird NICHT commitet."
FAIL=1
fi
# 4. Commit Overlay Image
if [ $FAIL == 0 ]; then
qemu-img commit -f qcow2 overlay.ovl
rm overlay.ovl
fi
# 5. Beenden
ssh -p 8022 root@localhost 'shutdown -h now'
Falls man qemu in einer virtuellen Bridge betreibt, kann man den -redir Parameter auch weglassen. Er ist dafür gedacht, dass man sich auf die virtuelle Maschine per ssh einloggen kann bzw. den Webserver aufrufen kann. Ach ja, Vorraussetzung für die SSH Verbindung ist, dass man ein Public-Key-Verfahren verwendet. Wie das geht wird hier nicht erläutert.