Tags: VHD, Hyper-V, Datei-Management
Lö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 Konfigurationsdateien. 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 zusammenreimen, 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 Konfigurationsdateien 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 Konfigurationsdateien 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.
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.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- Linked Clones in Hyper-V erstellen mit differenziellen VHD(X)
- Windows-Features offline in einer virtuellen Maschine installieren
- Virtuelle Maschinen unter Hyper-V von Generation 1 auf 2 konvertieren
- OVA und OVF in Hyper-V importieren mit PowerShell
- Hyper-V 1709: VMs exportieren und importieren mit der Teilen-Funktion
Weitere Links