Verkleinern von virtuellen Festplatten

Eine meiner Hauptaufgaben in meinem Job bei Microsoft ist es, anständige Präsentationen für die Veranstaltungen, auf denen ich als Sprecher auftrete, zu erstellen. Für Technical Evangelists bedeutet das natürlich nicht Death by PowerPoint, sondern viel mehr Punkt 6 aus The Art of Evangelism:

Learn to give a demo. An “evangelist who cannot give a great demo” is an oxymoron. A person simply cannot be an evangelist if she cannot demo the product. If a person cannot give a demo that quickens the pulse of everyone in the audience, he should stay in sales or in marketing.

Eine great demo bedingt oft ein umfangreiches Demoszenario. Für meine Exchange-Demos baue ich zum Beispiel gerade eine neue virtuelle Umgebung mit Exchange 2007 RTM, AD, Client mit Office 2007 RTM und externem Zielmailserver zusammen. Die dabei entstehenden virtuellen Maschinen verbrauchen sehr viel Plattenplatz. Trotz demnächst 160 GB im Notebook (noch sind es 100 GB) mache ich mir also Gedanken, ob man nicht Luft aus einer virtuellen Festplatte (VHD) lassen kann.

Der normale Weg wäre das Verringern der Datenmenge auf der Festplatte durch Löschen von unnötigen Daten (Entfernen von nicht benötigten Komponenten, Löschen von Tempfiles, etc.). Dabei kann die Datenträgerbereinigung eine große Hilfe sein. Leider wird die VHD dadurch nicht physikalisch kleiner. Das geht mittels Komprimieren der VHD über den Assistenten für virtuelle Datenträger. Allerdings kann dieser die VHD nur um den Platz verkleinern, der als echter Whitespace zusammenhängend am Ende der Festplatte liegt. Deshalb muss im nächsten Schritt eine Defragmentierung dafür Sorge tragen, dass alle Daten an ihrem optimalen Platz liegen.

Wurden allerdings schon mal früher Daten auf die jetzt freien Festplattenblöcke geschrieben und danach wieder gelöscht, sind die Blöcke dort nur als gelöscht markiert und somit kein Whitespace. Um diesen Platz trotzdem freischaufeln zu können, kann man bei Virtual PC die Datei Virtual Disk Precompactor.iso aus dem Verzeichnis Microsoft Virtual PC\Virtual Machine Additions in die virtuelle Maschine einbinden. Der dann startende Precompactor löst genau das Problem. Nach einem vollständigen Durchlauf fährt man die virtuelle Maschine herunter und kann dann mit dem oben erwähnten Assistenten die VHD verkleinern.

Was bedeutet das aber in der Praxis? Stunden von Arbeitsaufwand pro Maschine. IO-Auslastung fern von gut und böse. Am besten nutzt man gleich mehrere Rechner um parallel soviele VHDs wie möglich zeitgleich zu verkleinern. Diese Aufgabe ist wirklich nicht sehr motivierend und deshalb habe ich mich bisher immer davor gedrückt.

Mit meinem neuen Projekt konnte ich mich nicht mehr davor drücken, weil mein freier Plattenplatz drastisch zur Neige ging. Vor die Wahl gestellt, entweder die Festplatte in meinem Arbeitsnotebook auszutauschen, um weitere 60 GB einmalig zu gewinnen oder endlich mal eine vernünftige Lösung für das Eindämmen der Platzverschwendung meiner VHDs zu finden, entschied ich mich für letzteres.

Nachdem ich die obige Prozedur bei zwei Maschinen erfolgreich absolviert hatte, ist es mir gelungen, den Platzverbrauch der beiden VHDs nahezu zu halbieren (aus 9.5 GB wurden 5.4 GB). Das war schonmal ein großer Schritt. Allerdings kostete der Aufwand einen halben Arbeitstag, den mein Notebook nahezu mit Vollast Daten hin und herschaufelte.

Eine Alternative ist das Anlegen einer leeren, neuen VHD und das Einbinden der zu verkleinernden und der neuen VHD als Laufwerk. Dazu gibt es das Tool VHDMount.exe im Virtual Server 2005 R2. Zwischen den beiden VHDs kann man dann Daten einfach durch Kopieren austauschen. Wenn man also alle Inhalte aus der zu verkleinernden VHD in die neue VHD kopiert (und dabei alle Berechtigungen, Besitzer, etc. mitnimt), bekommt man eine defragmentierte VHD ohne Whitespace. In meinem Beispiel wurde die neue VHD in ca. 15 Minuten auf 4.6 GB verkleinert! Das nenne ich Platz- und Zeitersparnis.

Eine Anleitung zur Vorgehensweise findet man in Copy/Increase a VHD using VHDMount. Die Anmerkungen in Resizing Virtual Hard Disks...Suh'mo! helfen bei einem kosmetischen Problem mit VHDMount.exe (trat bei mir auch auf) weiter. Einziger Kritikpunkt von meiner Seite aus: XCopy (und auch Robocopy) unterstützt leider keine NTFS Hard Links. Da bleibt die Kopierroutine bei XCopy einfach mit einem Fehler stehen. Besser wäre der Einsatz von NTBackup - leider gibt es das in Windows Vista aber nicht mehr. Da stelle ich doch gleich mal eine Frage an unsere interne Vista-Mailingliste. Bis zur Antwort verkleinere ich meine VHDs dann noch unter Windows Server 2003.