Como usar o DD para clonar uma partição de uma imagem de disco?

9

Eu tenho uma imagem de disco, é uma imagem de disco "inteira", por exemplo, contém várias partições e quero clonar apenas uma delas (não a primeira ..) em uma partição em uma unidade externa com várias partições ( Também não estou clonando na primeira partição do disco ...)

FDisk'ing a imagem dá isto:

# fdisk -l 2013-02-09-wheezy-raspbian.img 

Disco 2013-02-09-wheezy-raspbian.img: 1939 MB, 1939865600 bytes
255 cabeças, 63 setores / pista, 235 cilindros, total de 3788800 setores
Unidades = setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico / físico): 512 bytes / 512 bytes
Tamanho de E / S (mínimo / ideal): 512 bytes / 512 bytes
Identificador de disco: 0x00014d34

                         Sistema de identificação de blocos finais de inicialização do dispositivo
2013-02-09-wheezy-raspbian.img1 8192 122879 57344 c W95 FAT32 (LBA)
2013-02-09-wheezy-raspbian.img2 122880 3788799 1832960 83 Linux
#

e o dispositivo de bloco fica assim:

# fdisk -l / dev / sdc

Disco / dev / sdc: 8014 MB, 8014266368 bytes
247 cabeças, 62 setores / pista, 1022 cilindros, total de 15652864 setores
Unidades = setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico / físico): 512 bytes / 512 bytes
Tamanho de E / S (mínimo / ideal): 512 bytes / 512 bytes
Identificador de disco: 0x00000000

   Sistema de identificação de blocos finais de inicialização do dispositivo
/ dev / sdc1 2048 131071 64512 e W95 FAT16 (LBA)
/ dev / sdc2 131072 15652863 7760896 83 Linux
#

Quero que a segunda partição da imagem substitua a segunda partição do dispositivo de bloco. Não se preocupe com o espaço livre corrompido à direita, usarei o GParted para limpar isso e preciso disso para qualquer outra coisa.

JamesTheAwesomeDude
fonte
especifique exatamente onde você deseja que sua partição seja clonada e onde estão seus arquivos de imagem!
fromnaboo

Respostas:

8
# losetup --find --show --partscan --read-only 2013-02-09-wheezy-raspbian.img
/dev/loop7
# dd if=/dev/loop7p2 of=/dev/narnia bs=1M

Se --partscannão funcionar, você também pode usar um dos seguintes:

# partx -a /dev/loop7
# kpartx /dev/loop7

ou soluções de mapeamento de partição semelhantes.

Você provavelmente deve montá-lo primeiro apenas para ver se é a coisa certa ou o quê.

Claro que você também pode ler a saída fdisk e dar ddo skip=131072ou o que quer diretamente, ou seja, torná-lo saltar esta quantidade de blocos de entrada para que ele começa a ler para onde a partição está localizado; mas é melhor ver partições reais com um dispositivo de loop.

frostschutz
fonte
Seu losetupcomando não funcionou - dizia opção não reconhecida --find. Eu removi isso, dizia que não reconhecia --show. Tirar isso fez com que reclamasse --partscan, e nesse momento percebi que o comando não faria nada por mim tão cedo. Eu decidi tentar os outros, mas ambos partxe kpartxretornar "comando não encontrado".
JamesTheAwesomeDude
Eu apenas correria dd if=2013-02-09-wheezy-raspbian.img of=/dev/sdc skip=122880, mas isso retorna dd: ‘2013-02-09-wheezy-raspbian.img’: cannot skip: Invalid argument.
JamesTheAwesomeDude
1
skipdepende bs, portanto, se você usou bs=1M(ou tem um alias que faz isso), isso explicaria por que não funciona. tente com bs=512. Além disso, por que 122880 quando fdisk diz 131072? Também é o meu losetup losetup from util-linux 2.22.2. o mesmo para o partx. O kpartx é do multipath-tools (mapeador de dispositivos usado).
Frostschutz
kpartxé para LVM. partprobetambém fará o trabalho, a partir do pacote separado.
Psusi 21/04/2013
@frostschutz Foram 12280 bytes desde o início do arquivo de imagem.
JamesTheAwesomeDude
0

Algo assim deve funcionar:

dd if=/path/to/2013-02-09-wheezy-raspbian.img2 of=/dev/sdc2 bs=4096 conv=notrunc,noerror

if = define a imagem que você deseja clonar

of = define a partição de destino na qual você deseja clonar a imagem

fromnaboo
fonte
1
Eu tenho o erro esperado:dd: opening ‘2013-02-09-wheezy-raspbian.img2’: No such file or directory
JamesTheAwesomeDude
você substituiu /path/to/2013-02-09-wheezy-raspbian.img2 pelo seu caminho real para o arquivo de imagem? : |
fromnaboo
1
**** facepalm **** Sim, acabei de anexar o 2 no final, como você disse .
JamesTheAwesomeDude
Isso não funciona, dd não vê partições em um arquivo de imagem como essa
Michal Artazov
0
  1. Monte a imagem como um dispositivo de loopback: losetup -fP yourImage.img
  2. Agora você pode acessar cada partição da imagem diretamente. Se você deve usar dd, você pode fazer dd if=/dev/loop0p1 of=image.img, mas acho que você gostaria catmelhor. Em um shell raiz, simplesmente faça cat /dev/loop0p1 > image.img. Ambos os exemplos pressupõem que você deseja a primeira partição, e o dispositivo de auto-retorno designado foi/dev/loop0
  3. Depois de concluir o dispositivo de loopback, você pode desconectá-lo losetup -d /dev/loop0. Mais uma vez, isso pressupõe que esse /dev/loop0é o seu dispositivo de loopback.
John Leuenhagen
fonte
0

Você poderia fazer:

sudo partx --add -v 2013-02-09-wheezy-raspbian.img 
# time sudo dd if=/dev/loop0p1 |pv -s 80M |sudo dd of=/dev/sdc1
time sudo dd if=/dev/loop0p2 |pv -s 4G |sudo dd of=/dev/sdc2
sudo partx --delete -v /dev/loop0
Frank Breitling
fonte
0

Você pode copiar apenas a segunda partição para uma imagem separada com este

dd if=2013-02-09-wheezy-raspbian.img of=second.img bs=512 skip=122880

e depois disso você pode copiá-lo no lugar da partição no disco

dd if=second.img of=/dev/sdc2 bs=512

ou você pode até fazê-lo em um comando

dd if=2013-02-09-wheezy-raspbian.img of=/dev/sdc2 bs=512 skip=122880

Apenas certifique-se de desmontar / dev / sdc2 antes de escrever nele.

Michal Artazov
fonte