HyperV’s VHDX Dateien verkleinern (compact vhdx)
Folgende Ausgangssituation: Eine virtuelle HyperV-Maschine hat intern 80GB belegt, das VHDx-File hat jedoch über 130GB. Diese 50GB “zu viel” sind im laufe der Zeit enstanden, als die VM irgendwann mehr Platz benötigt hat. Dieser Platz lässt sich jedoch zurückgewinnen – Stichwort: compact vhdx.
Platz in der VM gewinnen
Als erstes sollte man schauen, ob man in der VM noch mehr Platz gewinnen kann.
Datenträgerbereinigung
Als erstes kann man zusätzlichen Platz in der VM freischaufeln, indem man die “Datenträgerbereinigung” (“Disk Clean-up”) von Windows verwendet:

- Windows Explorer öffnen
- Rechtsklick auf die Festplatte
- “Eigenschaften” (“Properties”) auswählen
- “Bereinigen” (“Disk Clean-up”) auswählen
- “Systemdateien bereinigen” (“Clean-up system files”) auswählen
- Alle Dateitypen, die nicht mehr benötigt werden auswählen
- Bestätigen
Dieser Vorgang kann einige Minuten dauern.
Leeren Platz mit Nullern überschreiben
Damit der ‘Compact’-Prozess von HyperV freien Platz in der VHDx Datei auch sicher als solchen erkennt, lohnt es sich den freien Speicherplatz mit Nullern zu überschreiben. Dazu eignet sich das Tool “sdelete” von Sysinternals.
sdelete.exe -s -z c:
Dieser Vorgang dauert etwas länger, bei mir hat er etwa eine 3/4-Stunde in Anspruch genommen.
Datenträger optimieren
Ein weiterer sinnvoller Schritt ist, die Windows-interne “Datenträger Optimierung” zu verweden. Bei Systemen, welche auf einer VHDx installiert sind, wird so der Speicher entsprechend verschoben, damit der Platz wieder freigegeben werden kann. In meinem Fall Stand hier “Space efficiency: 64%”. Das entspricht inetwa dem Verhältnis von VHDx-Dateigröße zum tatsächlich benötigtem Speicherplatz.
Dieser Vorgang erhöhte die “Space efficiency” allerdings nur auf 69%. In einem Forumseintrag, bin ich auf den Tipp gestoßen, stattdessen folgenden Powershell-Befehl zu verwenden:
Optimize-Volume -DriveLetter L -Analyze -Defrag -Verbose
Auch dieser Vorgang dauert wieder einige Zeit (ungefähr 1 1/2 Stunden)…. Aber dafür ist die Space efficiency nun immerhin auf 82%.
Compact VHDx
Nach dem alle Vorbereitungen getroffen wurden, kann man das VHDx-File endlich ‘compacten’. Dazu geht man wie folgt vor:
- VM abschalten
- Im Hyper-V Manager “Edit Disk” auswählen
- Die Datei auswählen
- “Compact” auswählen
- Besätigen
Dieser Vorgang dauerte bei mir nur wenige Sekunden, und hat die Dateigröße von 130GB auf 94GB reduziert.
Eine Möglichkeit, die Compact-Action über Powershell auszuführen finden man in einem Artikel von Helge Klein (englisch):
Mount-VHD 'P:/fad zur/Datei.vhdx' -ReadOnly
Optimize-VHD 'P:/fad zur/Datei.vhdx' -Mode full
Dismount-VHD 'P:/fad zur/Datei.vhdx'
Conclusio
Es gibt viele Möglichkeiten noch ein wenig mehr Platz herauszubekommen, und ich bin nicht sicher wie viel welche der Maßnahmen tatsächlich bringen. In dieser Reihenfolge ausgeführt dauert es zwar einige Zeit, funktioniert aber – auch wenn immer noch ~14GB ‘zu viel’ belegt sind.
Zu Compact VHDX mit Powershell
Man muss das Optimize-VHD offenbar zweimal ausführen:
1) VHDX ist readonly gemountet; hier werden die Bereiche freigegeben, die vom Filesystem nicht genutzt werden.
2) VHDX ist nicht gemountet; hier werden die Bereiche freigegeben, die nur 00 enthalten.