Linux: Eine Partition im Disk-Image mounten

Neulich stand ich vor dem Problem, eine Partition innerhalb eines Disk-Images mounten zu müssen. Das Image wurde mit dd of=IMAGE-FILE if=/dev/sdb erstellt, so dass alle Partitionen des ursprünglichen Datenträgers darin enthalten sind. Ein unparametriertes mount erwartet den Einstieg in das Dateisystem am Anfang der Image-Datei. Da sich dort jedoch die Partitionstabelle befindet, schlägt das Mounten als Loop-Device zunächst fehl. Hier folgt eine Anleitung, wie eine Partition in einem Disk-Image gemountet werden kann.

Zunächst werden wir das Offset bestimmen, an dem die gewünschte Partition beginnt. Dazu werden wir das Disk-Image an ein Loop-Device binden. Den benötigten Namen des nächsten freien Loop-Device erhalten wir mit dem Befehl

$ sudo losetup -f

Als Beispiel liefert dieser Befehl die Ausgabe /dev/loop1, das wir im folgenden verwenden. An diesen Gerätenamen binden wir das Disk-Image:

$ sudo losetup /dev/loop1 IMAGE-FILE

Die im Disk-Image enthaltenen Partitionen und ihre Startpositionen erhalten wir mit:

$ sudo fdisk -lu /dev/loop1
Platte /dev/loop1: 8168 MByte, 8168931328 Byte
255 Köpfe, 63 Sektoren/Spur, 993 Zylinder, zusammen 15954944 Sektoren
Einheiten = Sektoren von 1 × 512 = 512 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Gerät  boot.     Anfang        Ende     Blöcke   Id  System
/dev/loop1p1   *          63      144584       72261    c  W95 FAT32 (LBA)
/dev/loop1p2          144585    15952544     7903980   83  Linux

Das Loop-Device kann jetzt wieder entbunden werden:

$ sudo losetup -d /dev/loop1

Anhand der obigen fdisk-Ausgabe kann der Offset berechnet werden, an dem die gewünschte Partition innerhalb der Datei beginnt. Im Beispiel wollen wir die Partition 2 (Linux) mounten. Der Offset in Bytes ergibt sich hier durch die Multiplikation der Sektorengröße (512 Bytes) mit der Nummer des Tartsektors (144585): =74027520. Dieser Offset wird beim mount-Aufruf angegeben:

$ sudo mount -o loop,offset=74027520 IMAGE-FILE MOUNT-POINT