Manchmal stösst man auf Dinge, bei denen man sich fragt „Sag mal, stört das nicht viel mehr Leute? Warum ändert man es nicht!“. Normalerweise bringt ein genaueres Nachbohren die Antwort zutage, warum es eben nicht so einfach ist. Doch wenn auch das keinen wirklichen Grund zu Tage bringt, dann muss man wohl darum herumarbeiten.

Heutiges Thema ist die Anpassung der Filesystemgrösse für die virtuelle Harddisk von virtuelle Maschinen unter Virtualbox. Wir wollen die Grösse anpassen, weil wir bei der Anlage der virtuellen Maschine mal wieder zu optimistisch gerechnet haben :).

Grundlagen

Einige wir uns erst einmal auf einige Begriffe:
Name der virtuellen Maschine: ubuntuserver
Name inkl. Pfad zum alten VMDK: /srv/VM/ubuntuserver.vmdk
Name inkl. Pfad zum alten VDI: /srv/VM/ubuntuserver.vdi
Gewünschte neue Grösse des Filesystems: 16384 (~16GB)

Problemstellung

Man sollte glauben, so ein einfacher Task sei mit einem Klick in der GUI erledigt. Doch weit gefehlt. Die Anleitung verweist uns auf den Consolenbefehl VBoxManage modifyhd. Das ist nun zwar etwas blöd, aber wir sind ja Experten – ein wenig auf der Console herumschrauben bereitet uns kein Problem.

Also mutig ein VBoxManage modifyhd ubuntuserver.vmdk –resize 16384 eingegeben und…

0%...
Progress state: VBOX_E_NOT_SUPPORTED
VBoxManage: error: Resize medium operation for this format is not implemented yet!

Ok das VMDK-Format wird nicht unterstützt. Man hätte jetzt noch schreiben können, welches Format den unterstützt wird. Aber na gut, eine kurze Suche ergibt: Virtuelle HDDs im VMDK-Format können nicht vergrössert werden (Genauso wenig wie HDDs mit aktiven Snapshots, aber das könnten wir ja beheben, indem wir die Snapshots verwerfen).

Lösungsansatz

Schritt 1

Wir klonen die HDD und erstellen dabei ein VDI anstatt ein VMDK

VBoxManage clonehd ubuntuserver.vmdk ubuntuserver.vdi --format VDI --variant Standard
Schritt 2

Das neue VDI lässt sich jetzt auch anstandslos vergrössern

VBoxManage modifyhd ubuntuserver.vdi --resize 16384

Soweit so gut, aber jetzt müssen wir ja auch noch das VMDK gegen das VDI austauschen. Man könnte jetzt die Idee kommen, einfach kurz in die VirtualBox.xml-Konfigurationsdatei zu gehen. Was soll schon schief gehen, wir ändern ja nur VMDK in VDI ab oder? Falsch gedacht: Zum einen hat jede virtuelle HDD eine eigene UUID (85602eb5-b05b-26b9-b835-f87a2710d7da beispielsweise) und zum Anderen legt Virtualbox Kopien seiner Konfigurationsdateien an und überschreibt solche Änderungen gleich wieder.

Vielleicht mache ich mal einen Artikel darüber, wie man Virtualbox doch Änderungen unterschieben kann… aber das ist eine Geschichte für ein anderes Mal, heute bleiben wir brav :).

Schritt 3

Das neue VDI als primäres Laufwerk unserer virtuellen Maschine hinzufügen

VBoxManage storageattach ubuntuserver --storagectl "SATA Controller" --device 0 --port 0 --type hdd --medium /srv/VM/ubuntuserver.vdi

Öffnet man jetzt die Virtualbox GUI, sollte die neue HDD dort eingebunden sein und die virtuelle Maschine sollte sich starten lassen. Leider scheint aber das virtuelle Linus so garnichts von dieser Vergrösserung mitbekommen zu haben. Als Nächstes müssen wir also Partition und darauf liegendes Dateisystem vergrössern.

Schritt 4

Partition vergrössern und Dateisystem vergrössern (Normales Vorgehen)

Ubuntu-LiveCD bei der virtuellen Maschine einfügen, von CD starten, LiveSystem aufrufen und mittels gparted bzw. resize2fs die Partition vergrössern.

Aber das ist etwas langweilig oder? Viel cooler wäre es doch, wir würden die Partition im laufenden System vergrössern? 🙂

Partition vergrössern und Dateisystem vergrössern (Verrücktes Vorgehen)

Erstmal: Credits an Sergey, der diesen Vorschlag auf askubuntu gepostet hat: Sergeys Antwort auf Askubuntu

Und hier kommen die Schritte:

Hinweis: Prüft welche Platte ihr im virtuellen System vergrössen müsst, ich gehe hier von /dev/sda1 aus.

Schritt 1

Virtuelle HDD kopieren, damit man sie wiederherstellen kann, sollte was schief gehen (Macht das, eure Katze wird bestimmt genau dann übers Kabel stolpern).

Schritt 2

Virtuelles System booten und als root anmelden (Oder sich mit sudo Rootrechte verschaffen – ihr wisst was ich meine).

Schritt 3

Dann fdisk starten mittels

fdisk /dev/sda
Schritt 4

So, p zeigt uns die Liste der Partition an und jetzt notieren wir uns (Wichtig!) die start-cylinder von /dev/sda1 und ob das Bootflag (*) gesetzt ist.
Gerät        Boot    Start      Ende             Sektoren      Größe      Id      Typ
/dev/sda1  *            2048      117229567     117227520       55.9G         83      Linux

Schritt 5

Jetzt löschen wir mit d die Partition /dev/sda1. Ich weiss, dass ist ein komisches Gefühl, aber traut euch (gesichert ist ja, nicht wahr?).

Schritt 6

Mittels n erstellen wir eine neue Partition. Hierbei setzen wir die start-cylinder wieder genau gleich wie bei der gelöschten Partition (Also 2048 in unserem Beispiel). Als end-cylinder belassen wir es beim Default, dann wird nämlich der ganze verfügbare Platz avisiert.

Schritt 7

Falls die Platte ein Bootflag hatte (Sternchen), setzen wir das mit a auch wieder.

Schritt 8

Wir kontrollieren nochmals die Werte, welche wir eingegeben haben. Mittels w schreiben wir die Änderungen dann effektiv auf die Disk.

Schritt 9

Virtuelle Maschine neustarten und sich auf das super Gefühl freuen, wenn sie wieder hochkommt :).

Schritt 10

Nun haben wir die Partition vergrössert, aber das Dateisystem innerhalb der Partition ist immernoch dasselbe – das müssen wir als nächstes mit diesem kleinen Befehl korrigieren:

resize2fs /dev/sda1