dd (Español)
dd es una de las Core utilities (Español) cuyo objetivo principal es convertir y copiar un archivo.
De manera similar a cp, por defecto dd hace una copia bit a bit del archivo, pero con funciones de control de flujo de E/S de nivel inferior.
Para obtener más información, consulte dd(1) o la documentación completa.
status=progress
a la orden.Instalación
dd es parte de GNU coreutils. Para otras utilidades del paquete, consulte Core utilities (Español).
Clonación y restauración de discos
La orden dd es una herramienta simple, pero versátil y potente. Se puede utilizar para copiar de origen a destino, bloque por bloque, independientemente de los tipos de sistemas de archivos o sistemas operativos. Un método conveniente es usar dd desde un entorno live, como en un CD Live.
if=
) y del archivo de salida (of=
) y no los invierta! Asegúrese siempre de que la unidad o partición de destino (of=
) sea de igual o mayor tamaño que la fuente (if=
).
Clonar una partición
Desde el disco físico /dev/sda
, partición 1, al disco físico /dev/sdb
, partición 1:
# dd if=/dev/sda1 of=/dev/sdb1 bs=64K conv=noerror,sync status=progress
of=
(sdb1
en el ejemplo) no existe, dd creará un archivo con este nombre y comenzará a llenar su sistema de archivos raíz.Clonar un disco duro completo
Desde el disco físico /dev/sda
al disco físico /dev/sdb
:
# dd if=/dev/sda of=/dev/sdb bs=64K conv=noerror,sync status=progress
Esta orden clonará toda la unidad, incluido el MBR (y, por lo tanto, el cargador de arranque), todas las particiones, UUID y datos.
bs=
establece el tamaño del bloque. El valor predeterminado es 512 bytes, que es el tamaño de bloque «clásico» para discos duros desde principios de la década de 1980, pero no es el más conveniente. Utilice un valor mayor, 64K o 128K. Además, lea la advertencia siguiente, porque no solo hay que tener encuenta los «tamaños de bloques» en sí, también influyen estos en cómo se propagan los errores de lectura. Consulte [1] y [2] para obtener más información y para determinar el mejor valor de bs para su caso particular.noerror
indica a dd que continúe la operación, ignorando todos los errores de lectura. El comportamiento predeterminado para dd es detenerse ante cualquier error.sync
rellena los bloques de entrada con ceros si hubo errores de lectura, por lo que las compensaciones de datos permanecerán sincronizadas.status=progress
muestra estadísticas de transferencia periódicas que se utilizan para estimar cuándo puede completarse la operación.
La utilidad dd técnicamente tiene un «tamaño de bloque de entrada» (IBS) y un «tamaño de bloque de salida» (OBS). Cuando configura bs
, configura de manera efectiva tanto IBS como OBS. Normalmente, si el tamaño de su bloque es, digamos, 1 MiB, dd leerá 1024×1024 bytes y escribirá bytes iguales. Pero si ocurre un error de lectura, las cosas saldrán mal. Mucha gente parece pensar que dd «llenará los errores de lectura con ceros si usa las opciones noerror, sync
, pero esto no es lo que sucede. dd, según la documentación, llenará el OBS al tamaño del IBS después de completar su lectura, lo que significa agregar ceros al final del bloque. Esto significa, para un disco, que efectivamente todo 1 MiB se estropearía debido a un solo error de lectura de 512 bytes al comienzo de la lectura: 12ERROR89 se convertiría en 128900000 en lugar de 120000089.
Si está seguro de que su disco no contiene ningún error, puede continuar usando un tamaño de bloque más grande, lo que aumentará la velocidad de su copia varias veces. Por ejemplo, cambiar bs de 512 a 64K cambiará la velocidad de copia de 35 MB/s a 120 MB/s en un sistema Celeron de 2.7 GHz. Pero tenga en cuenta que los errores de lectura en el disco de origen terminarán como «errores de bloque» en el disco de destino, es decir, un solo error de lectura de 512 bytes dañará todo el bloque de salida de 64 KiB.
status=progress
. Vea dd(1) para más detalles.- Para recuperar UUID únicos de un sistema de archivos ext2/3/4, utilice
tune2fs /dev/sdXY -U random
en cada partición. Para particiones de intercambio, utilicemkswap /dev/sdXY
en su lugar. - El kernel no registra los cambios de la tabla de particiones realizadas por dd . Para notificar los cambios sin reiniciar, utilice una utilidad como partprobe (parte de GNU Parted).
Crear copia de seguridad de la tabla de particiones
Consulte fdisk (Español)#Copia de seguridad y restauración de la tabla de particiones o GPT fdisk#Backup and restore partition table.
Crear imagen de disco
Arranque desde un medio live y asegúrese de que no se monten particiones desde el disco duro de origen.
Luego monte el disco duro externo y haga una copia de seguridad del disco (de origen):
# dd if=/dev/sda conv=sync,noerror bs=64K | gzip -c > /ruta/a/backup.img.gz
Si es necesario (por ejemplo, cuando los archivos resultantes están almacenados en un sistema de archivos FAT32) divida la imagen del disco en varias partes (consulte también split(1)):
# dd if=/dev/sda conv=sync,noerror bs=64K | gzip -c | split -a3 -b2G - /ruta/a/backup.img.gz
Si no hay suficiente espacio en el disco local, puede enviar la imagen a través de ssh:
# dd if=/dev/sda conv=sync,noerror bs=64K | gzip -c | ssh user@local dd of=backup.img.gz
Finalmente, guarde información adicional sobre la geometría de la unidad necesaria para interpretar la tabla de particiones almacenada dentro de la imagen. La más importante de las cuales es el tamaño del cilindro.
# fdisk -l /dev/sda > /path/to/list_fdisk.info
bs=
) que sea igual a la cantidad de caché en el disco duro que está respaldando. Por ejemplo, bs=8192K
funciona para un caché de 8 MiB. El 64 KiB mencionado en este artículo es mejor que los bs=512
bytes predeterminados, pero se ejecutará más rápido con un bs=
más largo.gzip -c
anterior, con pigz -c
. Para discos grandes, esto potencialmente puede ahorrar horas.Restaurar el sistema
Para restaurar su sistema:
# gunzip -c /ruta/a/backup.img.gz | dd of=/dev/sda
Cuando la imagen se haya dividido, use lo siguiente:
# cat /ruta/a/backup.img.gz* | gunzip -c | dd of=/dev/sda
Parchear archivos binarios
Si se quiere reemplazar el desplazamiento 0x123AB
de un archivo con la secuencia hexadecimal FF C0 14
, esto se puede hacer con la línea de órdenes:
# printf '\xff\xc0\x14' | dd seek=$((0x123AB)) conv=notrunc bs=1 of=/ruta/al/archivo
Copiar y restaurar el MBR
Antes de realizar cambios en un disco, es posible que desee hacer una copia de seguridad de la tabla de particioines y del esquema de particionado de la unidad. También puede usar una copia de seguridad para replicar el mismo esquema de particionado en varias unidades.
El MBR se almacena en los primeros 512 bytes del disco. Consta de 4 partes:
- Los primeros 440 bytes contienen el código de arranque (cargador de arranque).
- Los siguientes 6 bytes contienen la firma del disco.
- Los siguientes 64 bytes contienen la tabla de particiones (4 entradas de 16 bytes cada una, una entrada para cada partición primaria).
- Los últimos 2 bytes contienen una firma de arranque.
Para guardar el MBR como mbr_file.img
:
# dd if=/dev/sdX of=/path/to/mbr_file.img bs=512 count=1
También puede extraer el MBR desde una imagen completa de disco con dd :
# dd if=/ruta/al/disco.img of=/ruta/al/mbr_file.img bs=512 count=1
Para restaurar (tenga cuidado, esto destruye la tabla de particiones existente y con ella el acceso a todos los datos en el disco):
# dd if=//ruta/al/mbr_file.img of=/dev/sdX bs=512 count=1
Si solo desea restaurar el cargador de arranque, pero no las entradas de la tabla de partición primaria, simplemente restaure los primeros 440 bytes del MBR:
# dd if=/ruta/al/mbr_file.img of=/dev/sdX bs=440 count=1
Para restaurar solo la tabla de particiones, se debe usar:
# dd if=/ruta/al/mbr_file.img of=/dev/sdX bs=1 skip=446 count=64
Eliminar el gestor de arranque
Para borrar el código de arranque MBR (puede ser útil si tiene que reinstalar completamente otro sistema operativo), solo es necesario poner a cero los primeros 440 bytes:
# dd if=/dev/zero of=/dev/sdX bs=440 count=1