Gefällt dir dieser Artikel?

VirtualBox: VDI Image in Linux mounten

erschienen in der Kategorie Software, am 05.09.2016
Schnatterente
Es gibt Situationen, in denen es sinnvoll oder gar zwingend nötig sein kann, das VDI-Image einer VirtualBox auf dem Host zu mounten, beispielsweise um ein nicht mehr bootbares Gast-System wieder flott zu machen.

Auch in diesem Fall führen verschiedene Wege nach Rom. So finden sich in den Weiten des WWW einige Tutorials mit unterschiedlichen Vorgehensweisen. Ich musste aber kürzlich feststellen, dass einige der vorgeschlagenen Lösungen wohl nicht mehr funktionieren. Daher will ich hier kurz eine gängige Variante aufzeigen.

VirtualBox VDI einhängen: Zutaten

Wir brauchen ein VirtualBox Disk Image (VDI), fdisk, QEMU und einen Linux-Kernel, der Network Block Devices (NBD) sowie Virtualisierung (Kernel-based Virtual Machine = KVM) unterstützt.

Die genannten Programme sollten sich alle sehr einfach über die Paketverwaltung des jeweiligen Systems installieren lassen.

Fdisk ist ein kleines Festplattenpartitionierungsprogramm, das die meisten Linuxnutzer sicher schon kennen und das zumeist auch schon auf dem System installiert ist.
QEMU ist eine freie virtuelle Maschine, die sich in ihrem Funktionsumfang mit VirtualBox vergleichen lässt. Wir benutzen von dieser Software aber nur das kleine Tool qemu-nbd. Das ist quasi eine eierlegende Wollmilchsau zum Mounten von so ziemlich allen gängigen Dateisystemen.

Bezüglich der aufgezeigten Kernelparameter müssen sich die Nutzer von binary-basierten Linuxdistributionen wie Ubuntu, Debian oder Fedora keine Sorgen machen, der installierte Kernel kann das. (Ihr könnt den folgenden Teil überspringen.)

Wer hingegen mit Gentoo oder einem anderen System arbeitet, bei dem man seinen Linux-Kernel noch selbst baut, sollte die folgenden Kerneloptionen aktivieren:

[*] Virtualization setup  --->
    <*> Kernel-based Virtual Machine (KVM) support
    <*> KVM for Intel|AMD processors support    (je nach CPU wählen)
[*] Networking support
Device drivers --->
    [*] Block devices -->
        <M> Network block device support


Ich habe mich hier dafür entschieden, nbd nur als Modul zu bauen, da ich es selten brauche. Wer das auch so machen will, kann es mit modprobe laden:
modprobe nbd

Natürlich muss man im Kernel (unter File systems) auch die Unterstützung für das zu mountende Dateisystem aktivieren, um es später einhängen zu können.

VirtualBox VDI einhängen: Zubereitung

Nachdem alles installiert ist, kann die *.vdi-Datei wie folgt (als root-Nutzer) eingehängt werden:

Zuerst laden wir das VDI in ein Network Block Device.
# qemu-nbd -c /dev/nbd0 meinimage.vdi

Die Gerätedatei /dev/ndb0 sollte dafür schon vorhanden sein. Dies ist immer der Fall, wenn das Kernelmodul nbd geladen ist. Der Parameter -c steht für "connect" und lädt die VDI-Datei. Nach diesem Schritt kann man /dev/ndb0 wie eine normale Festplatte benutzen. Mit fdisk schauen wir uns die Partitionierung an.
# fdisk -l /dev/nbd0

In meinem Fall erfolgt daraufhin diese Ausgabe:
Festplatte /dev/nbd0: 50 GiB, 53687091200 Bytes, 104857600 Sektoren
Einheiten: Sektoren von 1 * 512 = 512 Bytes
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes
Festplattenbezeichnungstyp: dos
Festplattenbezeichner: 0x0008610c

Gerät       Boot    Anfang      Ende  Sektoren Größe Kn Typ
/dev/nbd0p1 *         2048 100511743 100509696 47,9G 83 Linux
/dev/nbd0p2      100513790 104855551   4341762  2,1G  5 Erweiterte
/dev/nbd0p5      100513792 104855551   4341760  2,1G 82 Linux Swap/Solaris

Wir sehen, dass fdisk alle vorhandenen Partitionen auflistet und ihnen auch ein Gerät zuordnet. Das Verwirrende ist nun, dass es die Geräte-Dateien /dev/nbd0pX nicht gibt. Wir haben nur Zugriff auf /dev/nbd0. Um dennoch eine Partition einhängen zu können, behelfen wir uns daher mit einem Trick. Wir geben beim Mounten den Beginn der jeweiligen Partition als Offset an und benutzen als Gerät einfach die Festplatte /dev/nbd0 (und eben nicht die spezifische Partition).
mount -o offset=1048576 /dev/nbd0 /mnt/vdi/


Damit ist die erste Partition der Festplatte in /mnt/vdi/ eingehängt. Nun fragt ihr euch sicher, woher die Zahl 1048576 kommt. Dabei handelt es sich um das Produkt der Blockgröße (512 Byte) und des Anfangs der zu mountenden Partition auf der Festplatte (2048).

Um beispielsweise die Swap-Partition zu mounten (was zugegebenermaßen wenig Sinn macht) hättet ihr beim Offset das Produkt von 512*100513792 angeben müssen. Auf diesem Wege kann man also jede Partition des Datenträgers mounten. Wer kein guter Kopfrechner ist und keinen Taschenrechner zur Hand oder installiert hat, kann übrigens auf der Linuxkonsole rechnen:
# echo "$((512 * 2048))"

Die Bash antwortet dann brav mit 1048576.

Man kann nun auf dem eingehangenen Dateisystem lesen und schreiben. Ich rate allerdings davon ab, dies zu machen, während die virtuelle Maschine läuft (hierfür sollte man besser über das Virtualbox-Menü einen "gemeinsamen Ordner" anlegen). Man kann sich nämlich nicht sicher sein, ob die VirtualBox das Dateisystem immer in Echtzeit aktualisiert oder ob sie manche Änderungen nur im Hauptspeicher vornimmt, um sie später ins Disk Image zu schreiben.

Außerdem habe ich festgestellt, dass es zu inkonsistenten Daten kommen kann, wenn man für eine VirtualBox schon Sicherungspunkte (Snapshots) angelegt hat. In diesem Fall sehen die Daten aus Sicht des Gast-Systems anders aus, als die Daten auf dem im Host-System gemounteten Dateisystem. (Scheinbar schreibt die VM die Änderungen irgendwo anders hin, bis man den Sicherungspunkt wieder entfernt.)

Um das Dateisystem wieder auszuhängen, benutzt man den üblichen umount-Befehl, gefolgt von einem "disconnect"-Kommando (-d) für das VDI-Image:
# umount /mnt/vdi/
# qemu-nbd -d /dev/nbd0


Das war dann aus meiner Sicht alles Wissenswerte zum Mounten von VirtualBox Disk Images.
Bei Fragen einfach fragen!

Geschnatter

0 Kommentare, selbst mitschnattern
Diesen Beitrag hat noch niemand kommentiert. Möchtest du den Anfang machen ?