Come montare l'immagine della scheda SD creata con dd?


21

Ho creato un'immagine della mia scheda SD Raspberry Pi usando dd:

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

La scheda SD include due partizioni (una vfat, una ext4) che vengono montate automaticamente quando inserisco la scheda.

La mia domanda: come posso montare queste partizioni dal file .img?


Più dettagli:

$ 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

Vuoi montare l'immagine senza scriverla sulla scheda SD?
OrangeTux,

Sì, voglio avere pieno accesso al filesystem memorizzato nel file .img in modo da poter copiare / modificare / cancellare / ecc. file senza avere una scheda SD
MrD

Forse questa domanda ti aiuta.
OrangeTux,

Purtroppo questo non funziona, ho provato entrambi i tentativi. Il primo non ha creato il dispositivo / dev / loop0p1. Il secondo (ho calcolato il punto di partenza di conseguenza) pone un wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or helper program, or other errorproblema
MrD

Inoltre, sudo fdisk -l /dev/loop0afferma: Disk / dev / loop0 non contiene una tabella delle partizioni valida.
MrD

Risposte:


33

Per evitare la necessità di creare immagini separate per ogni partizione o installare un'utilità simile kpartx, è possibile montare ciascuna partizione singolarmente specificando un offsetnel mountcomando.

Prima esamina le partizioni nel file immagine e determina l'offset usando 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

Prendi il Startsettore della partizione che desideri e moltiplica quel valore per la Unitsdimensione. Quindi, se vuoi la seconda partizione, otterrai 540672 * 512 = 276824064.

Ora crea una cartella e monta la partizione:

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

Una volta terminato di fare ciò che vuoi con i dati della partizione:

sudo umount rpi_partition2/
rm -r rpi_partition2/

17

Dopo alcuni test addizionali ho trovato la soluzione da solo: kpartx

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

Questo comando ha creato /dev/mapper/loop0p1e /dev/mapper/loop0p2. Successivamente queste partizioni possono essere montate direttamente:

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

1

se il tuo obiettivo è esplorare o modificare il contenuto di una partizione (file system), questa riga di comando monterà il file system del dump della scheda SD my_sdcard_dump.img nella directory mount_dir .

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 ]

0

Trattare un'immagine di un intero disco con più partizioni è piuttosto complicato . Linux non è stato progettato per leggere una tabella delle partizioni da un file normale, anche se collegato a un dispositivo di loopback, quindi è necessario identificare attentamente gli offset delle partizioni e passarli al mountcomando.

Il modo preferibile sarebbe creare immagini separate di ogni partizione:

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

Ora puoi facilmente trattare questi file come se fossero partizioni individuali su un disco, montandoli come faresti normalmente su una vera partizione del disco, mappandoli su un dispositivo loop . Un dispositivo loop o dispositivo loopback è un dispositivo virtuale che fornisce un livello di traduzione per Linux per trattare un file come un dispositivo a blocchi (come un disco o una partizione).

I dispositivi loop sono in genere /dev/loop0passati /dev/loop8. Identificare un dispositivo ad anello inutilizzato con il losetupcomando:

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

Questa risposta indica un dispositivo loop non assegnato. Ora possiamo assegnare il dispositivo loop a uno dei nostri file di immagini:

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

L'assenza di output da questo comando indica il successo. Ora /dev/loop0per la maggior parte degli scopi è funzionalmente equivalente alla /dev/sdf1tua scheda SD e puoi montarla come faresti normalmente:

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

Ripetere il processo utilizzando un altro dispositivo ad anello per montare l'altra partizione. Al termine, smontare i filesystem e annullare l'assegnazione dei dispositivi loop:

sudo umount /dev/loop0
sudo losetup -d /dev/loop0

Vorrei evitare di creare due file di immagini, perché - tra le altre ragioni minori - vorrei distribuire l'immagine ad altre persone in modo che possano usarla per inizializzare le loro schede SD. Pertanto, le diverse partizioni come / boot ecc. Devono trovarsi in un unico file.
MrD
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.