Eu usei dd
para fazer backup de uma unidade 80 GB
dd if=/dev/sdb of=~/sdb.img
Agora preciso acessar alguns arquivos nessa unidade, mas não quero copiar o ".img" de volta na unidade.
mount ~/sdb.img /mnt/sdb
também não funciona. Ele retorna:
mount: you must specify the filesystem type
Tentei encontrar o tipo de sistema de arquivos com file -s
[email protected] $ file -s sdb.img
sdb.img: x86 boot sector; partition 1: ID=0x12, starthead 1, startsector 63, 10233342 sectors; partition 2: ID=0xc, active, starthead 0, startsector 10233405, 72517410 sectors; partition 3: ID=0xc, starthead 0, startsector 82750815, 73545570 sectors, code offset 0xc0
É possível montar sdb.img
, ou devo usar dd
para restaurar a unidade?
Quando você usa dd
em /dev/sdb
ao invés de /dev/sdb1
ou /dev/sdb2
, você copia todas as partições da referida unidade para uma arquivo.
Você deve montar cada partição separadamente.
Para montar uma partição de um arquivo , você deve primeiro descobrir onde no arquivo que a partição reside.
Usando sua saída de file -s sdb.img
encontramos o startsectors
para cada partição:
sdb.img: setor de inicialização x86; partição 1 : ID = 0x12, início 1, setor de inicialização 63 , 10233342 setores; partição 2 : ID = 0xc, ativo, início 0, setor de inicialização 10233405 , 72517410 setores; partição 3 : ID = 0xc, starthead 0, startector 82750815 , 73545570 setores, deslocamento de código 0xc0
Partição Startsector
1 63
2 10233405
3 82750815
Para montar uma única partição, onde X
é o setor de inicialização dessa partição, execute:
mount ~/sdb.img /mnt/sdb -o offset=$((X*512))
Portanto, para montar a segunda partição , você terá que executar:
mount ~/sdb.img /mnt/sdb2 -o offset=$((10233405*512))
Nota lateral: certifique-se de que /mnt/sdb2
existe antes de você executar isso.
Diverta-se!
update: Na resposta, presumi que o tamanho do setor para sua imagem era 512
, consulte esta questão sobre como calcular isso.
No Linux, os comandos de montagem dentro de resposta aceita criarão implicitamente um dispositivo de loop. Assumindo que a imagem de disco completo tem uma tabela de partição correta (que seu kernel é capaz de entender), você pode preferir usar losetup(8)
diretamente para evitar o incômodo de calcular offsets. Além disso, não há necessidade de ferramentas extras como kpartx
conforme sugerido em outro resposta . Ele fará basicamente a mesma coisa que o seguinte:
losetup -Prf sdb.img
Irá associar o primeiro dispositivo de loop livre (-f
) Como somente leitura (-r
) Com o arquivo de imagem sdb.img
. A opção -P
Força o kernel a varrer a tabela de partição deste dispositivo de loop e criará dispositivos de loop para cada partição.
Portanto, você pode obter algo como:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 167.7G 1 loop
├─loop0p1 259:0 0 500M 1 loop
└─loop0p2 259:1 0 167.2G 1 loop
...
Agora você pode montar cada partição, somente leitura, é claro, em um ponto de montagem desejado.
$ mount -r /dev/loop0p1 /tmp/backup_sdb1
Manter tudo somente leitura é opcional, mas pode ser uma boa opção para uma imagem de backup.
update: opção -P
foi adicionada com util-linux-2.21 em 2012. Portanto, não estava disponível no momento em que a resposta aceita foi escrita. Observe também que esta e as outras respostas são específicas do Linux. O OpenBSD e o NetBSD possuem discos vnode gerenciados por vnconfig(8)
e o FreeBSD possui discos de memória gerenciados por mdconfig(8)
.
Alternativamente, você pode usar uma boa ferramenta chamada kpartx
. Na página de manual:
kpartx - Criar mapas de dispositivos a partir de tabelas de partição
Isso significa que você pode fazer um "pseudo dispositivo", com partições de dispositivo, diretamente do arquivo img:
$ kpartx -av sdb.img
add map loop0p1 (254:2): 0 2048 linear /dev/loop0 0
add map loop0p2 (254:3): 0 31162 linear /dev/loop0 2048
$ lsblk
.
.
.
loop0 7:0 0 16.2M 0 loop
├─loop0p1 254:2 0 1M 0 part
└─loop0p2 254:3 0 15.2M 0 part
Então você pode montar /dev/mapper/loop0p2
por exemplo, se você deseja a segunda partição na imagem.