¿Cómo usar DD para clonar una partición de una image de disco?

Tengo una image de disco, es una image de disco "completa", por ejemplo, contiene múltiples particiones, y quiero clonar solo una de ellas (no la primera …) en una partición de una unidad externa con múltiples particiones ( Tampoco lo estoy clonando en la primera partición del disco …)

FDisk'ing la image le da esto:

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

 Disco 2013-02-09-wheezy-raspbian.img: 1939 MB, 1939865600 bytes
 255 cabezas, 63 sectores / pista, 235 cilindros, un total de 3788800 sectores
 Unidades = sectores de 1 * 512 = 512 bytes
 Tamaño del sector (lógico / físico): 512 bytes / 512 bytes
 Tamaño de E / S (mínimo / óptimo): 512 bytes / 512 bytes
 Identificador de disco: 0x00014d34

                          Dispositivo Boot Start End Blocks Id System
 2013-02-09-wheezy-raspbian.img1 8192 122879 57344 c W95 FAT32 (LBA)
 2013-02-09-wheezy-raspbian.img2 122880 3788799 1832960 83 Linux
 # 

y el dispositivo de bloque se ve así:

  # fdisk -l / dev / sdc

 Disco / dev / sdc: 8014 MB, 8014266368 bytes
 247 cabezas, 62 sectores / pista, 1022 cilindros, un total de 15652864 sectores
 Unidades = sectores de 1 * 512 = 512 bytes
 Tamaño del sector (lógico / físico): 512 bytes / 512 bytes
 Tamaño de E / S (mínimo / óptimo): 512 bytes / 512 bytes
 Identificador de disco: 0x00000000

    Dispositivo Boot Start End Blocks Id System
 / dev / sdc1 2048 131071 64512 e W95 FAT16 (LBA)
 / dev / sdc2 131072 15652863 7760896 83 Linux
 # 

Quiero que la segunda partición de la image reemplace la segunda partición del dispositivo de bloque. No se preocupe por el espacio libre corrupto que está detrás, usaré GParted para limpiarlo, y lo necesito para otra cosa de todos modos.

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

Si --partscan no funciona, también puede usar uno de:

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

o soluciones de mapeo de particiones similares.

Probablemente deberías montarlo primero solo para ver si es lo correcto o qué.

Por supuesto, también puedes leer la salida de fdisk y darle a dd el skip=131072 o lo que sea directamente, es decir, hacer que omita tantos bloques de input para que comience a leer en donde se encuentra la partición; pero es más agradable ver particiones reales con un dispositivo de bucle.

Algo como esto debería funcionar:

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

if = establece la image que desea clonar

of = establece la partición de destino donde desea clonar la image

  1. Monte la image como un dispositivo de losetup -fP yourImage.img : losetup -fP yourImage.img
  2. Ahora puede acceder a cada partición de la image directamente. Si debe usar dd , puede hacer dd if=/dev/loop0p1 of=image.img , pero creo que le gustaría tener un mejor cat . En un shell raíz, simplemente haga cat /dev/loop0p1 > image.img . Ambos ejemplos asumen que usted quiere la primera partición, y el dispositivo de loopback que le asignaron fue /dev/loop0
  3. Una vez que haya terminado con el dispositivo de losetup -d /dev/loop0 , puede separarlo con losetup -d /dev/loop0 . Una vez más, esto supone que /dev/loop0 es su dispositivo de bucle invertido.

Podrías hacerlo:

 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