¿Cómo montar una imagen de tarjeta SD creada con dd?

21

He creado una imagen de mi tarjeta SD Raspberry Pi usando dd:

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

La tarjeta SD incluye dos particiones (una vfat, una ext4) que se montan automáticamente cuando enchufo la tarjeta.

Mi pregunta: ¿Cómo puedo montar estas particiones desde el archivo .img?


Más detalles:

$ 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
MrD
fuente
¿Desea montar la imagen sin escribirla en la tarjeta SD?
OrangeTux
Sí, deseo tener acceso completo al sistema de archivos almacenado en el archivo .img para poder copiar / modificar / eliminar / etc. archivos sin tener una tarjeta SD
MrD
Quizás esta pregunta te ayude.
OrangeTux
Lamentablemente esto no funciona, probé ambos intentos. El primero no creó el dispositivo / dev / loop0p1. El segundo (he calculado el punto de partida en consecuencia) arroja un wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or helper program, or other errorproblema
MrD
Además, sudo fdisk -l /dev/loop0afirma: Disk / dev / loop0 no contiene una tabla de partición válida.
MrD

Respuestas:

33

Para evitar la necesidad de crear imágenes separadas para cada partición o instalar una utilidad como kpartx, puede montar cada partición individualmente especificando una offseten el mountcomando.

Primero examine las particiones en el archivo de imagen y determine el desplazamiento 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

Tome el Startsector de la partición que desee y multiplique ese valor por el Unitstamaño. Entonces, si quieres la segunda partición obtendrás 540672 * 512 = 276824064.

Ahora cree una carpeta y monte la partición:

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

Una vez que haya terminado de hacer lo que desea con los datos de partición:

sudo umount rpi_partition2/
rm -r rpi_partition2/
Forraje
fuente
17

Después de algunas pruebas adicionales, encontré la solución yo mismo: kpartx

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

Este comando creado /dev/mapper/loop0p1y /dev/mapper/loop0p2. Luego, estas particiones se pueden montar directamente:

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

si su objetivo es explorar o modificar el contenido de una partición (sistema de archivos), esta línea de comando montará el sistema de archivos de la tarjeta sd dump my_sdcard_dump.img en el directorio 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 ]
davlar
fuente
0

Tratar con una imagen de un disco completo con múltiples particiones es bastante complicado . Linux no fue diseñado para leer una tabla de particiones de un archivo normal, incluso cuando está conectado a un dispositivo de bucle invertido, por lo que debe identificar cuidadosamente los desplazamientos de las particiones y pasarlas al mountcomando.

La forma preferible sería crear imágenes separadas de cada partición:

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

Ahora puede tratar fácilmente estos archivos como si fueran particiones individuales en un disco, montándolos como lo haría normalmente con una partición de disco real, asignándolos a un dispositivo de bucle . Un dispositivo de bucle, o dispositivo de bucle invertido, es un dispositivo virtual que proporciona una capa de traducción para que Linux trate un archivo como un dispositivo de bloque (como un disco o partición).

Los dispositivos de bucle son típicamente a /dev/loop0través /dev/loop8. Identifique un dispositivo de bucle no utilizado con el losetupcomando:

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

Esta respuesta indica un dispositivo de bucle no asignado. Ahora podemos asignar el dispositivo de bucle a uno de nuestros archivos de imagen:

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

La ausencia de salida de este comando indica éxito. Ahora /dev/loop0es para la mayoría de los propósitos funcionalmente equivalente a /dev/sdf1su tarjeta SD, y puede montarla como lo haría normalmente:

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

Repita el proceso utilizando otro dispositivo de bucle para montar la otra partición. Cuando haya terminado, desmonte los sistemas de archivos y desasigne los dispositivos de bucle:

sudo umount /dev/loop0
sudo losetup -d /dev/loop0
tgies
fuente
Me gustaría evitar crear dos archivos de imagen porque, entre otras razones menores, me gustaría distribuir la imagen a otras personas para que puedan usarla para inicializar sus tarjetas SD. Por lo tanto, las diferentes particiones como / boot, etc. deben estar en un archivo.
MrD