Tags: Hyper-V, PowerShell, Snapshot
Snapshots, neuerdings auch Checkpoints (auf Deutsch Prüfpunkte), sind vor allem in Test- und Entwicklungsumgebungen sehr praktisch, weil man damit eine VM sehr einfach auf einen früheren Zustand zurücksetzen kann. PowerShell bietet mehrere Cmdlets, um Snapshots 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
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 übergeordneten 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ückgewinnen 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.
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 IncludeAllChildSnapshots, 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.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- Virtuelle Maschine vollständig mit PowerShell erstellen (am Beispiel von Azure Stack HCI)
- PowerShell-Remoting, Hyper-V Manager: Fehler wegen Netzwerkverbindungstyp "Öffentlich"
- Hyper-V-Host mit PowerShell (remote) konfigurieren, vSwitch hinzufügen
- Module für Active Directory, Hyper-V, WMI laden in PowerShell Core 6
- Automatische Snapshots in Windows 10 1709 Hyper-V konfigurieren
Weitere Links