Wie kann ich ein Raspberry Pi Linux-Distro-Image mounten?

37

Normale Dateisystem-Images können einfach eingehängt werden:

mount system.img /mnt

Untersucht und modifiziert. Aber wenn ich das mit einem Himbeer-Pi-System-Image (zB Himbeer) versuche, erhalte ich:

mount: unknown filesystem type '(null)'

Und egal mit was ich es versuche -t, es wird nicht funktionieren. Wie kann ich dieses Image einbinden?

Goldlöckchen
quelle
2
Die parallele Frage für MS Windows: raspberrypi.stackexchange.com/questions/28457/… ?
Goldlöckchen

Antworten:

71

Diese Frage wird als Teil der Antwort auf andere Fragen beantwortet, verdient jedoch hier eine kanonische Behandlung, sodass sie nicht wiederholt werden muss.

Sie können das Image nicht als Ganzes bereitstellen, da es tatsächlich zwei Partitionen und einen Bootsektor enthält. Sie können jedoch die einzelnen Partitionen im Image mounten, wenn Sie den Versatz in der Datei kennen. Um sie zu finden, untersuchen Sie das Bild als Blockgerät mit fdisk -l whatever.img. Die Ausgabe sollte eine Tabelle wie die folgende enthalten:

Device         Boot     Start       End  Blocks  Id System
whatever.img1            8192    122879   57344   c W95 FAT32 (LBA)
whatever.img2          122880   5785599 2831360  83 Linux

Dies sind die beiden Partitionen. Der erste ist mit "FAT32" und der andere mit "Linux" gekennzeichnet. Über dieser Tabelle befinden sich einige weitere Informationen zum gesamten Gerät, darunter:

Units: sectors of 1 * 512 = 512 bytes

Wir können den Versatz in Bytes finden, indem wir diese Einheitsgröße mit dem StartBlock der Partition multiplizieren :

  • 1. Partition 512 * 8192 = 4194304
  • 2. Partition 512 * 122880 = 62914560

Diese können mit der offsetOption des mountBefehls verwendet werden. Wir haben auch einen Hinweis auf den Typ jeder Partition von fdisk. Vorausgesetzt, wir haben Verzeichnisse /mnt/img/oneund /mnt/img/twostehen als Mount-Punkte zur Verfügung:

mount -v -o offset=4194304 -t vfat whatever.img /mnt/img/one
mount -v -o offset=62914560 -t ext4 whatever.img /mnt/img/two

Wenn Sie hier eine Fehlermeldung "Überlappende Schleife" erhalten, mountmüssen Sie in Ihrer Version von die Größe sowie den Versatz der ersten Partition angeben. Hängen Sie das aus und verwenden Sie die Anzahl der Blöcke (57344) * 512 (= 29360128):

mount -v -o offset=4194304,sizelimit=29360128 \
    -t vfat whatever.img /mnt/img/one  

Die zweite Partition benötigt kein Größenlimit, da im Image nichts danach steht.

Sie können jetzt auf die beiden Partitionen zugreifen. Wenn Sie daran nichts ändern möchten, verwenden Sie auch den -r(schreibgeschützten) Schalter. Wenn Sie etwas ändern, werden diese Änderungen in die .imgDatei aufgenommen.

Beachten Sie, dass die erste Partition wahrscheinlich /bootin der zweiten Partition gemountet ist, wenn das System ausgeführt wird.

Goldlöckchen
quelle
12
kpartx macht es Ihnen noch einfacher: Es erstellt kpartx -a whatever.imgdie entsprechenden (Schleifen-) Knoten, die Sie später nach Belieben einbinden können. Führen Sie kpartx -d whatever.imgden Befehl aus, um die (nicht bereitgestellten) Schleifenknoten zu löschen.
1
ähnlich: stackoverflow.com/a/1421075/544721
Grzegorz Wierzowiecki
So hängen Sie Root- und Boot-Partition gleichzeitig ein: unix.stackexchange.com/q/342463/9689 ?
Grzegorz Wierzowiecki
1
PS Wenn beide Partitionen gleichzeitig gemountet werden sollen, geben Sie einfach die Partitionsgröße mit der sizelimitOption an, um "Überlappungsfehler" zu vermeiden . Für weitere Informationen: unix.stackexchange.com/a/342466/9689 . (Übrigens kann die obige Antwort aktualisiert werden, um ein Beispiel für die Verwendung dieser Option bereitzustellen.)
Grzegorz Wierzowiecki
2
Anstatt manuell multiplizieren, können Sie bash Arithmetic Expansion verwenden: $((8192*512)).
Ruslan
20

losetupErmöglicht das Durchsuchen von Partitionen -P. Dadurch wird das Mounten von Partitionen eines vollständigen Festplatten-Images wie dem Raspbian SD-Karten-Image sehr einfach:

losetup -P /dev/loop0 raspbian.img
mount /dev/loop0p2 /mnt
mount /dev/loop0p1 /mnt/boot
Johan Ehnberg
quelle
Dies scheint weniger anfällig für menschliches Versagen zu sein. Kann ich in den mount-Befehlen auch Labels verwenden?
Strg-Alt-Delor
1

Zuerst benutzte ich awk / grep, um fdisk zu analysieren und Offsets herauszuziehen, fand aber heraus, dass es ein bisschen kompliziert, flippig und später schwer zu verstehen sein könnte. Die einfachste Methode, die ich gefunden habe:

IMAGE_FILE="YOUR IMAGE FILE GOES HERE"
TMP=$(mktemp -d)
LOOP=$(sudo losetup --show -fP "${IMAGE_FILE}")
sudo mount ${LOOP}p2 $TMP
sudo mount ${LOOP}p1 $TMP/boot/

# do stuff to ${TMP}/ which is rpi filesystem

# cleanup
umount ${TMP}/boot/
umount ${TMP}
rmdir ${TMP}

Dies erstellt ein temporäres Verzeichnis für Sie, weist automatisch das nächste Loop-Gerät zu und richtet es für Sie als p1und p2Partitionierungsgeräte ein und hängt Boot und Root ein.

Sie können den Bereinigungsteil auch in eine Exit-Falle stellen. Wenn also etwas fehlschlägt, werden keine Mounts / Dateien mehr hängen:

set -e
function cleanup {
  sudo umount -f $TMP/boot/
  sudo umount -f $TMP
  rmdir $TMP
}
trap cleanup EXIT
konsumer
quelle
0

Falls fdisk -l unter Arch linux mit Sektoren anstelle von Blöcken angezeigt wird ... Eine andere Möglichkeit, die Anzahl der Blöcke im Falle eines "überlappenden Schleifenfehlers" zu ermitteln, besteht darin, den Versatz in Bytes der ersten Partition von der zweiten Partition zu subtrahieren und durch zwei teilen. Zum Beispiel (62914560-4194304) / 2 = 29360128

AB
quelle