Hyper-V Backup: alle VMs mit einem Powershell-Skript sichern

Zur Zeit steht im Job die Umstellung des Hypervisors und damit die Migration aller virtuellen Maschinen an: alles, was auf dem vSphere Hypervisor läuft, soll zukünftig auf mehreren Hyper-V-Hosts (Windows 2012 R2) laufen.

Ganz am Anfang eines solchen Projektes steht neben der grundsätzlichen Planung die Einrichtung des Backups. Auf dem vSphere haben wir nachts die Maschinen mittels ghettoVCB gesichert, was unseren Anforderungen genügt hat. Das Prinzip war einfach: die VM wird heruntergefahren und auf ein NFS-Volume auf dem Backup-NAS geklont. Anschließend wird die VM wieder gestartet…

Ein vergleichbares Skript für Hyper-V habe ich im Hyper-V Blog der Fa. Rachfahl IT Solutions gefunden. Nebenbei angemerkt: die Website bekommt generell meine uneingeschränkte Empfehlung, wenn man sich mit Hyper-V beschäftigt. Was habe ich in der vergangenen (kurzen) Zeit von dort nicht schon alles an Problemlösungen zum Hyper-V rausgezogen habe. Einfach klasse…

Aber zurück zum Thema: das Powershell-Skript von Jan Kappen ähnelt im Funktionsumfang dem ghettoVCB, zumindest in den Funktionen, die wir brauchen: Maschine aus, exportieren, Maschine an.
Obwohl das Skript für uns schon so nutzbar wäre, habe ich es dennoch als Grundlage eines eigenen Skripts genommen. Das Ergebnis möchte ich hier gerne teilen, falls noch jemand ähnliche Voraussetzungen hat.

