Wie verkleinere ich eine dynamisch wachsende VDI-Festplatte aus VirtualBox?


35

Meine dynamisch wachsenden virtuellen Festplatten (VDI) aus verschiedenen Ubuntu-Installationen in Virtual Box wachsen tatsächlich stetig.

Durch das Löschen von Dateien in der virtuellen Maschine wird nicht der Speicherplatz freigegeben, den meine VDI-Datei auf der Festplatte des Hosts belegt hat.

Wie verkleinere ich diese Dateien, um dem Host den nicht verwendeten Festplattenspeicherplatz zurückzugeben?

Antworten:


34

Eine dynamisch wachsende virtuelle Virtual Box-Festplattendatei kann auf Anforderung der virtuellen Maschine bis zu der maximalen Größe wachsen, die wir beim Einrichten dieser Datei definiert haben. Es gibt jedoch nicht den Speicherplatz für Dateien frei, die wir im Gastbetriebssystem gelöscht haben.

Falls die Festplatte zu stark gewachsen ist, können wir sie erneut komprimieren, sofern der nicht verwendete Speicherplatz mit Nullen gefüllt ist und das Laufwerk das VDI-Format aufweist.

Für ein ext2 bis ext4-Dateisystem kann dies vom Ubuntu-Gast mit dem Kommandozeilen-Dienstprogramm zerofree * erfolgen .Installieren Sie nullfrei

zerofree /dev/sdxX

Dies setzt voraus, dass das Laufwerk nicht verwendet wird und nicht gemountet ist . Wir müssen es daher möglicherweise vorübergehend an eine andere VM binden, die wir zu diesem Zweck erstellt haben, oder wir müssen eine Ubuntu-Live-Umgebung auf dieser VM starten.

Ersetzen Sie diese /dev/sdxXdurch die betreffende ext2-, ext3- oder ext4-formatierte Partition .

Auf mehr als einer Partition müssen wir zerofreefür jede Partition wiederholen . Beachten Sie, dass die virtuelle Datei durch das Füllen mit Nullen vorübergehend auf ihre maximale Größe anwächst.

Sobald der gesamte ungenutzte Speicherplatz mit Nullen gefüllt ist, verkleinern wir das Laufwerk mit

VBoxManage modifyhd <name>.vdi --compact

Dadurch wird die Dateigröße unserer VDI-Datei erheblich verringert.

* In einem Windows-Gast können wir nicht verwendeten Speicherplatz durch das Dienstprogramm ersetzen sdelete.


Funktioniert dies auch für ein verschlüsseltes Dateisystem im Gast?
Smichak

Sicher. Wenn Sie verwenden ecryptfs, sehen die verschlüsselten Dateien wie normale Dateien für Datenträgerdienstprogramme aus, und dies funktioniert. Wenn Sie die Festplattenverschlüsselung verwenden, wird diese ohnehin nicht als ext-formatierte Partition erkannt :)
chronospoon

Ich verwende die ext4-Partition auf einem dm-crypt-Blockgerät ... Ich habe die Methode ausprobiert und sehe die .vdi-Datei nach der Komprimierung nicht als kleiner an. Ich denke, dass die Nullblöcke als Nicht-Nullblöcke auf dem Blockgerät unter der dm-Krypta gespeichert werden.
Smichak

2
@smichak: das ist der Punkt der Verschlüsselung. Es wird Ihr gesamtes Laufwerk verschlüsseln, um sicherzustellen, dass wir keine Dateibegrenzungen sehen können.
Takkat

3
Wenn Sie Ihre VDI nicht an einen anderen Computer anschließen möchten, können Sie in den Wiederherstellungsmodus booten und die Festplatte erst mount -n -o remount,ro -t ext4 /dev/sda1dann bereitstellen zerofree -v /dev/sda1.
Hamid Nazari

1

Hier sind einige alternative Möglichkeiten, um den freien Speicherplatz auf Null zu setzen (was der zeitaufwändigste Teil sein kann). Danach müssen Sie noch ausführen, VBoxManage modifyhd <disk> --compactum die eigentliche Festplattendatei zu komprimieren.


Dieser Befehl kann die Festplatte auf Null setzen, während sie nicht gemountet ist:

apt-get install zerofree
zerofree -v /dev/sdxN


Hier ist ein Beispiel, wie Sie dd dazu bringen, die Ausgabe regelmäßig zu drucken:

dd if=/dev/zero of=temp-file-on-disk bs=20M

# run this to get the process ID of the dd command
pgrep -l '^dd$'
# then put the process ID on the command line to "kill -USR1"
# this will tell dd to print the current status (in another terminal)
kill -USR1 $(pgrep -l '^dd$' | awk '{print $1}')


Hier ist ein ddähnliches Programm, das die Ausgabe automatisch in regelmäßigen Abständen druckt:

apt-get install dcfldd
dcfldd if=/dev/zero of=temp-file-on-disk bs=20M

1
Ich habe zerofreees auf einem gemounteten Dateisystem gesehen, aber als es nur readonly gemountet wurde. Sogar für Root-FS: sudo mount -o remount,ro /- In einer GUI-Sitzung ist der Root-Server jedoch ausgelastet, sodass er fehlschlägt. Es ist jedoch in Runlevel 1 ( telinit 1) möglich, sodass Sie nicht von einer Live-CD booten müssen, um dies zu tun.
Tomasz Gandor
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.