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.