VMs unter Hyper-V vollständig löschen mit PowerShell

    Windows 10 PapierkorbLöscht man eine virtuelle Maschine mit dem Hyper-V Manager, dann überleben die virtuellen Laufwerke diesen Vorgang und belegen weiterhin Speicherplatz. Mit PowerShell lassen sich VMs samt VHD(X) und Snapshots relativ einfach abräumen.

    Dem Befehl Löschen im Hyper-V Manager folgen drei Punkte, so dass man einen Folgedialog zur Auswahl von Optionen erwartet. Tatsächlich entfernt das Tool aber ohne Rückfrage die betreffende VM, und zwar nur die Konfigurations­dateien. Virtuelle Laufwerke bleiben dabei ungeschoren.

    VHDs nach Löschen der VM schwer auffindbar

    Dieses Verhalten schützt zwar vor dem versehentlichen Löschen von Daten, erschwert aber das vollständige Entfernen einer VM. Ist nämlich die Konfiguration nicht mehr vorhanden, dann muss man sich selbst zusammen­reimen, welche VHD(X) zur nicht mehr vorhandenen VM gehört haben. Abhängig von der Zahl der Speicherorte und der Benennung von Laufwerken kann dies recht mühselig sein.

    Das PowerShell-Modul für Hyper-V kennt den Befehl Remove-VM. Dieser verhält sich aber nach dem gleichen Muster wie der Hyper-V Manager. Daher muss man erst selbst herausfinden, welche VHDs zu einer VM gehören und diese dann explizit abräumen.

    Vorbereitungen

    Bevor man loslegt, sollte man sich überzeugen, dass die zu löschende(n) VM(s) ausgeschaltet sind. Dies kann man einfach mit Hilfe von Get-VM herausfinden:

    Get-VM -Name <Name-der-VM> | select state

    Ein Hindernis für ein vollständiges Beseitigen einer virtuellen Maschine können Snapshots darstellen, wenn man nur die VHD(X)-Dateien abfragt. Ob solche Prüfpunkte existieren, kann man einfach mittels

    Get-VM -Name <Name-der-VM> | Get-VMSnapshot

    erfahren. Grundsätzlich führt Remove-VM alle Snapshots mit den Eltern-VHDs zusammen, bevor es die Konfigurations­dateien entfernt. Wenn man sichergehen will, dass kein Prüfpunkt zurückbleibt, sollte man ihn vorher explizit löschen.

    Namen der virtuelle Laufwerke speichern

    Um herauszufinden, welche virtuellen Laufwerke mit einer VM verknüpft sind, greift man auf die Eigenschaft Harddrives und deren Attribut Path zurück. Diese speichert man für die spätere Verwendung in einer Variablen:

    $VHDs = (Get-VM -Name <Name-der-VM>).Harddrives.Path

    Möchte man mehrere VMs löschen, dann kann man ihre Namen dem Parameter Name als eine durch Kommata getrennte Liste übergeben oder Wildcards verwenden.

    VM-Konfiguration und VHDs löschen

    Im nächsten Schritt kann man nun Remove-VM <Name-der-VM> aufrufen, um die Konfigurations­dateien zu entfernen. Führt dies zu einem Konsolidieren von Snapshots, dann muss man das Ende dieses Vorgangs abwarten, bevor man die VHDs löschen kann.

    Die Befehle Remove-VM und Remove-Item sollte man erst mit -WhatIf aufrufen.

    Letzteres erfolgt über den Befehl Remove-Item, dem man die Variable $VHDs und damit die darin gespeicherten Pfade zu den VHDs übergibt:

    Remove-Item $VHDs

    Da sowohl der Aufruf von Remove-VM als auch von Remove-Item sensible Operationen sind, bei denen versehentlich Daten vernichtet werden können, empfiehlt sich erst der Aufruf mit dem Parameter -WhatIf. Das gilt besonders dann, wenn man bei Get-VM Wildcards verwendet.

    Alle Befehle in einer function

    Kommt man öfter in die Verlegenheit, eine VM von der Platte putzen zu müssen, dann ist die Eingabe der einzelnen Befehle auf der Kommandozeile zu umständlich. In diesem Fall empfiehlt sich die Definition einer Funktion, die den gesamten Vorgang ausführt. Diese kann man bei Bedarf auch in das Profil aufnehmen, so dass sie stets verfügbar ist.

    In Zukunft muss man nur mehr del-VM <Name-der-VM> aufrufen, um die virtuelle Maschine zu löschen. Wenn man vorsichtiger agieren möchte, dann kann man beim Aufruf von Remove-VM den Schalter Force entfernen und bei Remove-Item dafür Confirm hinzufügen. Beide Maßnahmen bewegen die Cmdlets dazu, die Aktion durch den Benutzer bestätigen zu lassen.

    VMs remote löschen

    Grundsätzlich funktioniert das beschriebene Vorgehen auch für Remote-Hosts, weil man diese bei Get-VM und Remove-VM über den Parameter ComputerName angeben kann. Nur das Löschen der VHDs klappt nicht auf diese Weise, hier baut man am einfachsten eine Remote-Sitzung mit Enter-PSSession auf, um Remove-Item auszuführen.

    Keine Kommentare