Virtualbox Backupskript für Windows

virtualboxWer in Virtualbox einen Windows-Gast automatisch backupen möchte, wird feststellen, dass das nicht völlig banal ist. Im Folgenden beschreibe ich, wie man ein regelmäßiges Backup der virtuellen Maschinen auf einem Windows-Host mit einem Windows-Gastsystem und Virtualbox realisiert.

So läuft’s in der Theorie

  • Den virtuellen Server per ACPI-Kommando herunterfahren
  • anschließend über das Vboxmanage-Tool den Server exportieren
  • und dann den Server wieder starten

Diese Theorie wird auf Google gefühlte 100 Mal wiederholt.

Vom Ende der Theorie

Virtualbox 4.2.6 ist derzeit das aktuellste, aber sicherlich nicht das stabilste Release dieser Software. Zumindest funktionierte bei mir der ACPI-Befehl über die Vboxmanage-Kommandozeile nicht und auch die Gasterweiterungen scheinen nicht ganz rund zu laufen. Doch sei’s drum – das ganze ist kostenlos und funktioniert ja im Prinzip. Machen wir also das Beste daraus.

So läuft’s in der Praxis

  • Die virtuellen Server werden per net use Befehl angesprochen und anschließend per Shutdown.exe heruntergefahren. Das ist komplett mit Windows-Bordmitteln möglich.
  • Anschließend werden die Server mit vboxmanage exportiert
  • und genauso wieder gestartet.

Backupskript für Windows

Hier der Entwurf für eine backup.bat Datei. Der virtuelle Server heißt „Server1“ und ist über die IP 192.168.1.10 zu erreichen.

net use \\192.168.1.10 /u:administrator passwort_des_administrators /persistent:no
shutdown -m \\192.168.1.10 -s -f
ping -n 7 -w 7000 192.168.2.1
"c:\Program Files\Oracle\VirtualBox\VBoxManage.exe" snapshot "Server1" take WeeklyBackup
del d:\vm_backup\server1*.*
"c:\Program Files\Oracle\VirtualBox\VBoxManage.exe" export "Server1" --output c:\vm_backup\server1.ovf &
"c:\Program Files\Oracle\VirtualBox\VBoxManage.exe" startvm "Server1" --type gui &

Erklärungen

Da Virtualbox und Windows es einem nicht immer einfach machen, folgt hier die Erklärung des Skripts im Detail.

net use \\192.168.1.10 /u:administrator passwort_des_administrators /persistent:no

Es wird eine Windows-Netzwerk-Verbindung zur virtuellen Maschine hergestellt. Die Anmeldung des Skripts erfolgt mit Administratorrechten, damit wir die Maschine herunterfahren dürfen. Das Admin-Passwort muss leider im Klartext in der Datei hinterlegt werden. Wem das zu heikel ist, der legt sich auf der virtuellen Maschine einen separaten User an, der explizit nur zum Herunterfahren des Rechners berechtigt ist.

shutdown -m \\192.168.1.10 -s -f

Die virtuelle Maschine erhält den Befehl, sich herunterzufahren. Der Timeout für diese Aktion beträgt standardmäßig 30 Sekunden. Anschließend werden alle Tasks hart beendet – die Maschine fährt zuverlässig herunter, koste es was es wolle 😉

ping -n 7 -w 7000 192.168.2.1

Hier ist es wichtig, auf eine nicht vorhandene IP Adresse im lokalen Netz zu ping’en. Dies ist ein Workaround der bezweckt, dass das Skript einfach 7 * 7000 Millisekunden (49 Sekunden) an dieser Stelle stehen bleibt. Diese Zeit muss so gewählt sein, dass sie zum Herunterfahren der Maschine ausreicht.
Ab Windows7 hätte hier auch das Sleep-Kommando stehen können, doch mit Ping läuft’s auch auf älteren Host-Systemen. Zweck dieses Befehls ist, dass die virtuelle Maschine genügend Zeit zum Herunterfahren hat, ehe die nächsten Befehle ausgeführt werden.

"c:\Program Files\Oracle\VirtualBox\VBoxManage.exe" snapshot "Server1" take WeeklyBackup

Mit diesem Befehl wird ein Snapshot des Servers angelegt. Das ist für das Backup zwar nicht zwingend notwendig, aber falls der Server irgendwann mal ein Problem haben sollte, kann man ihn so kurzerhand zurücksetzen ohne gleich ein ganzes Image importieren zu müssen.

del d:\vm_backup\server1*.*

Das Backup vom letzten Durchlauf wird gelöscht – Ordnung muss sein.

"c:\Program Files\Oracle\VirtualBox\VBoxManage.exe" export "Server1" --output c:\vm_backup\server1.ovf &

Die virtuelle Maschine wird als Standalone-Datei exportiert und abgelegt. Diese Datei kann nun per FTP-Skript oder automatisch bspw. mit Duplicati auf einen anderen Rechner verschoben werden. Damit ist das Backup erstellt.

"c:\Program Files\Oracle\VirtualBox\VBoxManage.exe" startvm "Server1" --type gui &

Zu guter Letzt wird die virtuelle Maschine wieder gestartet.

Aufgabenplaner einrichten

Das Backup-Skript kann nun im Windows-Aufgabenplaner hinterlegt werden, so dass täglich oder wöchentlich eine Sicherungskopie der virtuellen Maschine angelegt wird. Wie man ein solches Skript im Aufgabenplaner hinterlegt, habe ich hier beschrieben.

Falls es klemmt…

Ich habe einige Stunden damit verbracht, den oben beschriebenen Weg zum laufen zu bringen. Gefühltermaßen versteckt sich hinter jeder Kommandozeile eine neue Fehlerquelle. Hier einige Antworten auf die besonders schönen Fehler:

  • Keine Verbindung zum Windows-Client möglich, Fehler 53
    Auf dem Client muss das Microsoft-Netzwerk aktiviert sein.
    Der „Server“-Dienst muss gestartet sein.
  • Der Windows-Client will nicht herunterfahren
    Über den Gruppenrichtlinien-Editor muss dem Client klargemacht werden, dass der angemeldete User tatsächlich die Maschine herunterfahren darf. Sollte bei Admin-Accounts i.d.R. kein Problem sein, es sei denn, man will ein Windows Server-Betriebssystem (2003, 2008, 8) herunterfahren. Und so rüstet man die nötigen Rechte nach.
  • Beim Exportieren der virtuellen Maschine erscheint die Fehlermeldung Code CO_E_SERVER_EXEC_FAILURE (0x80080005) – Server execution failed (extended info not available). VBoxManage.exe: error: Most likely, the VirtualBox COM server is not running or failed to start.
    Dieses besonders prachtvolle Fehlerexemplar konnte ich dadurch lösen, dass ich den Prozess nicht mit Administratorrechten ausführte. Wer das Backup-Skript mit dem Aufgabenplaner ausführt, darf also nicht den Haken bei „Mit höchsten Privilegien ausführen“ setzen. Diese einigermaßen seltsame Einschränkung gilt offenbar auch für andere Virtualbox-Befehle.

Dieser Artikel ist Teil meines Homecloud-Server-Projekts.


2 Kommentare zu “Virtualbox Backupskript für Windows

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.