Como montar a imagem do cartão SD criada com o dd?

21

Criei uma imagem do meu cartão SD do Raspberry Pi usando dd:

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

O cartão SD inclui duas partições (uma vfat, uma ext4) que são montadas automaticamente quando eu conecto o cartão.

Minha pergunta: Como posso montar essas partições a partir do arquivo .img?


Mais detalhes:

$ 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
fonte
Deseja montar a imagem sem gravá-la no cartão SD?
OrangeTux
Sim, quero ter acesso total ao sistema de arquivos armazenado no arquivo .img para poder copiar / modificar / excluir / etc. arquivos sem ter um cartão SD
MrD 10/04
Talvez esta pergunta o ajude.
OrangeTux
Infelizmente isso não funciona, tentei as duas tentativas. O primeiro não criou o dispositivo / dev / loop0p1. O segundo (calculei o ponto de partida de acordo) gera um wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or helper program, or other errorproblema
MrD 10/04
Além disso, sudo fdisk -l /dev/loop0afirma: Disk / dev / loop0 não contém uma tabela de partição válida.
MrD

Respostas:

33

Para evitar a necessidade de criar imagens separadas para cada partição ou instalar um utilitário como kpartx, você pode montar cada partição individualmente especificando um offsetno mountcomando

Primeiro examine as partições no arquivo de imagem e determine o deslocamento 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

Pegue o Startsetor da partição desejada e multiplique esse valor pelo Unitstamanho. Então, se você quiser a segunda partição, receberá 540672 * 512 = 276824064.

Agora crie uma pasta e monte a partição:

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

Quando você terminar de fazer o que deseja com os dados da partição:

sudo umount rpi_partition2/
rm -r rpi_partition2/
Forragem
fonte
17

Após alguns testes adicionais, eu mesmo encontrei a solução: kpartx

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

Este comando criou /dev/mapper/loop0p1e /dev/mapper/loop0p2. Posteriormente, essas partições podem ser montadas diretamente para a frente:

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

se seu objetivo é explorar ou modificar o conteúdo de uma partição (sistema de arquivos), esta linha de comando montará o sistema de arquivos do dump do cartão sd my_sdcard_dump.img no diretório 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
fonte
0

Lidar com uma imagem de um disco inteiro com várias partições é bastante complicado . O Linux não foi projetado para ler uma tabela de partição de um arquivo regular, mesmo quando conectado a um dispositivo de loopback, portanto, você deve identificar cuidadosamente os desvios das partições e passá-los para o mountcomando

A maneira preferível seria criar imagens separadas de cada partição:

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

Agora você pode tratar facilmente esses arquivos como se fossem partições individuais em um disco, montando-os como faria normalmente em uma partição de disco real, mapeando-os para um dispositivo de loop . Um dispositivo de loop, ou dispositivo de loopback, é um dispositivo virtual que fornece uma camada de conversão para o Linux tratar um arquivo como um dispositivo de bloco (como um disco ou partição).

Os dispositivos de loop são normalmente /dev/loop0terminados /dev/loop8. Identifique um dispositivo de loop não utilizado com o losetupcomando:

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

Esta resposta indica um dispositivo de loop não atribuído. Agora podemos atribuir o dispositivo de loop a um dos nossos arquivos de imagem:

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

Ausência de saída deste comando indica sucesso. Agora, /dev/loop0para a maioria dos propósitos, é funcionalmente equivalente ao /dev/sdf1do seu cartão SD, e você pode montá-lo como faria normalmente:

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

Repita o processo usando outro dispositivo de loop para montar a outra partição. Quando terminar, desmonte os sistemas de arquivos e des atribua os dispositivos de loop:

sudo umount /dev/loop0
sudo losetup -d /dev/loop0
tgies
fonte
Eu gostaria de evitar a criação de dois arquivos de imagem, porque - entre outros motivos menores - gostaria de distribuir a imagem para outras pessoas, para que elas possam usá-la para inicializar seus cartões SD. Portanto, as diferentes partições como / boot etc. precisam estar em um arquivo.
MrD