Hinweis
Das Verkleinern einer Disk ist grundsätzlich relativ einfach und wird über folgenden Befehl ausgelöst:
VBoxManage modifyvdi xxxx.vdi compact
wobei xxx.vdi dem Pfad zur virtuellen HD entspricht.
Damit VirtualBox aber das Abbild verkleinern kann, müssen zunächst Vorbereitungen im Gastsystem getroffen werden. Eine virtuelle HD im VDI Format besteht aus mehreren Blöcken à 1 MB. Virtualbox kann nur Blöcke aus dem virtuellen Abbild entfernen, welche komplett mit 0x00 gefüllt sind und dadurch als „unbenutzt“ betrachtet und aus dem Abbild eliminiert werden können. Dateisysteme setzen die Inhalte der Cluster von gelöschten Dateien jedoch nicht zurück. Aus diesem Grund müssen vor dem Ausführen des obigen Befehls - abhängig vom Gastsystem - noch weitere Aktionen ausgeführt werden.
Linux muss zunächst im Single-User-mode (init 1 / Recovery-Mode) gestartet werden. Anschliessend werden in der Root-Konsole folgende Befehle ausgeführt :
mount -n -o remount,ro -t <meinFileSystem> /dev/sda1 /
Wobei <meinFileSystem>
durch das effektiv vorhandene Filesystem ersetzt werden muss, also z.B. ext4
.
zerofree /dev/sda1
Wobei /dev/sda1 einer Partition auf der zu verkleinernden Disk entspricht. Dieser Schritt ist für alle Partitionen zu wiederholen.
Zusätzlich kann auch die Swap-Partition noch auf 0 gestellt werden. Damit wird jedoch die Markierung der Swap-Partition gelöscht und muss danach wiederhergestellt werden. Um dies zu erreichen, kann man wie folgt vorgehen (wobei /dev/sda5 der linux-swap-Partition entspricht):
blkid /dev/sda5
shred -n 0 -z /dev/sda5
mkswap /dev/sda5 -U <UUID>
Wobei <UUID> der im ersten Schritt ermittelten UUID entsprechen soll
Wenn sich das Diskabbild dennoch nicht auf die erwartete Grösse verkleinern lässt, kann dies damit zusammen hängen, dass die Dateisystem-Blöcke des Gastsystems ungünstig über die 1 MB Blöcke des VDI-Files verteilt sind. Um die Blöcke kompakter auf die virtuelle Festplatte zu bekommen, kann man sich eines Tricks bedienen:
Anschliessend kann der oben genannte Vorgang (mount - zerofree) nochmals ausgeführt werden.
Zunächst eine Defragmentierung durchführen um die vertreuten Dateien möglichst in ganzen Blöcken zu erhalten. Anschliessend sämtliche freien Blöcke mittels folgendem Befehl auf null setzen:
sdelete -c C
Wobei C der Laufwerksbuchstabe ist.