Como montar uma partição a partir da imagem criada por dd de um dispositivo de bloco (por exemplo, HDD) no Linux?

34

Eu tenho uma imagem de todo o disco criado usando o dd . A estrutura do disco segue:

kent@cow:~$ sudo fdisk -l

Disk /dev/sda: 750.1 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000b8508

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           5       90872   729929303+  83  Linux
/dev/sda2           90873       91201     2642692+   5  Extended
/dev/sda5           90873       91201     2642661   82  Linux swap / Solaris

A imagem foi criada usando:

dd if=/dev/sda of=image750.img

Como montar, se possível, / dev / sda1 a partir da imagem para que eu possa ler o conteúdo?

Não é uma opção clonar o disco rígido novamente, eu sei como fazê-lo se eu tivesse clonado a partição única por si só. Espero que ainda seja possível com a imagem atual.

Excluído
fonte

Respostas:

48

Atualmente, existe uma maneira melhor, não há mais necessidade de usar compensações ou kpartx:

losetup --partscan --find --show disk.img

mount /dev/loop0p1 /mnt

para liberar loop0, use após umount:

losetup -d /dev/loop0
bhelm
fonte
8
Na minha instalação do Ubuntu 14.04, losetup não fornece a opção --partscan.
Cutter
11
O @Cutter foi adicionado no util-linux 2.21, Ubuntu 16.04. :-)
Ciro Santilli escreveu
Tendo usado kpartxprimeiro, que monta as partições como /dev/mapper/loop3p1, eu só quero salientar que losetupcria os dispositivos como /dev/loop0p1. A resposta observa isso, mas eu li sobre isso provavelmente 10 vezes. : /
Randy Syring
13

Encontrei este problema hoje e queria atualizar as respostas apenas como um lembrete para mim. Em vez de calcular o deslocamento por conta própria, você pode usar uma ferramenta que fornece dispositivos montáveis ​​a partir de uma imagem dd: kpartx

http://robert.penz.name/73/kpartx-a-tool-for-mounting-partitions-within-an-image-file/

http://linux.die.net/man/8/kpartx

Nesse caso, seria necessário algo como

sudo kpartx -a image750.img
sudo mount /dev/mapper/loop1p1 /mount/point -o loop,ro

onde loop1p1 representa a primeira partição, loop1p2, a segunda, etc.

GrGr
fonte
6

Você tem a primeira parte: fdisk -l para encontrar o deslocamento inicial. Pegue esse número, multiplique por 512, e você terá a opção de deslocamento para montar. Portanto, para sda1 no seu caso, 5 * 512 = 2560. Em seguida, execute o mount:

mount -o loop,offset=2560 -t auto /path/to/image.dd /mount/point
Baumgart
fonte
4

A montagem em loop é apenas parte da resposta.

Consulte http://wiki.edseek.com/guide:mount_loopback#accessing_specific_partitions_in_the_image para obter ajuda na especificação da partição. Acho que mount -o loop, offset = 32256 /path/to/image750.img / mnt funcionará para você. mas você realmente deve ler o tutorial mencionado.

Richard June
fonte
o deslocamento parece errado; que corresponde ao início de uma partição de 63 (<i> 63 * 512 = 32256 </i>). o deslocamento na resposta de baumgart parece mais correto para esta situação. o link é uma boa referência, mas seria uma resposta melhor se você dedicasse um tempo para resumir as etapas ou comandos necessários para este procedimento. obrigado!
quack quixote
1

losetup -P automação

Método mencionado por https://superuser.com/a/684707/128124 (adicionado no util-linux v2.21, adicionado Ubuntu 16.04), aqui estão as funções para automatizá-lo ainda mais. Uso:

$ los my.img
/dev/loop0
/mnt/loop0p1
/mnt/loop0p2

$ ls /mnt/loop0p1
/whatever
/files
/youhave
/there

$ sudo losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                                                                      DIO
/dev/loop1         0      0         0  0 /full/path/to/my.img

$ # Cleanup.
$ losd 0
$ ls /mnt/loop0p1
$ ls /dev | grep loop0
loop0

Fonte:

los() (
  img="$1"
  dev="$(sudo losetup --show -f -P "$img")"
  echo "$dev"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    echo "$dst"
    sudo mkdir -p "$dst"
    sudo mount "$part" "$dst"
  done
)
losd() (
  dev="/dev/loop$1"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    sudo umount "$dst"
  done
  sudo losetup -d "$dev"
)

configuração do max_part do módulo de loop

Método decente antes do util-linux v2.21.

loop é um módulo do kernel, embutido no kernel no Ubuntu 14.04.

Se você configurá-lo corretamente, o Linux divide automaticamente os dispositivos para você.

cat /sys/module/loop/parameters/max_part

diz quantas partições os loopdispositivos podem gerar.

É 0por padrão no Ubuntu 14.04 e é por isso que nenhuma divisão automática acontece.

Para alterá-lo, podemos adicionar:

options loop max_part=31

para um arquivo /etc/modprobeou:

GRUB_CMDLINE_LINUX="loop.max_part=31"

para /etc/default/grube então sudo update-grub.

Como definir um parâmetro de módulo também é abordado em: https://askubuntu.com/questions/51226/how-to-add-kernel-module-parameters

Após uma reinicialização, quando você faz:

sudo losetup -f --show my.img

monta a imagem em um /dev/loopXdispositivo e monta automaticamente as partições em /dev/loopXpYdispositivos.

Portanto, este é o método mais conveniente se você estiver disposto a reiniciar.

Veja também

Ciro Santilli adicionou uma nova foto
fonte
0

Se você possui um sistema de arquivos no modo Usuário, como o fusível, em ambientes de desktop, como o Gnome, e instalou uma ferramenta como o gnome-disk-image-mounter, ele não precisa nem fazer root, clique com o botão direito do mouse e abra-o.

Kasun
fonte
0

Eu acredito que a montagem em loop é a resposta -

sudo mkdir /path/to/dir/
mount -o loop example.img /path/to/dir/

O acima deve montá-lo nesse diretório.

Isso deve desmontá-lo:

umount /path/to/dir
Journeyman Geek
fonte