¿Puedo usar dd para clonar una tarjeta SD más grande en una tarjeta SD más pequeña si las particiones reales encajan?

9

Tengo una tarjeta SD de 16 GB que tiene algunas particiones (en realidad es la tarjeta para una Raspberry Pi). Tengo varias otras tarjetas de 4GB en las que quiero clonar la tarjeta principal. Las 3 particiones en la tarjeta primaria son:

  • Partición de arranque de escofina, FAT, 60 MB
  • Partición Linux, ext2, 1GB
  • Partición de "almacenamiento" adicional, FAT, 1GB

Si uso ddpara crear una imagen de la tarjeta a través de:

dd if=/dev/sdb of=~/sd-card.bin

entonces el .bin resultante es de 16 GB de tamaño. ¿Hay alguna forma de usar ddpara copiar solo lo que realmente se está utilizando, es decir, <4 GB para que luego pueda ddesto en una nueva tarjeta de 4 GB? ¿O hay una mejor solución que debería estar usando?

Charlie Schliesser
fuente
Terminé creando el contenido exacto en una nueva tarjeta de 4GB y clonándolo con dduna cantidad de otras tarjetas. Aún así, me gustaría saber si es posible resolver el problema inicial.

Respuestas:

9

Supongo que está utilizando una computadora PC Linux o Mac para realizar la copia, no la frambuesa pi en sí. Probablemente necesitará agregar un tamaño de bloque.

He visto uno y cuatro megas utilizados para discos Raspberry pi especificando bs = 1M o bs = 4M. Creo que el tamaño del bloque es más importante cuando se escribe el disco, ya que las transferencias grandes son más rápidas que las pequeñas. Esto no establece el tamaño de bloque para el disco, solo afecta el tamaño de las transferencias que dd usa. Una razón para configurar un tamaño de bloque grande es la necesidad de borrar el flash antes de escribirlo. Esto se hace automáticamente pero más rápido para transferencias que son más grandes que el tamaño mínimo de borrado.

Puede limitar la cantidad total de datos copiados por dd usando "contar". "contar" está en unidades de bloques. Si el final de la última partición en el disco de origen es anterior al tamaño del destino, puede hacer lo que quiera.

Algo así dd if=/dev/sdb of=~/sd-card.bin bs=1M count=4000creará una imagen que tiene un tamaño de 4000 MB.

Consulte http://en.wikipedia.org/wiki/Dd_(Unix) y http://elinux.org/RPi_Easy_SD_Card_Setup para obtener más información. No estoy seguro de cómo encontrar el final de la última partición o el tamaño total de las tarjetas. Sin embargo, si ha formateado los discos, probablemente sabrá cómo hacerlo.

William J Bagshaw
fuente
Gracias por la info. No estaba al tanto de la opción de conteo. Lo intentaré.
@charlie sería fascinante si puedes probarlo con y sin la opción de conteo e informar. Sin embargo, asegúrese de verificar cómo se informa el tamaño del disco y si puede agregarle archivos y el tamaño cambia. Porque cuando dd falla en relación con discos de diferentes tamaños, obtienes ese tipo de problemas. Aquí hay un ejemplo en el que me equivoqué con dd con dos unidades de diferentes tamaños. superuser.com/questions/538583/difficulty-resizing-a-partition Al final no usé dd para hacer el clon.
barlop
3

Ampliando la respuesta de William , uno podría calcular el final de la última partición usando fdisky una calculadora:

$ fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 7.4 GiB, 7948206080 bytes, 15523840 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
Disklabel type: dos
Disk identifier: 0x00057540

Device         Boot  Start     End Sectors  Size Id Type
/dev/mmcblk0p1        2048  186367  184320   90M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      186368 3667967 3481600  1.7G  5 Extended
/dev/mmcblk0p5      188416 3667967 3479552  1.7G 83 Linux

Espacio total utilizado en bytes = sector final del tamaño de sector de la última partición X (aquí es 3667967 x 512).

Espacio total utilizado en GB = espacio total utilizado en bytes / 1024 3 (aquí es 1.749023 GB).

Por lo general, no es vital crear una imagen que se reduzca hasta el último bit de datos útil, por lo que en el ejemplo anterior crearía una imagen de 2 GB utilizando el método descrito por William en la misma respuesta anterior :

dd if=/dev/mmcblk0 of=/path/to/pi_updated.img bs=1M count=2048

Al final de la imagen, se incluirá una pequeña porción del guff inútil después de sus últimos datos útiles, pero en principio no es diferente del guff inútil que se sobrescribirá cuando vuelva a escribir la imagen en sus medios.

Este método me ha funcionado en una docena de clones. Si hay algún defecto fatal en este método, aún no han aparecido.

Crumeniferus
fuente