VHDX-Laufwerke komprimieren und verkleinern

    Fragmentierte VHDDas mit Windows 8 und Server 2012 eingeführte VHDX-Format für virtuelle Laufwerke unterstützt Disks mit einer maximalen Größe von 64TB und vereinfacht auch das Verkleinern und Komprimieren von Datenträgern. Dank der neuen Powershell-Cmdlets kann man solche Aktionen gleich auf mehrere VHDX-Dateien anwenden.

    Bei allen Operationen, die ein virtuelles Laufwerk verändern, ist zu bedenken, dass diese wie physikalische Datenträger normalerweise Partitionen, Volumes und Dateisysteme enthalten, die vom Gastbetriebssystem verwaltet werden. Unkontrollierte Eingriffe von außen können hier schnell Chaos stiften, etwa wenn man eine VHD(X) direkt unter Windows mountet und bearbeitet. Aus diesem Grund hat VMware die Funktionen zum Verkleinern von VMDKs aus seinen Produkten entfernt.

    Optimierung nur von Offline-VHDX

    Abhängig von den File-Systemen, die eine VM intern verwendet, können externe Tools virtuelle Datenträger nur eingeschränkt warten. Beispielsweise ist das Zurückgewinnen unbenutzter Blöcke in vielen Fällen unmöglich, wenn das Gastbetriebssystem sie nicht mit Nullen überschreibt. Auch das Verkleinern von Datenträgern setzt voraus, dass die Partitionen erst von innen geschrumpft werden, so dass anschließend die VHDX von außen den frei gewordenen Platz abgeben kann.

    Auch die Verwaltung von virtuellen Laufwerken durch den Hypervisor droht durch externe Manipulation von VHDX-Dateien in Unordnung zu geraten. Das kann vor allem dann passieren, wenn Snapshots von einer VM angelegt wurden. An sich harmlose Veränderungen der übergeordneten VDHX haben dann unangenehme Folgen. Daher sollte man virtuelle Datenträger nicht konvertieren, vergrößern oder verkleinern, ehe man nicht die Snapshots gelöscht hat. Außerdem dürfen virtuelle Datenträger während solcher Operationen nicht genutzt werden.

    Wizard für das Verkleinern von VHDX-Dateien

    Unter Windows 8 und Server 2012 bietet der Hyper-V Manager für VHDX-Laufwerke zwei Optionen zur Reduktion des Platzverbrauchs. Zum einen handelt es sich dabei um das Komprimieren, das auch schon Hyper-V 2008 R2 für VHDs angeboten hat. Hinzu kommt nun das Wizard-geführte Verkleinern von VHDX-Dateien, das für VHDs nicht unterstützt wird.

    Ein einziger Dialog bietet alle Aktionen zur Bearbeitung von virtuellen Datenträgern an.

    Wenn man sich beim alten Format das umständliche manuelle Umkopieren ersparen möchte, um Plattenplatz zu sparen, dann sollte man es in VHDX konvertieren und dann die neue Funktion in Anspruch nehmen.

    Komprimieren nur für dynamische Disks

    Das Komprimieren eines virtuellen Laufwerks ist nur für dynamische VHDX-Laufwerke möglich. Es soll der Tendenz von solchen Datenträgern entgegenwirken, ständig zu wachsen, auch wenn die Menge der darin enthaltenen Daten kaum zunimmt. Der Hypervisor kann nämlich den Platz von gelöschten Dateien nicht freigeben, wenn er ihn nicht als ungenutzten Bereich erkennt.

    Beim Komprimieren wird eine VHDX mit der Partition verbunden, auf der sie abgelegt ist, und Windows kann dann das virtuelle Laufwerk untersuchen. Dies funktioniert jedoch nur für Partitionen, die mit NTFS formatiert wurden, weil es dort je nach verwendeter Methode erkennt, welche Blöcke tatsächlich von Dateien belegt sind. Bei anderen File-Systemen muss man geeignete Tools verwenden, die ungenutzte Bereiche mit Nullen überschreiben.

    Das Komprimieren ordnet dann die verwendeten Blöcke ähnlich wie ein Defragmentieren neu an und gibt die nicht genutzten frei. Im Hyper-V Manager findet man dieses Feature wie die anderen Operationen für VHDX-Dateien unter Aktionen => Datenträger bearbeiten. Der Vorgang ist Wizard-geführt und startet nach dem Auswählen der gewünschten VHD bzw. VHDX.

    VHDX mit PowerShell komprimieren

    Während das grafische Tool nur das Komprimieren einzelner virtueller Laufwerke erlaubt und dabei bloß die Standardmethode für einen bestimmten Typ ausführt, kann man in PowerShell diesen Vorgang besser steuern.

    Auch PowerShell zeigt den Fortschritt bei der Komprimierung von virtuellen Laufwerken an.

    Bevor man mit der Rückgewinnung mit Speicherplatz beginnt, will man sich wahrscheinlich einen Überblick über die Größe der VHDX-Dateien verschaffen, damit man nachher den Erfolg der Komprimierung messen kann. Folgender Befehl ermittelt den Platzverbrauch sämtlicher VHDX-Dateien in einem Verzeichnis:

    $len=0; gci *.vhdx | foreach{$len += $_.length}; $len/1GB

    Im nächsten Schritt startet man die Komprimierung der virtuellen Laufwerke mit Hilfe des Cmdlets Optimize-VHD. Dieses unterstützt den Parameter -mode, über den man eine der 5 zulässigen Methoden für die Komprimierung auswählen kann. Die besten Ergebnisse erzielt full, dafür dauert sie am längsten. Sie ist Standard bei VHDs, während bei VHDX die Variante quick zum Einsatz kommt, wenn man -mode nicht angibt. Möchte man alle VHDX in einem Verzeichnis optimieren, dann kann man dies zum Beispiel mit folgendem Aufruf tun:

    Get-VHD *.vhdx | where {$_.VhdType -eq "Dynamic"} | Optimize-VHD -mode full

    Über die Verwendung von Get-VHD kann man die virtuellen Laufwerke vom Typ dynamisch herausfiltern, denn nur sie lassen sich komprimieren. Wenn man anschließend den Gewinn an Speicherplatz sehen möchte, dann hilft dieser Befehl:

    $olen=0; gci *.vhdx | foreach{$olen += $_.length}; ($len - $olen)/1GB

    Voraussetzung für ein vernünftiges Ergebnis ist natürlich, dass die Variable $len aus dem ersten Befehl noch unverändert vorhanden ist.

    Komprimieren versus Verkleinern

    Das Komprimieren einer VHDX ändert die Einstellungen eines virtuellen Datenträgers nicht. Der beim Anlegen definierte Höchstwert, den das Gastbetriebssystem als Kapazität des Laufwerks erkennt, bleibt unangetastet. Dagegen schränkt das Verkleinern den Speicherplatz aus der Sicht des Gastes ein, so dass Partitionen erst geschrumpft werden müssen, um die Dimensionen des Laufwerks reduzieren zu können. Diese Operation ist primär für VHDX mit fester Größe vorgesehen.

    Die Größe der Partitionen und Volumes muss man von innerhalb der VM anpassen, wo man die Mittel des Gastbetriebssystems nutzt. Im Fall von Windows wären dies die Datenträgerverwaltung oder diskpart.

    VHDX verkleinern mit PowerShell

    Die anschließende Verkleinerung, die den Platz freigibt, der nicht durch Partitionen belegt ist, erfolgt wieder über den Hyper-V Manager oder mittels PowerShell. Dort ist für diese Aufgabe das Cmdlet Resize-VHD zuständig, das VHDX-Dateien vergrößern und verkleinern kann. Im Normalfall wird man sämtlichen Platz zurückfordern, den man durch die Reduktion von Partitionen gewonnen hat. Der entsprechende Aufruf würde so aussehen:

    Resize-VHD -Path <vDisk.vhdx> -ToMinimumSize

    Möchte man das virtuelle Laufwerk um eine bestimmte Größe reduzieren, dann gibt man diese über den Parameter -SizeBytes an, also beispielsweise -SizeBytes 256MB.

    Keine Kommentare