Come posso montare un'immagine distro di Raspberry Pi Linux?


37

Le normali immagini del filesystem possono essere facilmente montate:

mount system.img /mnt

Esaminato e modificato. Ma quando provo questo con un'immagine di sistema di Raspberry Pi (ad es. Raspbian), ottengo:

mount: unknown filesystem type '(null)'

E non importa cosa provo -t, non funzionerà. Come posso montare questa immagine?


2
La domanda parallela per MS Windows: raspberrypi.stackexchange.com/questions/28457/… ?
Riccioli d'oro

Risposte:


71

A questa domanda viene data risposta come parte della risposta ad altre domande, ma qui merita un trattamento canonico, quindi non deve essere ripetuto.

Non è possibile montare l'immagine nel suo insieme perché in realtà contiene due partizioni e un settore di avvio. Tuttavia, è possibile montare le singole partizioni nell'immagine se si conosce il loro offset all'interno del file. Per trovarli, esamina l'immagine come un dispositivo a blocchi con fdisk -l whatever.img. L'output dovrebbe includere una tabella come questa:

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

Queste sono le due partizioni. Il primo è etichettato "FAT32" e l'altro "Linux". Sopra questa tabella, ci sono alcune altre informazioni sul dispositivo nel suo insieme, tra cui:

Units: sectors of 1 * 512 = 512 bytes

Possiamo trovare l'offset in byte moltiplicando questa dimensione dell'unità per il Startblocco della partizione:

  • 1a partizione 512 * 8192 = 4194304
  • 2a partizione 512 * 122880 = 62914560

Questi possono essere usati con l' offsetopzione del mountcomando. Abbiamo anche un indizio sul tipo di ogni partizione da fdisk. Quindi, presumendo che abbiamo directory /mnt/img/onee /mnt/img/twodisponibili come punti di montaggio:

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

Se viene visualizzato un errore "loop sovrapposto", la versione di mountrichiede di specificare la dimensione e l'offset della prima partizione. Smontalo e usa il numero di blocchi (57344) * 512 (= 29360128):

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

La seconda partizione non ha bisogno di un sizelimit poiché non c'è nulla dopo di essa nell'immagine.

Ora puoi accedere alle due partizioni. Se non si intende modificare nulla, utilizzare anche l' -ropzione (sola lettura). Se si modifica qualcosa, tali modifiche verranno incluse nel .imgfile.

Si noti che la prima partizione è probabilmente montata sulla /bootseconda partizione quando il sistema è in esecuzione.


12
kpartx ti semplifica ulteriormente: kpartx -a whatever.imgcrea i nodi (loop) appropriati, che puoi montare successivamente a piacimento. Esegui kpartx -d whatever.imgper eliminare i nodi del ciclo (non montato).


Come montare contemporaneamente la partizione di root e di avvio: unix.stackexchange.com/q/342463/9689 ?
Grzegorz Wierzowiecki,

1
PS Se si desidera montare entrambe le partizioni contemporaneamente, al fine di evitare errori di "sovrapposizione", è sufficiente specificare la dimensione della partizione con l' sizelimitopzione. Per maggiori informazioni: unix.stackexchange.com/a/342466/9689 . (A proposito, la risposta sopra può essere aggiornata per fornire un esempio di utilizzo di tale opzione)
Grzegorz Wierzowiecki,

2
Invece di moltiplicare manualmente, è possibile utilizzare Espansione aritmetica di bash: $((8192*512)).
Ruslan,

20

losetupfornisce sondaggi di partizione attraverso -P. L'utilizzo di questo rende molto semplice il montaggio di partizioni di un'immagine del disco completo come l'immagine della scheda SD Raspbian:

losetup -P /dev/loop0 raspbian.img
mount /dev/loop0p2 /mnt
mount /dev/loop0p1 /mnt/boot

Questo sembra meno soggetto all'errore umano. Posso usare anche le etichette nei comandi mount?
ctrl-alt-delor

1

Inizialmente stavo usando awk / grep per analizzare fdisk ed estrarre offset, ma ho scoperto che potrebbe essere un po 'complicato, imperfetto e difficile da capire in seguito. Il metodo più semplice che ho trovato:

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}

Questo crea una temp-dir per te, assegna automaticamente il prossimo loop-device e lo configura come p1e come p2dispositivi di partizione e monta boot e root.

Puoi anche mettere la parte di pulizia in una trappola di uscita, quindi se qualcosa non riesce non avrai supporti / file sospesi:

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

0

Nel caso in cui fdisk -l venga visualizzato con settori anziché blocchi su Arch Linux ... Un altro modo per trovare il numero di blocchi in caso di "errore loop sovrapposto" è sottrarre l'offset in byte della prima partizione dalla seconda partizione e dividi per due. Ad esempio (62914560-4194304) / 2 = 29360128

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.