Metro-Windows-100

VHD und VHDX verkleinern – mit der PowerShell

Ich hatte mal wieder den Drang eine VHD zu verkleinern. Es gibt für solche Aufgaben Tools von Drittanbietern – und jetzt auch von Microsoft. Die Lösung des Geheimnisses liegt, wie so oft, in der PowerShell. Die PowerShell ist hier die Lösung sowohl für vhd und vhdx die wir in Hyper-V VMs eingebunden haben, wie auch für virtuelle Festplatten aus denen heraus wir auf Physik booten.
In meinem Beispiel boote ich meine Physik in einer Dual-Boot-Konfiguration nach Windows 7 und nach Windows Server 2012. Beide Betriebssysteme sind jeweils in einer eigenen VHD abgelegt. Das ärgerliche ist nur, dass ich bei der Wahl der VHD-Größe etwas zu großzügig war. So belegt die VHD meiner Windows Server 2012 Installation im benutzten Zustand satte 250 GB, also das volle Volumen der dynamischen VHD.

Zur Verdeutlichung : Die VHD im Datei Explorer wenn sie in Benutzung ist:



Der belegte Platz innerhalb der VHD ist sehr übersichtlich und eindeutig zu großzügig dimensioniert:


Im Festplattenmanager findet man einen vollen Datenträger 1 mit der OS Partition C – Datenträger 0 ist der Speicherort für meine VHDs:



Um den entsprechenden Platz zu schaffen, der eine Reduzierung der VHD-Größe sinnvoll macht, reduziere ich die Größe der Partition im Datenträger 1 auf 60GB:



Nach erfolgreichem Abschluss des „Shrinks“ wird viel „Nicht zugeordneter“ Platz auf dem Datenträger angezeigt. Genau diesen freien Platz kann man jetzt entfernen.



Eigentlich ist es jetzt ganz einfach. Man muss nur dafür sorgen, dass die Randbedingungen erfüllt sind. Diese sind: Es muss sich um eine VHDX-Datei handeln und sie darf nicht im Zugriff sein.
In meinem Fall ist das Vorgehen damit recht klar: Keine Experimente.
Ich boote jetzt in mein Windows 7. Dort wird mir die unbenutzte Windows Server 2012 vhd entsprechend ihrem Inhalt mit weniger als 14GB Größe angezeigt:



Ein simples Copy and Paste erstellt mir die Datei WindowsServer2012 – Kopie.vhd – Somit kann ich wieder in meinen Windows Server 2012 booten und habe eine identische vhd die sich nicht im Zugriff befindet. Den Server benötige ich nun, damit ich die zweite Voraussetzung erfüllen kann: Nur VHDX Dateien lassen sich mit der PowerShell verkleinern. Dazu benötige ich die Hyper-V Rolle des Windows Server 2012. In der Hyper-V Konsole kann man über den Befehl „Datenträger bearbeiten“ die Konvertierung von VHD nach VHDX und umgekehrt durchführen.



Bei diesem Vorgang wählt man die ungenutzte VHD aus und wählt den Speicherort und Namen für die neue VHDX aus. Die VHDX wird frisch erstellt.
Anschließend ist PowerShell-Zeit. Die PowerShell muss mit erhöhten Rechten aufgerufen werden:



In meinem Fall ist das Ziel klar und einfach. Ich möchte meine VHD, noch VHDX, möglichst klein haben. In diesem Fall muss ich nicht rechnen und verwende den glücklicherweise existierenden Schalter.
Der Befehl zum verkleinern der VHDX Datei lautet in meinem Fall:
Resize-VHD -Path „d:\WindowsServer2012 – Kopie – vhdx.vhdx“ -ToMinimumSize


Diese frisch erzeugte VHDX Datei konvertiere ich nun wieder in eine VHD Datei (mein Bootloader kennt ja nur die VHD-Datei). Anschließend boote ich erneut in mein Windows 7. Von dort kann ich nun, mit ein wenig Vorsicht die 3 nicht mehr benötigten VHD-Dateien löschen und die neue VHD, entsprechend meiner alten Boot-VHD, umbenennen.



Nach einem Reboot in meinen Windows Server 2012 finde ich dort nun eine 60GB große VHD wieder, die mir auf der Parent-Disk fast 200GB frei gegeben hat:



Wie man sieht, reicht der Platz immer noch aus. Diese VHD beherbergt die Boot-Partition eines meiner Hyper-V Hosts. Der jetzt gewählte Speicherplatz reicht also völlig aus: 


Zum Vergleich auch die Ansicht im Festplattenmanager:


Hier noch 3 Beispiele für das PowerShell Commando:

Expandieren einer VHD (beim vergrößern darf es auch eine altmodische VHD sein) auf 1 TB:

Resize-VHD -Path c:\VHD-Name.vhd -SizeBytes 1TB

Verkleinern einer VHDX Datei auf 1 TB:

Resize-VHD -Path c:\VHDX-Name.vhdx -SizeBytes 1TB

Verkleinern einer VHDX Datei auf die kleinstmögliche Größe:

Resize-VHD -Path c:\VHDX-Name.vhdx -ToMinimumSize

Die vollständige Technet-Dokumentaion ist hier zu finden.

VN:F [1.9.22_1171]
Beitrag bitte hier bewerten:
Rating: 4.8/5 (9 votes cast)
VHD und VHDX verkleinern – mit der PowerShell, 4.8 out of 5 based on 9 ratings

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.