¿Cómo puedo montar una imagen de distribución de Raspberry Pi Linux?

37

Las imágenes normales del sistema de archivos se pueden montar fácilmente:

mount system.img /mnt

Examinado y modificado. Pero cuando intento esto con una imagen del sistema Raspberry Pi (por ejemplo, raspbian), obtengo:

mount: unknown filesystem type '(null)'

Y no importa con qué lo intente -t, no funcionará. ¿Cómo puedo montar esta imagen?

Ricitos de oro
fuente
2
La pregunta paralela para MS Windows: raspberrypi.stackexchange.com/questions/28457/… ?
goldilocks

Respuestas:

71

Esta pregunta se responde como parte de la respuesta a otras preguntas, pero merece un tratamiento canónico aquí, por lo que no tiene que repetirse.

No puede montar la imagen como un todo porque en realidad contiene dos particiones y un sector de arranque. Sin embargo, puede montar las particiones individuales en la imagen si conoce su desplazamiento dentro del archivo. Para encontrarlos, examine la imagen como un dispositivo de bloque con fdisk -l whatever.img. La salida debe incluir una tabla como esta:

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

Estas son las dos particiones. El primero está etiquetado "FAT32", y el otro "Linux". Encima de esta tabla, hay otra información sobre el dispositivo en su conjunto, que incluye:

Units: sectors of 1 * 512 = 512 bytes

Podemos encontrar el desplazamiento en bytes multiplicando el tamaño de esta unidad por el Startbloque de la partición:

  • Primera partición 512 * 8192 = 4194304
  • 2da partición 512 * 122880 = 62914560

Estos se pueden usar con la offsetopción del mountcomando. También tenemos una pista sobre el tipo de cada partición fdisk. Entonces, suponiendo que tengamos directorios /mnt/img/oney /mnt/img/twoestén disponibles como puntos de montaje:

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

Si obtiene un error de "bucle superpuesto" aquí, su versión mountrequiere que especifique el tamaño y el desplazamiento de la primera partición. Desmonta eso y usa el número de bloques (57344) * 512 (= 29360128):

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

La segunda partición no necesita un límite de tamaño, ya que no hay nada después en la imagen.

Ahora puede acceder a las dos particiones. Si no tiene la intención de cambiar nada en ellos, use el -rinterruptor (solo lectura) también. Si cambia algo, esos cambios se incluirán en el .imgarchivo.

Tenga en cuenta que la primera partición probablemente esté montada /booten la segunda partición cuando el sistema se esté ejecutando.

Ricitos de oro
fuente
12
kpartx lo hace aún más fácil para usted: crea loskpartx -a whatever.img nodos (de bucle) apropiados, que luego puede montar a voluntad. Ejecute kpartx -d whatever.imgpara eliminar los nodos de bucle (desmontados).
1
similar: stackoverflow.com/a/1421075/544721
Grzegorz Wierzowiecki
Cómo montar la partición raíz y de arranque simultáneamente: unix.stackexchange.com/q/342463/9689 ?
Grzegorz Wierzowiecki
1
PD: si se desea montar ambas particiones al mismo tiempo, para evitar el error de "superposición", simplemente especifique el tamaño de la partición con la sizelimitopción. Para más información: unix.stackexchange.com/a/342466/9689 . (Por cierto, la respuesta anterior se puede actualizar para proporcionar un uso de ejemplo de esa opción)
Grzegorz Wierzowiecki
2
En lugar de multiplicar de forma manual, puede utilizar expansión aritmética de fiesta: $((8192*512)).
Ruslan
20

losetupproporciona sondeo de particiones -P. Usar esto hace que montar particiones de una imagen de disco completa, como la imagen de la tarjeta SD Raspbian, sea muy fácil:

losetup -P /dev/loop0 raspbian.img
mount /dev/loop0p2 /mnt
mount /dev/loop0p1 /mnt/boot
Johan Ehnberg
fuente
Esto parece menos propenso al error humano. ¿Puedo usar también etiquetas en los comandos de montaje?
ctrl-alt-delor
1

Al principio, estaba usando awk / grep para analizar fdisk y extraer compensaciones, pero descubrí que podría ser un poco complicado, poco convincente y difícil de entender más adelante. El método más fácil que he encontrado:

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}

Esto crea un temp-dir para usted, auto-asigna el siguiente bucle-dispositivo y lo configura para usted como p1y p2partición de los dispositivos y soportes de arranque y raíz.

También puede colocar la parte de limpieza en una trampa de salida, por lo que si algo falla no tendrá montajes / archivos colgantes:

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

En caso de que fdisk -l aparezca con sectores en lugar de bloques en Arch Linux ... Otra forma de encontrar el número de bloques en caso de "error de bucle superpuesto" es restar el desplazamiento en bytes de la primera partición de la segunda partición y dividir por dos. Por ejemplo (62914560-4194304) / 2 = 29360128

AB
fuente