Como montar uma imagem de distribuição do Raspberry Pi Linux?

37

Imagens normais do sistema de arquivos podem ser facilmente montadas:

mount system.img /mnt

Examinado e modificado. Mas quando eu tento isso com uma imagem do sistema Raspberry Pi (por exemplo, raspbian), recebo:

mount: unknown filesystem type '(null)'

E não importa o que eu tente -t, não vai funcionar. Como montar esta imagem?

Cachinhos Dourados
fonte
2
A pergunta paralela para o MS Windows: raspberrypi.stackexchange.com/questions/28457/… ?
goldilocks

Respostas:

71

Esta pergunta é respondida como parte da resposta a outras perguntas, mas merece tratamento canônico aqui, para que não precise ser repetida.

Você não pode montar a imagem como um todo, pois ela contém duas partições e um setor de inicialização. No entanto, você pode montar as partições individuais na imagem se souber o deslocamento dentro do arquivo. Para encontrá-los, examine a imagem como um dispositivo de bloco com fdisk -l whatever.img. A saída deve incluir uma tabela 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 são as duas partições. O primeiro é rotulado como "FAT32" e o outro "Linux". Acima desta tabela, há outras informações sobre o dispositivo como um todo, incluindo:

Units: sectors of 1 * 512 = 512 bytes

Podemos encontrar o deslocamento em bytes multiplicando esse tamanho de unidade pelo Startbloco da partição:

  • 1ª partição 512 * 8192 = 4194304
  • Segunda partição 512 * 122880 = 62914560

Estes podem ser usados ​​com a offsetopção do mountcomando Também temos uma pista sobre o tipo de cada partição fdisk. Portanto, presumindo que tenhamos diretórios /mnt/img/onee /mnt/img/twodisponíveis como pontos de montagem:

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

Se você receber um erro de "loop sobreposto" aqui, sua versão mountexige que você especifique o tamanho e o deslocamento da primeira partição. Desmonte isso e use o número de blocos (57344) * 512 (= 29360128):

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

A segunda partição não precisa de um tamanho reduzido, já que não há nada na imagem.

Agora você pode acessar as duas partições. Se você não pretende alterar nada, use a opção -r(somente leitura). Se você alterar alguma coisa, essas alterações serão incluídas no .imgarquivo.

Observe que a primeira partição provavelmente está montada /bootna segunda partição quando o sistema está em execução.

Cachinhos Dourados
fonte
12
O kpartx torna ainda mais fácil para você: cria oskpartx -a whatever.img nós (loop) apropriados, que você pode montar posteriormente à vontade. Execute kpartx -d whatever.imgpara excluir os nós de loop (não montados).
11
semelhante: stackoverflow.com/a/1421075/544721
Grzegorz Wierzowiecki
Como montar a partição raiz e de inicialização simultaneamente: unix.stackexchange.com/q/342463/9689 ?
Grzegorz Wierzowiecki
11
PS Se quiser montar as duas partições ao mesmo tempo, para evitar erros de "sobreposição", basta especificar o tamanho da partição com a sizelimitopção Para mais informações: unix.stackexchange.com/a/342466/9689 . (. Aliás resposta acima pode ser actualizado para proporcionar um exemplo de utilização do que opção)
Grzegorz Wierzowiecki
2
Ao invés de multiplicar manualmente, você pode usar Expansão aritmética do bash: $((8192*512)).
Ruslan
20

losetupfornece análise de partição -P. Usar isso facilita a montagem de partições de uma imagem de disco completa, como a imagem do cartão SD Raspbian:

losetup -P /dev/loop0 raspbian.img
mount /dev/loop0p2 /mnt
mount /dev/loop0p1 /mnt/boot
Johan Ehnberg
fonte
Isso parece menos propenso a erros humanos. Também posso usar etiquetas nos comandos de montagem?
CTRL-ALT-DELOR # 01/02
1

No começo, eu estava usando o awk / grep para analisar o fdisk e obter as compensações, mas achei que poderia ser um pouco complicado, flakey e difícil de entender posteriormente. O método mais fácil que encontrei:

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}

Isso cria uma temp-dir para você, auto-atribui o próximo loop-dispositivo e define-se para você como p1e p2partição dispositivos e montagens de inicialização e raiz.

Você também pode colocar a parte da limpeza em uma armadilha de saída; portanto, se algo falhar, você não terá montagens / arquivos pendentes:

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

Caso o fdisk -l apareça com setores em vez de blocos no Arch linux ... Outra maneira de encontrar o número de blocos no caso do "erro de loop sobreposto" é subtrair o deslocamento em bytes da primeira partição da segunda partição e divida por dois. Por exemplo (62914560-4194304) / 2 = 29360128

AB
fonte