Wie montiere ich ein mit dd erstelltes SD-Karten-Image?

21

Ich habe ein Image meiner Raspberry Pi SD-Karte erstellt mit dd:

sudo dd if=/dev/sdf of=/home/myusername/raspberry-backup-2014-04-10.img

Die SD-Karte enthält zwei Partitionen (eine vfat, eine ext4), die automatisch gemountet werden, wenn ich die Karte einstecke.

Meine Frage: Wie kann ich diese Partitionen aus der IMG-Datei bereitstellen?


Mehr Details:

$ fdisk -l raspberry-backup-2014-04-10.img 

Disk raspberry-backup-2014-04-10.img: 3974 MB, 3974103040 bytes
255 heads, 63 sectors/track, 483 cylinders, total 7761920 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000981cb

                          Device Boot      Start         End      Blocks   Id  System
raspberry-backup-2014-04-10.img1            8192      122879       57344    c  W95 FAT32 (LBA)
raspberry-backup-2014-04-10.img2          122880     7761919     3819520   83  Linux
MrD
quelle
Sie möchten das Image mounten, ohne es auf die SD-Karte zu schreiben?
OrangeTux
Ja, ich möchte vollen Zugriff auf das in der IMG-Datei gespeicherte Dateisystem haben, damit ich kopieren / ändern / löschen / etc. Dateien ohne SD-Karte
MrD
Vielleicht hilft Ihnen diese Frage .
OrangeTux
Leider klappt das nicht, probierte beide Versuche. Der erste hat das Gerät / dev / loop0p1 nicht erstellt. Die zweite (ich habe den Startpunkt entsprechend berechnet) wirft ein wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or helper program, or other errorProblem auf
MrD
Darüber hinaus sudo fdisk -l /dev/loop0behauptet: Disk / dev / loop0 keine gültige Partitionstabelle enthält.
MrD

Antworten:

33

Um zu vermeiden, dass für jede Partition separate Images erstellt oder ein Hilfsprogramm wie dieses installiert werden muss kpartx, können Sie jede Partition einzeln bereitstellen, indem Sie offsetim mountBefehl einen angeben.

Untersuchen Sie zuerst die Partitionen in der Image-Datei und bestimmen Sie den Versatz mithilfe von fdisk:

$ fdisk -u -l rpi_image280914 

Disk rpi_image280914: 16.0 GB, 16012804096 bytes
255 heads, 63 sectors/track, 1946 cylinders, total 31275008 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000cdac7

           Device Boot      Start         End      Blocks   Id  System
rpi_image280914p1   *        2048      514047      256000    c  W95 FAT32 (LBA)
rpi_image280914p2          540672    31242239    15350784   83  Linux

Nehmen Sie den StartSektor der gewünschten Partition und multiplizieren Sie diesen Wert mit der UnitsGröße. Also, wenn Sie die zweite Partition wollen, werden Sie bekommen 540672 * 512 = 276824064.

Erstellen Sie nun einen Ordner und hängen Sie die Partition ein:

mkdir rpi_partition2
sudo mount -o loop,offset=276824064 rpi_image280914 rpi_partition2/

Sobald Sie mit den Partitionsdaten fertig sind, können Sie Folgendes tun:

sudo umount rpi_partition2/
rm -r rpi_partition2/
Futter
quelle
17

Nach einigen zusätzlichen Tests habe ich die Lösung selbst gefunden: kpartx

sudo kpartx -a raspberry-backup-2014-04-10.img

Dieser Befehl erstellt /dev/mapper/loop0p1und /dev/mapper/loop0p2. Danach können diese Partitionen direkt gemountet werden:

sudo mount -o rw -t ext4 /dev/mapper/loop0p2 mount_target/
MrD
quelle
1

Wenn Sie den Inhalt einer Partition (Dateisystem) untersuchen oder ändern möchten, hängt diese Befehlszeile das Dateisystem des SD- Karten-Dumps my_sdcard_dump.img in das Verzeichnis mount_dir ein .

part_id=2; INFILE=my_sdcard_dump.img; MOUNTPT=mount_dir PARTITION=${part_id}; sudo mount "$INFILE" "$MOUNTPT" -o loop,offset=$[ `/sbin/sfdisk -d "$INFILE" | grep "start=" | head -n $PARTITION | tail -n1 | sed 's/.*start=[ ]*//' | sed 's/,.*//'` * 512 ]
Davlar
quelle
0

Der Umgang mit einem Image einer ganzen Festplatte mit mehreren Partitionen ist recht schwierig . Linux ist nicht dafür ausgelegt, eine Partitionstabelle aus einer regulären Datei zu lesen, selbst wenn sie an ein Loopback-Gerät angehängt ist. Daher müssen Sie die Offsets der Partitionen sorgfältig identifizieren und sie an den mountBefehl übergeben.

Am besten erstellen Sie separate Images für jede Partition:

sudo dd if=/dev/sdf1 of=/home/myusername/raspberry-backup-sdf1-2014-04-10.img
sudo dd if=/dev/sdf2 of=/home/myusername/raspberry-backup-sdf2-2014-04-10.img

Jetzt können Sie diese Dateien einfach so behandeln, als wären sie einzelne Partitionen auf einer Festplatte, und sie wie eine echte Festplattenpartition mounten, indem Sie sie einem Loop-Gerät zuordnen . Ein Loop-Gerät oder Loopback-Gerät ist ein virtuelles Gerät, das eine Übersetzungsschicht für Linux bereitstellt, um eine Datei als Blockgerät (wie eine Festplatte oder Partition) zu behandeln.

Die Loop-Geräte sind in der Regel /dev/loop0durch /dev/loop8. Identifizieren Sie ein nicht verwendetes Loop-Gerät mit dem folgenden losetupBefehl:

$ sudo losetup /dev/loop0
loop: can't get info on device /dev/loop0: No such device or address

Diese Antwort zeigt ein nicht zugewiesenes Loop-Gerät an. Jetzt können wir das Loop-Gerät einer unserer Image-Dateien zuordnen:

$ sudo losetup /dev/loop0 /home/myusername/raspberry-backup-sdf1-2014-04-10.img

Das Fehlen der Ausgabe dieses Befehls zeigt den Erfolg an. Jetzt /dev/loop0ist es für die meisten Zwecke funktional äquivalent zu /dev/sdf1Ihrer SD-Karte und Sie können es wie gewohnt einbinden:

sudo mount -t vfat /dev/loop0 /media/sdimage-1

Wiederholen Sie den Vorgang mit einem anderen Loop-Gerät, um die andere Partition einzuhängen. Wenn Sie fertig sind, heben Sie die Bereitstellung der Dateisysteme auf und heben Sie die Zuweisung der Loop-Geräte auf:

sudo umount /dev/loop0
sudo losetup -d /dev/loop0
tgies
quelle
Ich möchte es vermeiden, zwei Bilddateien zu erstellen, da ich das Bild unter anderem aus geringfügigen Gründen an andere Personen verteilen möchte, damit diese damit ihre SD-Karten initialisieren können. Daher müssen sich die verschiedenen Partitionen wie / boot etc. in einer Datei befinden.
MrD