Der VirtualBox VDI-Blob

Wer eine virtuelle Maschine mit VirtualBox, ein dynamisch wachendes Festplattenimage im VDI-Container auf dem ein GNU/Linux mit ext[2-4] Dateisystem installiert ist, betreibt, wird irgendwann ein konstantes Wachsen eben dieses Festplattencontainers bemerken. In meinem Fall belegte der Container zuletzt 45 GB, obwohl im Dateisystem nur 23 GB lagen.

Der Grund dafür: VDI-Container können nur freien Speicher "dynamisch freigeben". In meinem Fall lag irgendwo bei ~45 GB ein Bit herum und davor lagen insgesamt grobe 20 GB ungenutzter Speicher der nicht zusammengefasst werden kann. Das liegt an der Eigenart von Journaling-Dateisystemem wie ext4, beim Löschen von Dateien nicht wirklich die Dateien zu löschen, sondern nur den dazu passenden Eintrag im Journal. Die Daten selbst bleiben erhalten. So gibt es nach einiger Zeit auf der Festplatte eine ganze Menge ungenutzten Speicher, der aus Sicht des Containers aber eben nicht leer ist!

Die Lösung ist nun, den ungenutzten Speicher endgültig freizugeben. Für die Linux Kommandozeile gibt es das kleine Programm zerofree, dass vermutlich zuerst aus den Paketquellen der Distribution installiert werden muss. zerofree arbeitet nur auf Laufwerken, die nicht eingebunden sind. Um die Systempartition zu traktieren, muss das System also von einem Live-System aus gestartet werden. Wahlweise kann beim Booten auch der Wiederherstellungsmodus gewählt werden. Ich habe mich für letzteres entschieden. Dann kann zerofree -v /dev/sda1 aufgerufen werden, der Vorgang dauert im Zweifel sehr lange (bei mir grob eine Stunde!) Laufwerk den eigenen Gegebenheiten anpassen, das -v sorgt für eine Fortschrittsanzeige in Prozent. Im Anschluss die virtuelle Maschine herunterfahren.

Jetzt kann VirtualBox angewiesen werden, den VDI-Container zu verkleinern. Dazu wird auf der Kommandozeile das Programm VBoxManage genutzt. Konkret wird VBoxManage modifyhd <name>.vdi --compact aufgerufen. Auch das dauert wieder. Im Anschluss ist der VDI-Container wieder angemessen groß und kann normal verwendet werden.