VHDX komprimieren per Powershell

Mit ein paar wenigen Schritten, lässt sich die Größe einer VHDX komprimieren. Ungenutzter Speicherplatz lässt sich damit wieder freisetzen und für andere Zwecke nutzen.In dieser Anleitung zeige ich Dir, wie dies funktioniert..



VHDX komprimieren auf tatsächliche Größe

Die Möglichkeit, eine VHDX komprimieren zu können, besteht nur, wenn das Festplattenimage als Typ „Dynamisch erweiterbar“ angelegt wurde. In diesem Fall wird nämlich das sogenannte Thin Provisioning angewendet. Das bedeutet, dass sich die Image-Datei nur dann vergrößert, wenn der Speicherplatz in der VM auch wirklich belegt wird. Das eigentlich Dumme an der Sache ist, dass einmal belegter Speicherplatz andersrum nicht wieder automatisch freigegeben wird.

Die beiden nachfolgenden Bilder beschreiben das Problem etwas genauer:

VHDX komprimieren
Auf der Partition D sind von knapp 10GB noch 8,23GB Speicherplatz für die freie Verwendung vorhanden.
vhd datei verkleinern
Auf dem Hyper-V Host nimmt die VHDX Datei allerdings ca. 9GB Speicherplatz in Anspruch.

Ist genügend Speicherplatz auf dem Hyper-V Host oder Hyper-V Cluster vorhanden, ist dieser Umstand zunächst nicht weiter schlimm. Problematisch wird es allerdings, wenn die maximale Größe der virtuellen Festplatten den insgesamt vorhandenen Speicherplatz überschreitet. Dann besteht die Gefahr, dass die Partition oder das Cluster Shared Volume (CSV) „voll läuft“. Das Ergebnis wäre der Ausfall sämtlicher virtueller Computer, die auf dieser Partition, bzw. CSV liegen.

Per PowerShell die VHDX verkleinern

Für ein optimales Ergebnis bei der Komprimierung darf sich die VHDX-Datei nicht im Schreibzugriff berfinden. Sprich: die virtuelle Maschine muss ausgeschaltet, bzw. heruntergefahren sein. Andernfalls bekommst Du die Fehlermeldung: „Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird (0x80070020)“ angezeigt.

Der PowerShell Befehl zum Verkleinern einer VHDX-Datei lautet Optimize-VHD:

Optimize-VHD "<Pfad zur VHDX-Datei>" -Mode Full

Dadurch wird die betreffende virtuelle Festplatte auf die geringst mögliche Größe komprimiert. Der Schalter „-mode Full“ bewirkt, dass beim Komprimieren neben „ausgenullten“ auch nach unbenutzen Blöcken gesucht wird und auch deren  verwendeter Speicherplatz freigegeben wird.  Nachdem dieser Prozess beendet wurde, lohnt sich ein Blick in den Ordner „Virtual Hard Disks“.

In meinem Beispiel wurde die VHDX-Datei von ca. 8,6GB auf 1,9GB verkleinert. Das entspricht einer Komprimierungsrate von knapp 77%. Es kann sich also besonders bei virtuellen Datenträgern, welche in der Vergangenheit große Datenmengen beheimateten, lohnen die VHDX Komprimierung einmal auszuführen.

VHDX komprimieren
Nach der Komprimierung der VHDX-Datei ist das Festplattenimage keine 2GB mehr groß.

VHDX komprimieren per Hyper-V Manager

Für alle Freunde der grafischen Oberfläche: Der ganze Prozess ist auch über den Hyper-V Manager möglich. Dazu muss lediglich die virtuelle Festplatte in den Einstellungen der virtuellen Maschine ausgewählt werden. Mit einem Klick auf Bearbeiten bekommen wir die möglichen Operationen angezeigt.

VHDX komprimieren mit Hyper-V Manager
Auch über die grafische Oberfläche des Hyper-V Servers lässt sich die VHDX komprimieren
VHDX komprimieren mit Hyper-V
Die VHDX-Datei kann mittels der Option „Komprimieren“ verkleinert werden.