Hier kurz die Änderungen und Ergänzungen im Gegensatz zum Original-Skript:

  • Protokollausgaben werden in separater Funktion gemacht; das macht den Code schlanker und übersichtlicher
  • welche VMs gesichert werden, muss nicht extra konfiguriert werden. Es werden grundsätzlich alle VMs des Hosts gesichert. So kann man auch nicht die Sicherung neuer VMs vergessen 😉
  • das Skript merkt sich, ob eine VM vor dem Export heruntergefahren werden musste und schaltet die VM auch nur dann wieder an. War die VM vor dem Export aus, bleibt sie aus.
  • nach dem Export werden die Daten optional noch in ein anderes Verzeichnis verschoben. [UPDATEDas ist bei uns nötig, da das eigentliche Sicherungsziel ein Synology-NAS ist und dieses nicht direkt als Ziel des Exports verwendet werden kann. Wem der Export reicht, setzt $Global:Backuppfad = „“

Wenn man das Skript nun noch per Aufgabenplanung nachts laufen läßt, erhält man somit ein automatisiertes, komplettes und konsistentes Backup seiner virtuellen Maschinen.

Hinweis: bitte prüft das Skript sorgfältig in einer Testumgebung. Ich übernehme keine Haftung für die Folgen, die dieses Skript nach sich ziehen kann. Benutzung auf eigene Gefahr.

42 Kommentare

  • Danke für das Lob. Frage ist ob du schon Windows Server 2012 R2 einsetzt? Wenn ja kann man jetzt laufende VMs exportieren.

    Gruß Carsten

  • Hallo Carsten,

    danke für den Hinweis. Ja, die Hosts sind 2012 R2-Maschinen. Als Behörde haben wir aber nachts die Zeit alles herunterzufahren 😉

  • Guten Abend,

    welche Zeile müsste ich den anpassen bzw hinzufügen wenn ich 2 bestimmte VM´s Sichern möchte…??

    Also nicht alle vorhandenen und auch nicht nur eine..

    sondern wirklich 2…also ich würde gerne 2 bestimmte VM´s Herunterfahren und dann exportieren und natürlich den Status in einer Logdatei auslesen können

    DANKEEEE

  • Du musst die letzten drei Zeilen auskommentieren…

    …und dann die BackupVM-Funktion einzeln pro VM aufrufen…

     

  • Bekomme diesen Fehler … woran könnte dies liegen ?

    PS F:\> F:\VM_Sicherung_SQL2014.ps1
    11.07.2014 11:59:14 Backup der VM SQL2014 gestartet
    11.07.2014 11:59:14 Der Integrationsdienst ‚Herunterfahren‘ ist aktiviert
    11.07.2014 11:59:15 VM ist eingeschaltet und wird jetzt heruntergefahren
    11.07.2014 11:59:18 Export der VM
    Export-VM : Export failed for virtual machine ‚SQL2014‘ (F933BF77-C2B8-43B0-B018-E592A94DED2E) with error ‚The system cannot find the file specified.‘ (0x80070002).
    The operation failed because the file was not found.
    At F:\VM_Sicherung_SQL2014.ps1:78 char:5
    +     Export-VM -Name $VM -Path $Global:Exportpfad
    +     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (Microsoft.HyperV.PowerShell.VMTask:VMTask) [Export-VM], VirtualizationOperationFailedException
        + FullyQualifiedErrorId : ObjectNotFound,Microsoft.HyperV.PowerShell.Commands.ExportVMCommand
     
    11.07.2014 11:59:18 Export der VM abgeschlossen
    11.07.2014 11:59:18 Ueberpruefung auf Startverhalten nach Export
    11.07.2014 11:59:18 SQL2014 wird eingeschaltet
    11.07.2014 11:59:21 Exportiert Dateien werden nicht kopiert
    11.07.2014 11:59:21 Backup der VM SQL2014 beendet.
    11.07.2014 11:59:21 ———————————

  • Hallo Dirk,

    was hast du als $Global:Exportpfad definiert? Einen Netzwerkpfad bzw. ein gemapptes Netzlaufwerk? Der Export wird nicht mit den Rechten des aktuell angemeldeten Users gemacht, sondern mit einem Systemkonto. Wenn du ins Netz sicherst, musst du sicherstellen, dass das Computerkonto des Hyper-V-Servers entsprechende Rechte hat.
    Das war bei uns auch ein Problem, da man auf unserem Synology-NAS keine Rechte für Computerkonten vergeben kann. Wir hoffen jetzt darauf, dass Synology das irgendwann mal ermöglicht und auch SMB 3 an den Start bringt. Bis dahin lösen wir es über ein Workaround mittels iSCSI. Also Export auf ein iSCSI-CSV und dann auf die SMB-Freigabe auf’s NAS kopieren. Klingt komisch – is‘ aber so! 😉

  • Hallo Michael,

    wir hatten bei unserer QNAP genau dasselbe Problem wie du, dass wir nicht das Computerkonto des Hyper-V Servers auf die Freigabe berechtigen konnten.

    Wir konnten es bei uns mit einem „Trick“ lösen: Wir haben im AD eine Gruppe angelegt und den Hyper-V Server dieser Gruppe zugeodnet. Dann haben wir diese AD-Gruppe in der Freigabe auf dem NAS berechtigt. Das müsste mit eurer Synology eigentlich auch so funktionieren.

    Gruß Tobias

  • Danke für den Tipp. Ich glaube zwar, dass ich das auch schon erfolglos getestet habe, aber ich werde es noch einmal ausprobieren. Aber erst nach dem Urlaub :-p

  • Danke, Tobias. Dein Tipp scheint wirklich die Lösung zu sein. Ich habe nun auch die Computerkonten in einer Gruppe zusammengefasst. Ein erster Test-Export lief erfolgreich durch. Das würde unser Backup endlich vereinfachen… \o/

  • Pingback: Hyper-V-Export direkt auf ein Synology-NAS | noltenet.de

  • Hallo Michael,

    schön zu hören bzw. zu lesen wenn’s geklappt hat 🙂

    Gruß Tobias

  • Hallo,

    ich bekomme die folgende Fehlermeldung:

     

    Get-VM : Die Benennung „Get-VM“ wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen

    Was habe ich falsch gemacht ?

    Danke und Gruß

    Jens

     

  • dies ist die Stelle wo der Fehler auftritt:

    ForEach ($VM in Get-VM) {

    . BackupVM($VM.Name)

    }

     

  • ok Verzeichnis war nicht richtig ….

  • hmm nein geht doch nicht gleicher Fehler:

     

    S C:\Windows\system32> C:\Windows\System32\Sicherung_VMs.ps1

    Get-VM : Die Benennung „Get-VM“ wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen

    Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.

    In C:\Windows\System32\Sicherung_VMs.ps1:119 Zeichen:17

    + ForEach ($VM in Get-VM) {

    + ~~~~~~

    + CategoryInfo : ObjectNotFound: (Get-VM:String) [], CommandNotFoundException

    + FullyQualifiedErrorId : CommandNotFoundException

     

  • Führst du das Skript auch auf dem Hyper-V-Server aus oder auf deinem PC?

  • auf dem Hyper-V Server (Windows Server 2012)

  • 2012R2? Oder nur 2012?

  • genau gesagt 2012 Datacenter aber noch kein R2

  • Ich glaube, da musste man noch explizit die Module importieren, die man nutzen möchte. Google mal nach „Import-Module“….

  • Kann man mit diesem Script eine VM mit Exchange sichern oder sollte man für Exchange VSS Sicherung machen?

    Danke

    P.S. wir haben HyperV 2012 R2 Core (ohne GUI)

  • Da möchte ich keine Empfehlung aussprechen. Generell geht so eine Sicherung „von außen“ natürlich auch mit einem Exchange-Server.

    Der Exchange führt aber ja auch ein Transaktionsprotokoll, welches bei einer solchen Sicherung ständig wächst und nie geleert oder gelöscht werden würde. Das würde bei einer „richtigen“ Sicherung vom Backup-Tool erledigt werden, was hier nicht der Fall ist.

    Ob und wie man das Protokoll von Hand leert/löscht, müsstest du mal googlen. Wenn der Server vor dem Export heruntergefahren werden kann, hast du aber ja auf jeden Fall einen konsistenten Stand. Deshalb könnte ich mir vorstellen, dass ich so auch einen Exchange-Server sichern würde.

    Soll aber -wie schon gesagt- keine allgemein gültige Empfehlung sein.

  • Hallo Michael,

    vielen Dank für dein Feedback.

    Aidan Finn hat auch ein positives Feedback zur Sicherung per HyperV VSS Backup veröffentlicht.

    Transaktionsprotokoll ist kein Problem – man kann ab und zu den Exchange Server per VSS  sichern (über wbadmin z.B.) und dadurch Transaktionsdateien löschen.

    Wie meinst du, welche Backup-Art ist für eine Hyper-V VM (Win Server 2012 R2 + Exchange 2013) besser/zuverlässiger:

    1) Backup von VM per VM Export (z.B. mit dem Script, wie du es im Artikel beschrieben hast)

    2) Backup von VM per HyperV VSS Backup

    Wenn ich es richtig verstehe, bleibt die VM bei der 2. Variante online.

    Oder gibt es bei der 2. Variante deiner Meinung nach irgendwelche Nachteile?

    Vielen Dank im Voraus

    Grüße

    Sergej

  • Hallo,

    das Script läuft bei uns jede Nacht und Packt alles schön auf eine DS1515+, genau so sollte es auch sein:-).

    Auf einer VM muss aber eine Anwendung geöffnet seine (kein Dienst) nach dem Neust

  • Hallo,

    das Script läuft bei uns jede Nacht und Packt alles schön auf eine DS1515+, genau so sollte es auch sein:-).

    Auf einer VM muss aber eine Anwendung geöffnet sein (kein Dienst) nach dem Neustart muss ich jeden Morgen von Hand ran, gibt es eine Lösung?

  • Google mal „Automatische Windows-Anmeldung“. Da gibt es genug Anleitungen im Netz…

  • Hallo, bin eben auf der Suche nach einer Lösung für die Sicherung eines neuen Hyper-V Servers. ghettoVCB hatte ich vorher bereits aus ESXi gekannt wusste aber nicht dass es eine ähnliche Lösung für Hyper-V gibt. Generell ist es füt mich so dass ich den Kauf der einfach viel zu teuren Acronis Advanced Hyper-V Backupsoftware umgehen möchte. Eine wichtige Frage stellt sich mir nun hier allerdings. Ist das Herunterfahren der VM um ein Backup zu erstellen zwingend mit diesem Tool ? Mit vShpere konnte ghettoVCB die Erstellung eines Snapshot starten und dann die Sicherung auf ein NAS ausführen ohne die VM herunter zu fahren.

  • Hallo. Man soll mit Windows Server 2012 R2 als Hyper-V-Host auch laufende VMs exportieren können (s. den ersten Kommentar von Carsten Rachfahl).
    Als kommerzielle Alternative kann ich dir Altaro VM Backup empfehlen. Das hat bei uns das „Ghetto-HyperV-Backup“ ersetzt. Je nach Anforderung gibt es Altaro VM Backup kostenlos bzw. für 325 EUR oder 495 EUR.

  • Hallo, als künftiger Umsteiger von ESXI mit GhettoVCB auf einen Hyper-V Host habe ich mit Interesse den Artikel gelesen, da ich nach einer mit GhettoVCB vergleichbaren kostenfreien Backup-Lösung gesucht habe. Inzwischen bietet Hyper-V mir mehr Möglichkeiten als es die kostenfreie ESXI Lösung bietet, insbesondere gibt es bei Hyper-V das 8 vCPU Limit für eine VM nicht.

    Ich hatte zunächst HV Backup gefunden: HV Backup aber die Lösung hier erscheint mir besser, da es keine VSS Backups sondern „vollständige“ Backups erstellt.

    Als Neuling mit Hyper-V stellen sich mir noch ein paar Fragen:

    Verstehe ich es richtig, dass das Skript auf den Hyper-V Host kopiert wird und es auf dem Host eine Aufgabenplanung gibt, mit der ich das Skript automatisiert starten kann (wie cronjob auf ESXI)? Es ist also kein anderer Online-Windowsrechner nötig, der das Skript remote zum Hyper-V Host schickt? Gibt es hierzu eine Anleitung?
    Bei GhettoVCB gibt es noch ein Restore-Skript, mit dem ein Backup auf dem Host wiederhergestellt werden kann. Wie stelle ich das bei Hyper-V an? Gibt es über Powershell einen Befehl um eine VM auf einem Netzwerkpfad auf dem Hyper-V Host wiederherzustellen oder benötige ich ein bestimmtes Tool wie den Hyper-V Manager um eine VM zu importieren?

  • Der Neuling nochmals, der einen Schritt weiter ist. Also über den Server-Manager mit der Remoteverwaltung lässt sich ja die Aufgabenplanung des Hyper-V Hosts einrichten, soweit so klar.

    Bleibt die Frage der Wiederherstellung des Backups. Muss man hierfür im Hyper-V Manager einfach über die  „Importieren“-Funktion die BackupVM vom Netzlaufwerk neu importieren, also als „zweite“ VM hinzufügen?

  • Hallo,

    vielen Dank für das tolle Script! Eine Frage habe ich allerdings:

    Was muss ich wo und wie ändern, wenn gewünscht ist, das Backup in einen Unterordner mit dem jeweiligen Tagesdatum

    zu erstellen?

    Gruß, Thorsten

  • Danke für Dein tolles Skript!

    Habe es noch etwas angepasst, damit ich ein Menu aller verfügbaren VMs bekomme und dann eine auswählen oder Alle wählen kann.

    Sowie Anpassungen am Datumsformat und andere Kleinigkeiten. Läuft damit bei mir auch ohne Probleme auf Windows 8/10 mit HyperV lokal.

  • Hallo, Script funktioniert 1A.
    Aber gibt es eine möglichkeit beim export nur eine virtuelle HDD z.b.. „C“ zu exportieren wenn die VM mehrere virtuelle HDD’s hat?

  • Denke mit hinzufügen in Zeile 102 Copy-Item -exclude xx.vmdk sollte es genügen.

  • Jein. Beim eigentlichen Export-Vorgang kann man meines Wissens keine Festplatte ausklammern. Die VM wird komplett exportiert, mit allem was dazu gehört.

    In Zeile 102 werden ja nur die Daten der bereits exportierten VM an einen anderen Ort kopiert. Hier kann man aber dann sicherlich per -exclude Dateien nach einem Muster rauslassen. Ist die Frage, wie Hyper-V es findet, wenn beim Import diese VHD(X)-Datei fehlt. Habe ich noch nicht ausprobiert…

  • ok.
    Habe über Windows Server 2012 r2 gelesen das diese beim export nicht mehr ausgeschalten werden muss:

    In Server 2012 R2 you can export a VM (while it is even running!), including checkpoints and settings, by using the below powershell commands:

    Export all VMs to D:\VM_Backup:
    Get-VM | Export-VM -Path D:\VM_Backup

    ist dies korrekt, damit müsste das Script nur abgeändert werden und die VM’s laufen weiter beim export?

  • Ja, das geht. Es wird dann von der VM ein Snapshot (VSS) gemacht. Ich mache die Maschinen lieber aus, da sie nicht 24h laufen müssen. Damit ist auch gleich der Neustart für automatische Updates geklärt.

  • Damit diese Online bleiben müsste ich nur Zeile 44 – 67 entfernen.

  • Ja, und die Zeilen 81-90.

  • cyber.space

    Hallo!

    Ich habe auf einer VM die Datenfestplatte als Virtuelle Festplatte (SCSI) hängen. Diese Festplatte wird mit einer eigenen Backupsoftware gesichert.

    Mit eurem Skript wird die ganze VM inklusive aller virtueller Festplatten gesichert. Ich möchte mit dem Skript nur die C-Festplatte sichern. Ist das möglich? Kann man einzelne virtuelle Festplatten ausschließen?

    Danke im Voraus!

    lg cyberspace

  • Aleksandar A.

    Das Script Funktioniert sehr gut und ist sehr Hilfreich

    allerdings habe ich da noch einiges einbauen wollen was nicht so ganz Funktioniert

    Der Plan war folgender die VMs sollen nachdem der Sicherungs vorgang beendet ist nicht immer auf ein und den selben ordner gehen sondern auf einem NAS mit einem Anderen Benutzernamen und Passwort soll ein Ordner mit Datum Erstellt werden nach 20 Tagen soll dann der älteste ordner manuell gelöscht werden.

    $datum = Get-Date -Format yyyy.MM.dd
    mkdir \\NAS(oder IP)\Backup-HyperV\$datum

    Wäre auch eine Option

    Move-Item -Path D:\Backup-HyperV\ -Destination \\NAS(oder IP)\Backup-HyperV\$datum

    zur not wäre auch:  net use LW-BUCHSTABE: \\SERVER\SHARE /user:USERNAME PASSWORD /PERSISTENT:NO

    eine Option

    Damit möchte ich nur Verhindern das Ramsonware Zugriff auf das Sicherungslaufwerk bekommt und die Sicherungsfunktion ein Benutzer übernimmt welcher auf der Host Mashine kein Konto hat sondern nur auf dem NAS Vorhanden ist und durch das Script für die Zeit der Sicherung Berechtigung hat

     

     

  • Funktioniert in 2012R2 ohne Speichern / Herunterfahren astrein, tolle Anleitung, vielen Dank!

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.