Hyper-V Sicherung mittels Powershell Script
Sicherung ist eines der meist vernachlässigsten und dennoch wichtigsten Aufgaben in der IT. Hand aufs Herz, nachdem man eine virtuelle Maschine laufen hat, kann es schon mal vorkommen das man das Sichern vergisst. Damit das in unseren Projekten nicht passiert, haben wir nach einer Lösung gesucht, die es uns mit Bordmitteln ermöglicht, ein konsistentes Backup einer Hyper-V VM zu fahren. Vorweg aber etwas das uns sehr am Herzen liegt:
Da Daten und deren Sicherungen für Unternehmen einen existenziellen Wert darstellen, möchten wir hier ausdrücklich darauf hinweisen, dass wir für die hier bereitgestellten Skripte und Methoden keinerlei Haftung übernehmen und Sie diese auf eigene Gefahr einsetzen.
Wie sieht nun unsere Methode aus? Hyper-V bringt seit der ersten Version die Möglichkeit mit sich eine VM zu exportieren. Bei diesem Vorgang werden die kompletten Daten, d. h. die Platten (VHDs), die Snapshots (falls vorhanden) und die Konfiguration, in einem Format in ein Verzeichnis kopiert, so dass diese jederzeit auf einen anderen Host kopiert und wieder importiert werden können. Daraus kann sich ein Problem ergeben: Da die Daten kopiert werden, und das nur auf einer Platte des Hosts passieren kann (keinem Netzlaufwerk), benötigt die Maschine mindestens den gleichen freien Plattenplatz, wie die gesamte VM belegt.
Weiterhin kann die VM beim Exportvorgang nicht laufen, das heißt sie ist entweder heruntergefahren (was wir präferieren) oder sie ist zumindest gespeichert. Diese Ausfallzeit der VM kann, je nach Größe der VHDs und Snapshots, schon einige Minuten dauern. Als Beispiel dauert der Export unseres Exchange Server mit ca. 80 GB um die 30 Minuten. Natürlich möchten wir den Exportvorgang nicht von Hand anstoßen, sondern automatisieren. Deswegen haben wir uns ein PowerShell Script geschrieben, das mittels Aufgabenplaner in regelmäßigen Interwallen diesen Exportvorgang durchführt. Wenn Sie möchten kopiert dann dieses Script, nach Abschluss des Exportvorgangs, die Daten auf einen beliebigen Netzwerkpfad, damit die Daten nicht nur auf dem Host liegen.
Hier der grobe Ablauf des Scripts:
- Maschine herunterfahren oder schlafen legen
- Exportvorgang auf lokalen Datenträger
- Maschine starten oder aufwecken
- Gegebenenfalls den Export auf Netzwerkfreigabe kopieren
Damit unser PowerShell Script funktioniert, benötigen wir die PSHyperv Library die James O’Neill entwickelt und unter CodePlex (Download unter http://www.codeplex.com/psHyperV) frei zur Verfügung stellt. Achtung: die aktuelle Version funktioniert nur mit der PowerShell V2, allerdings auf beiden Hyper-V Varianten. Zum reibungslosen Installieren der Library sind folgende Schritte vorab durchzuführen:
- Sie laden das ZIP-Archive in ein Verzeichnis (z.B. C:\Temp) herunter
- Sie wenden das Sysinternal Tool “streams” an, um die Kenzeichnung, dass die Datei aus dem Internet geladen wurde (“Zone.Identifier”), zu entfernen
- Sie entpacken das Archive in einem temporären Verzeichnis (z.B. c:\Temp)
Danach führen Sie die Installation des Library durch: Rechtsklick auf das “install.cmd” Script und auswählen “Als Administrator ausführen”. Jetzt werden Sie gefragt, ob Sie “.Net Framework 2” und “PowerShell” installiert haben. Ist das nicht der Fall, dann brechen Sie bitte die Installation ab und holen dieses nach. Erfüllen Sie alle Voraussetzungen, dann drücken Sie “Enter” und das Script kopiert die Library und nimmt alle erforderlichen Einstellungen vor. In dem Screenshot sehen Sie zwei Fehler, die auf einer nicht Core Installation auftreten. Diese Fehler können Sie ignorieren und bestätigen einige weitere Male die Installationsschritte.
Nach erfolgreicher Installation sollte ein Powershell-Fenster aufgehen, indem Sie die Installation mit dem PowerShell Befehl:
get-command –module HyperV
überprüfen können.
Nach der erfolgreichen Installation der PsHyperV Bibliothek laden Sie unser PowerShell Script “HyperV-Backup.ps1” herunter (die aktuelle Version finden Sie am Ende des Artikels). Das ZIP Archive entpacken Sie in einem Verzeichnis z.B. “C:\Tools”. Auch hier sollten Sie das Sysinternal Tool “streams” anwenden, damit Powershell das Script ausführen kann.
Einen ersten Überblick über die Scriptoptionen erhalten Sie, wenn sie das Script nun aus einer Powershell (Achtung Administratoren Rechte erforderlich) mit dem Argument “-?” oder “-help” aufrufen z.B.: “C:\Tools\HyperV-Backup.ps1 –?”. Als Hilfestellung für den Einsatz gebe ich im folgenden einige Beispiele, wie Sie dieses Script benutzen können:
1. lokaler Export eines VMs ohne Neustart:
C:\Tools\HyperV-Backup.ps1 –VM W2K8-VM –ExportPath D:\Exports –TurnOff
Schritte die das Script ausführt:
- die VM "W2K8-VM” wird heruntergefahren
- Sie wird in das Verzeichnis C:\Exports\W2K8-VM exportiert und ein dort gegebenenfalls vorhandener alter Export gelöscht
2. lokaler Export eines VMs mit Startverzögerung um 60 Sekunden:
C:\Tools\HyperV-Backup.ps1 –VM W2K8-VM –ExportPath D:\Exports –StartDelay 60
Schritte die das Script ausführt:
- die VM "W2K8-VM” wird heruntergefahren
- Sie wird in das Verzeichnis C:\Exports\W2K8-VM exportiert und ein dort gegebenenfalls vorhandener alter Export gelöscht
- schlafe 60 Sekunden
- die VM wird wieder gestartet
3. lokaler Export einer VM mit Kopie auf Sicherungsserver:
C:\Tools\HyperV-Backup.ps1 –VM W2K8-VM –ExportPath
D:\Exports -RemotePath \\Storage\Sicherung$ –verbose
Schritte die das Script ausführt:
- die VM "W2K8-VM” wird heruntergefahren
- Sie wird in das Verzeichnis C:\Exports\W2K8-VM exportiert und ein dort gegebenenfalls vorhandener alter Export gelöscht
- die VM “W2K8-VM” wird wieder gestartet
- Der Export wird in die Netzwerkfreigabe “\\Storage\Hyper-V-Sicherungen$\W2K8-VM” kopiert und ein dort gegebenenfalls vorhandener alter Export gelöscht
- Die Export unter “D:\Exports\W2K8-VM” wird gelöscht
Zusätzlich gibt das Script, wegen des Schalters –verbose einige Informationen auf der Konsole aus.
4. Export einer VM die auf einem anderen System liegt mit Kopie auf Sicherungsserver:
C:\Tools\HyperV-Backup.ps1 –VM Debian1-VM –Server Hyperv5
–ExportPath D:\Exports -SaveState -RemotePath
\\Storage\Sicherung$ –verbose
Schritte die das Script ausführt:
- die VM "Debian1-VM” welche sich auf Hyper-V Host “Hyperv5” befindet wird gespeichert (Option
–SaveState) - Sie wird auf “Hyperv5” in das Verzeichnis D:\Exports\Debian1-VM exportiert und ein dort gegebenenfalls vorhandener alter Export gelöscht
- die VM “Debian1-VM” wird wieder aufgeweckt
- Der Export wird in die Netzwerkfreigabe “\\Storage\Hyper-V-Sicherungen$\Debian1-VM” kopiert und ein dort gegebenenfalls vorhandener alter Export gelöscht
- Die Export unter “D:\Exports\W2K8-VM” wird gelöscht
Zusätzlich gibt das Script wegen des Schalters –verbose einige Informationen auf der Konsole aus.
Automatisierung der “Sicherung” mit dem Aufgabenplaner
Um das Script automatisch zu einem bestimmten Zeitpunkt auszuführen, bietet sich der Aufgabenplaner an. Wichtig dabei ist, dass man den Befehl mit Administratoren Rechten ausführt. Im Folgenden findet man einige Screenshots wie man einen Task in der Aufgabenplanung anlegt.
Zuerst öffnen Sie die Aufgabenplanung (zu finden unter “Programme->Verwaltung”). Nach dem Start wählen Sie im mittleren Bereich durch Rechtsklick den Menüpunkt “Einfache Aufgabe erstellen…”aus.
Nun erscheint der Wizard, geben Sie als erstes dem Task einen Namen z. B. “Sicherung vaddc2” und entscheiden sich dann für ein Wiederholungsintervall und eine Ausführungszeit.Im folgenden Dialog wählen Sie “Programm starten” und nach “Weiter” müssen Sie nun unter dem Feld “Programm/Script” den Pfad der “Powershell.exe” eingeben (am einfachsten navigieren Sie nach Bestätigen des Button “Durchsuchen…” in das Verzeichnis “C:\Windows\system32\WindowsPowerShell\v1.0” und wählen dort die powershell.exe aus). Jetzt geben Sie im Feld “Argumente hinzufügen (optional)” das PowerShell Script mit Pfad an und ergänzen die benötigten Parameter (im Screenshot sehen Sie ein Beispiel).
Nach Bestätigen von “Weiter” gelangt man in den Dialog “Fertig stellen”. Hier ist wichtig, dass Sie das Feld “Bei klicken auf Fertig stellen, die Eigenschaften dieser Aufgabe öffnen” anhaken und dann erst auf “Fertig stellen” klicken.
Jetzt öffnen sich die Eigenschaften des Tasks und wir wählen im Reiter “Allgemein” die Einstellungen “Unabhängig von der Benutzeranmeldung ausführen” und “Mit höchsten Privilegien ausführen” aus. Dann wechseln wir auf den Reiter “Einstellungen” und verändern den Bereich “Aufgabe beenden, falls sie länger ausgeführt wird als” auf einen Wert der etwas länger als die Zeit ist, die unsere Job normeilerweise brauchen sollte.
Nach betätigen von “OK” werden jetzt noch die Credentials abgefragt, unter der der Task ausgeführt werden soll. Fertig: Sie haben den ersten Task zum automatischen Sichern angelegt.
Wenn Sie Anregungen, Kritik oder Verbesserungsvorschläge zu diesem Script haben, dann mailen Sie uns diese doch unter:
Falls dieses Script sehr nützlich für Sie ist, dann würden wir uns über eine positive Beurteilung unser Hyper-V PinPoint Lösung sehr freuen.
Download-Link:
Version 1.0: HyperV-Backup-V1.0.zip
Update 12. Juli 2011: Ergänzung der Parameter TurnOff (Ausschalten nach Export) und StartDelay (Startverzögerung um x Sekunden)
Version 0.91: HyperV-Backup-V0.91.zip
Update 14. Juli 2010: Fix beim Export eines Remote Systems. Es wurde beim Export einer Remote VM nicht der entfernte Export Pfad geprüft sondern fälschlicherweise der Lokale Pfad.
Version 0.9: HyperV-Backup-V0.9.zip
Erste Version