Egal für welche der beiden Möglichkeiten Du Dich entscheidest, das Ergebnis ist das Gleiche. Die VHDX-Datei wird auf die Größe verkleinert, welche der tatsächlichen Datenmenge entspricht, die in ihr gespeichert ist. Nachdem alle virtuellen Festplatten entsprechend verkleinert wurden, kann die virtuelle Maschine wieder gestartet werden.

Ebenfalls interessant:

Dieser Artikel ist wie alle anderen auf dieser Seite kostenlos für Dich und ich hoffe, ich konnte Dir weiterhelfen. Wer möchte, kann diesem Blog eine kleine Aufmerksamkeit in Form einer kleinen Spende (PayPal) oder über die Amazon Wunschliste zukommen lassen.

4 Gedanken zu „VHDX komprimieren per Powershell“

  1. Heho….

    … die Erklärung ist leider unrichtig bzw. irreführend; Resize-VHD macht nichts weiter als nicht partitionierten Platz innerhalb der VHD freizugeben und tastet partitionierten Platz nicht an, egal ob der nun ausgenullt wurde order nicht. Der Befehl der tut was beschrieben wurde, lautet Optimize-VHD (etwa: Optimize-VHD -path c:\disk.vhdx -mode full).

    Gruß Martin

    Antworten
    • Hallo Martin,
      da muss ich Dir vollkommen Recht geben. Der richtige Befehl für das Komprimieren der VHDX-Datei lautet Optimize-VHD. Interessanterweise funktioniert es aber auch mit dem „falschen“ Befehl Resize-VHD.
      Gruß René

      Antworten
      • Hallo Rene,

        ich muß leider widersprechen, es funktioniert _nicht_ mit Resize-VHD.
        Wie könnte es auch, die Funktion macht exakt, was sie soll, was dokumentiert ist und nichts magisches darüberhinaus.
        Ein Szenario in dem eine VHD nicht von einer Partition belegten Platz hat ist eh eine Fehlkonfiguration und Resize-VHD ist dafür da, diesen Überstand abzuschneiden, so dass die (potentielle, im Fall einer dynamischen) Größe der VHD mit der Größe der enthaltenen Partition übereinstimmt.
        Optimize-VHD hingegen ist, was man überlichweise braucht, dafür da, einmal belegten, aber im VHD-Container noch nicht wieder freigegebenen Platz zurückzugewinnen. Wie Du beschrieben hast, ist sdelete für die Effektivität dieser ‚Kompression‘ sehr wichtig.
        IHMO bietet es sich an, einen Task in der Aufgabenplanung für einen sdelete-run anzulegen, der immer vor der z.B. einmal wöchentlichen laufenden offline-Sicherung läuft, die wiederum ein Optimize-VHD -full vor dem eigentlichen Backup durchführt. So ist automatisiert und sichergestellt, dass die VHDs sich nicht aufblähen und eine maximale Dichte auf der teuren NVMe erreicht werden kann. Und um letztere maximal zu nutzen, empfhielt sich noch das Deduplizierungsfeature von Windows Server zu nutzen, dessen Effektivität mir immer wieder auf’s neue die Sprache verschlägt. (2TB in Win10-Client VHDs passen locker auf eine 500GB Samsung 960pro, mit noch 100GB frei) Besonders extrem ist die Deduplizierung bei Sicherungslaufwerken für VHDs, wo es ja oft auch darum geht, einen längeren Rattenschwanz aan Sicherungen vorzuhalten. Ein Beispiel aus der Praxis, eben gerade nachgeschaut: 13,93TB an Sicherungen belegen 542GB Speicherplatz auf einer 8TB großen Sicherungsplatte. Gott gütiger…..

        Antworten
        • Hallo Martin,

          ich nehme alles zurück und behaupte das Gegenteil. Resize-VHD ist lediglich zum Verkleinern, bzw. zum Abschneiden von Speicherplatz da. Komprimieren lässt sich die VHD ausschließlich durch Optimize-VHD. Vielen Dank, dass Du mich auf diesen Fehler hingewiesen hast. Der Beitrag wurde bereits korrigiert.

          Antworten

Schreibe einen Kommentar