¿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

¿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/

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/

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 ]

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.