Thin Provisioning hat bei VMware vSphere den Vorteil, dass sich den VMs mehr Platz zuweisen lässt, als Sie anfangs benötigen. Das VMDK-File wächst dann mit steigendem Füllgrad des Filesystems der VM. Der Nachteil dabei ist aber, dass vSphere nicht in der Lage ist, diese VMDK-Files ohne Weiteres wieder zu verkleinern, wenn der Speicherbedarf wieder sinkt, denn die gelöschten Files sind sowohl unter Windows als auch Linux standardmässig nur als Verzeichniseintrag gelöscht worden. Die Datenblöcke existieren weiterhin und so können die freien Blöcke nicht von vSphere erkannt und entfernt werden.

Nullen hilft

Nun gibt es die Möglichkeit, durch Nullen gefüllte Blöcke wieder aus dem VMDK-File zu löschen und zum Glück gibt es sowohl unter Windows mit SDelete und unter Linux mit dd Werkzeuge, mit denen sich das schnell erledigen lässt. Danach kann dann das VMDK-File per Kommandozeile direkt auf der ESXi-Shell oder, soweit lizenziert, mit Storage vMotion verkleinert werden. Bei Tests hat das im Schnitt 30% bis 50% Platzersparnis ergeben!

SDelete für Windows kann hier heruntergeladen werden und dd sollte bei jeder Linux-Distribution eigentlich schon mit installiert sein.

ACHTUNG: Vor dem Nullen der freien Blöcke "bis zum Anschlag" sollten Datenbank-Dienste oder andere Dienste, die regelmässig auf Festplatte schreiben, beendet werden, um korrupte Daten zu verhindern!

ACHTUNG: Durch das Nullen wird das VMDK-File auf die maximale Große gebracht! Es ist also im VMFS auf genug Reserve zu achten!

ACHTUNG: Fertigen Sie vor dieser Aktion ein Vollbackup der VM an! Wir übernehmen keine Haftung für (Tipp-)Fehler o.ä.!

Und so geht's mit den Nullen

Das Nullen der freien Blöcke mit SDelete geschieht dann folgendermaßen:
sdelete.exe -z $LAUFWERK:

Und mit dd geht das so:
dd if=/dev/zero of=/$PFAD/NULLEN bs=4M ; rm -f /$PFAD/NULLEN

Den Laufwerksbuchstaben bzw. den Pfad zum betreffenden Filesystem bitte entsprechend anpassen. Bei SDelete hat sich mit Version 1.6 die Option für das Nullen von -c auf -z geändert! -c schreibt ab Version 1.6 Zufallsdaten in die freien Blöcke. Diese lassen sich dann natürlich nicht aus dem VMDK entfernen!

Sollte es beim Nullen von Laufwerk C:\ unter Windows zu einer Fehlermeldung kommen, ist die TEMP-Variable auf ein nicht existierendes Verzeichnis gesetzt. Setzen Sie diese dann einfach temporär mit SET TEMP=C:\ um.

Und jetzt wird verkleinert

Nach dem Nullen fahren wir nun für das Verkleinern des VMDK auf Kommandozeilenebene die VM herunter. Verkleinern wir das VMDK per Storage vMotion, kann die VM während der Migration in Betrieb bleiben. Sie sollte vorher aber auf jeden Fall neu gestartet werden!

Auf der Kommandozeile:

  1. Wechseln Sie in das VM-Verzeichnis auf dem Datastore
  2. Überprüfen Sie nun die Größe vor der Verkleinerung:
    du -h $DISKNAME.vmdk
  3. Verkleinern Sie nun das VMDK-File:
    vmkfstools --punchzero $DISKNAME.vmdk
  4. Überprüfen Sie nun die Größe nach der Verkleinerung:
    du -h $DISKNAME.vmdk
  5. Fertig

Per Storage vMotion:

  1. Verschieben Sie die VM einfach auf einen anderen Datastore
  2. Fertig