Jak zamontować obraz dystrybucyjny Raspberry Pi Linux?

37

Zwykłe obrazy systemu plików można łatwo zamontować:

mount system.img /mnt

Sprawdzone i zmodyfikowane. Ale kiedy próbuję tego z obrazem systemu Raspberry Pi (np. Raspbian), otrzymuję:

mount: unknown filesystem type '(null)'

I bez względu na to, z czym spróbuję -t, to nie zadziała. Jak mogę zamontować ten obraz?

Złotowłosa
źródło
2
Pytanie równoległe dla MS Windows: raspberrypi.stackexchange.com/questions/28457/… ?
złotowłosa

Odpowiedzi:

71

Odpowiedź na to pytanie jest częścią odpowiedzi na inne pytania, ale tutaj zasługuje na kanoniczne traktowanie, więc nie trzeba jej powtarzać.

Nie można zamontować obrazu jako całości, ponieważ zawiera on dwie partycje i sektor rozruchowy. Można jednak zamontować poszczególne partycje na obrazie, jeśli znasz ich przesunięcie w pliku. Aby je znaleźć, sprawdź obraz jako urządzenie blokowe za pomocą fdisk -l whatever.img. Dane wyjściowe powinny zawierać następującą tabelę:

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

To są dwie partycje. Pierwszy z nich nosi nazwę „FAT32”, a drugi „Linux”. Powyżej tej tabeli znajduje się kilka innych informacji o urządzeniu jako całości, w tym:

Units: sectors of 1 * 512 = 512 bytes

Możemy znaleźć przesunięcie w bajtach, mnożąc ten rozmiar jednostki przez Startblok partycji:

  • 1. partycja 512 * 8192 = 4194304
  • Druga partycja 512 * 122880 = 62914560

Można ich używać z offsetopcją mountpolecenia. Mamy również wskazówkę dotyczącą typu każdej partycji z fdisk. Zakładając, że mamy katalogi /mnt/img/onei są /mnt/img/twodostępne jako punkty montowania:

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

Jeśli pojawi się tutaj błąd „nakładającej się pętli”, twoja wersja mountwymaga podania rozmiaru, jak również przesunięcia pierwszej partycji. Odmontuj to i użyj liczby bloków (57344) * 512 (= 29360128):

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

Druga partycja nie potrzebuje limitu rozmiaru, ponieważ po obrazie nie ma nic.

Możesz teraz uzyskać dostęp do dwóch partycji. Jeśli nie zamierzasz niczego w nich zmieniać, użyj również przełącznika -r(tylko do odczytu). Jeśli cokolwiek zmienisz, zmiany te zostaną uwzględnione w .imgpliku.

Zauważ, że pierwsza partycja jest prawdopodobnie zamontowana na /bootdrugiej partycji, gdy system jest uruchomiony.

Złotowłosa
źródło
12
kpartx sprawia, że ​​jest to jeszcze łatwiejsze: kpartx -a whatever.imgtworzy odpowiednie (pętlowe) węzły, które później możesz zamontować do woli. Uruchom, kpartx -d whatever.imgaby usunąć (odmontowane) węzły pętli.
1
podobne: stackoverflow.com/a/1421075/544721
Grzegorz Wierzowiecki
Jak jednocześnie zamontować partycję root i boot: unix.stackexchange.com/q/342463/9689 ?
Grzegorz Wierzowiecki
1
PS Jeśli chcesz zamontować obie partycje w tym samym czasie, aby uniknąć błędu „nakładania się”, po prostu określ rozmiar partycji z sizelimitopcją. Aby uzyskać więcej informacji: unix.stackexchange.com/a/342466/9689 . (Btw. Powyższa odpowiedź może zostać zaktualizowana, aby zapewnić przykładowe użycie tej opcji)
Grzegorz Wierzowiecki
2
Zamiast mnożenia ręcznie, można użyć bash za arytmetycznego: $((8192*512)).
Ruslan
20

losetupzapewnia sondowanie partycji przez -P. Dzięki temu montowanie partycji obrazu pełnego dysku, takich jak obraz karty SD Raspbian, jest bardzo łatwe:

losetup -P /dev/loop0 raspbian.img
mount /dev/loop0p2 /mnt
mount /dev/loop0p1 /mnt/boot
Johan Ehnberg
źródło
Wydaje się to mniej podatne na błędy ludzkie. Czy mogę także używać etykiet w poleceniach montowania?
ctrl-alt-delor
1

Na początku używałem awk / grep do analizowania fdisk i wyciągania offsetów, ale odkryłem, że może to być nieco skomplikowane, płatkowe i trudne do zrozumienia później. Najłatwiejsza metoda, jaką znalazłem:

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}

Stwarza to temp-dir dla ciebie, automatycznie przypisuje następnej pętli-device i ustawia go dla Ciebie jak p1i p2działowych urządzeń, a wierzchowce bagażnik i korzeń.

Możesz także umieścić część oczyszczania w pułapce wyjścia, więc jeśli coś zawiedzie, nie będziesz mieć wiszących plików / mountów:

set -e
function cleanup {
  sudo umount -f $TMP/boot/
  sudo umount -f $TMP
  rmdir $TMP
}
trap cleanup EXIT
konsumer
źródło
0

W przypadku, gdy fdisk -l pokazuje się z sektorami zamiast bloków na Arch Linuxie ... Innym sposobem znalezienia liczby bloków w przypadku „błędu nakładania się pętli” jest odjęcie przesunięcia w bajtach pierwszej partycji od drugiej partycji i podziel przez dwa. Na przykład (62914560-4194304) / 2 = 29360128

AB
źródło