Snapshots in Hyper-V erstellen, löschen und anwenden mit PowerShell

    Hypervisor-SnapshotSnapshots, neuer­dings auch Checkpoints (auf Deutsch Prüfpunkte), sind vor allem in Test- und Entwicklungs­umgebungen sehr prak­tisch, weil man damit eine VM sehr einfach auf einen früheren Zustand zurück­setzen kann. PowerShell bietet mehrere Cmdlets, um Snap­shots zu erstellen und zu verwalten.

    In der Vergangenheit riet Microsoft davon ab, Snapshots auf produktiven Systemen zu verwenden. Die wichtigsten Gründe gegen diesen Einsatz sind der erhebliche Verbrauch von Speicherplatz und Einbußen bei der Performance. Eine Neuerung von Windows 10 und Server 2016 Hyper-V sind Production Snapshots, die auch im normalen Betrieb genutzt werden können.

    Snapshots erzeugen mit Checkpoint-VM

    Aufgrund der möglichen Nebenwirkungen von Prüfpunkten ist es ratsam, diese regelmäßig zu beobachten. Dafür eignet sich PowerShell besser als der Hyper-V Manager. Dagegen bieten sie bei anderen Aktionen keine so klaren Vorteile, etwa beim Anlegen eines neuen Snapshots.

    Diesem Zweck dient bei PowerShell das Cmdlet Checkpoint-VM, das den Namen der VM und des neuen Snapshots erwartet:

    Checkpoint-VM –VMName Win10-VM1-L1 -SnapshotName Build-10565

    Neuen Prüfpunkt anlegen mit dem PowerShell-Cmdlet Checkpoint-VM

    Mit Hilfe des Parameters ComputerName lässt sich dieser Befehl auch auf entfernten Hosts ausführen, das gilt auch für alle nachfolgend besprochenen Snapshot-Befehle.

    Prüfpunkte analysieren

    Interessante Möglichkeiten bietet PowerShell bei der Analyse vorhandener Snapshots. So ist es generell interessant zu wissen, welche VMs über Prüfpunkte verfügen und wie viel Speicherplatz sie belegen. Für diese Aufgabe eignet sich das Cmdlet Get-VMSnapshot.

    Will man es nur auf einzelne VMs anwenden und dort Informationen über einen bestimmten Snapshot erhalten, dann übergibt man ihm einfach deren Namen:

    Get-VMSnapshot –VMName Win10-VM1-L1 -Name Build-10565

    Standardmäßig erhält man damit nur wenige zusätzliche Angaben, nämlich das Erstellungsdatum und den Namen eines eventuell vorhandenen überge­ordneten Snapshots. Da in einem Prüfpunkt auch die gesamte Konfiguration der VM zum Zeitpunkt seiner Erstellung festgehalten wird, kann man diese ebenfalls abfragen. Eine Liste der verfügbaren Eigenschaften erhält man mit

    Get-VMSnapshot –VMName Win10-VM1-L1 |gm -MemberType Properties

    Keine Auskunft erhält man auf diesem Weg jedoch über die Größe des Snapshots, weil dafür keine Eigenschaft zur Verfügung steht. Dafür muss man zusätzlich das Cmdlet Get-VMHardDiskDrive bemühen:

    Get-VMSnapshot –VMName Win10-VM1-L1 | Get-VMHardDiskDrive | Get-ChildItem

    VMHardDiskDrive ermittelt zwar das virtuelle Laufwerk des Snapshots, sagt aber nichts über dessen Größe. Daher leitet man seinen Output an Get-ChildItem weiter.

    Problematisch an diesem Vorgehen ist jedoch, dass die für einen Snapshot angelegte avhdx-Datei in der Konfiguration der VM als Laufwerk aufscheint, während die ursprüngliche VHDX dem Snapshot zugeordnet wird. In der Regel ist man aber an der Größe der differenziellen Laufwerke interessiert, weil man deren Speicherplatz ganz oder teilweise zurück­gewinnen kann.

    Um Informationen über die avhdx-Dateien zu erhalten, kann man so vorgehen:

    Get-VM | gci -r -Filter *.avhd*| select name, @{Name="MB";Expression={$_.Length / 1Mb}}

    Dieser Befehl ermittelt alle VMs auf dem lokalen Host und übergibt diese Liste an Get-ChildItem (Alias gci). Danach filtert das select-Statement den Namen der differenziellen Disk und deren Größe in MB aus. Die Summe des gesamten verbrauchten Speicherplatzes könnte man so anzeigen lassen:

    Get-VM | gci -r -Filter *.avhd* | %{$len += $_.length}; $len/1GB

    Snapshots löschen

    Das Löschen von Snapshots unter Hyper-V ist ein schwieriges Thema, weil das Ergebnis oft nicht dem entspricht, was der Begriff erwarten lässt. Hängt nämlich von einem Snapshot ein weiterer Kindknoten ab, dann bewirkt das Löschen nur ein Verschmelzen des Snapshots mit dem übergeordneten Element. Diese Voraussetzung ist immer gegeben, wenn nur ein Zweig von Snapshots existiert. Der letzte in der Reihe ist dann der aktuelle Status, im Hyper-V Manager mit Jetzt markiert.

    Hat man beispielsweise eine VM durch Konfigurationsfehler oder das Installieren experimenteller Software ruiniert, dann sollte man nicht versuchen, sie durch Löschen des Snapshots in einen früheren Zustand zu überführen. Vielmehr wird dieses Vorhaben meistens dazu führen, dass der miserable Status Quo in das Eltern-Image übernommen wird.

    Löscht man hier den Prüfpunkt Win10Home-VM1-L1 Win10Home-VM1-L1 - (20.11.2015 - 17:30:34), dann verschmilzt er mit Build-10565.

    Deshalb wird man vor dem Löschen eines Snapshots herausfinden wollen, ob noch weitere Knoten von ihm abhängen. Weiß man darüber Bescheid, dann lässt sich die Konsequenz der Aktion absehen. Diese Information kann man über das Attribut ParentSnapshotName erhalten:

    $Parents = Get-VMSnapshot –VMName Win10-VM1-L1
    %{$Parents } | ? {$Parents.ParentSnapshotName -contains $_.Name}

    Gibt der zweite Befehl den Namen eines Prüfpunkts aus, dann hat dieser einen von ihm abhängigen Snapshot, weil sein Name in dessen Eigenschaft ParentSnapshotName enthalten ist.

    Das eigentliche Löschen eines Snapshots erfolgt über das Cmdlet Remove-VMSnapshot. Diesem übergibt man wie schon Get-VMSnapshot den Namen der VM und optional jenen des Snapshots. Benennt man keinen Checkpoint, dann löscht es alle. Gibt man jedoch einen bestimmten an und verwendet den Schalter IncludeAll­ChildSnapshots, dann wird der ganze davon abhängige Zweig entfernt.

    Folgendes Beispiel löscht alle Snapshots der angegebenen VM, die vor dem 20.11.2015 erstellt wurden:

    Get-VMSnapshot -VMName Win10-VM1-L1 | ? {$_.CreationTime -lt "20. November 2015"} | Remove-VMSnapshot

    Möchte man alle Snapshots von allen VMs entfernen, dann würde dieser Befehl ausreichen:

    Get-VM | Remove-VMSnapshot

    Auf früheren Snapshot zurückkehren

    Wenn man auf einen früheren Zustand der VM zurückkehren möchte, dann erfüllt das Cmdlet Restore-VMSnapshot diesen Zweck:

    Restore-VMSnapshot -VMName Win10Home-VM1-L1 -Name Build-10565

    Es entspricht den Befehl Anwenden im Hyper-V Manager. Nicht gespeicherte Daten in der VM gehen dabei verloren, die Dateien der jüngeren Prüfpunkte bleiben dagegen erhalten.

    Keine Kommentare