Comando dd

Comando dd

El comando dd es una potente herramienta de Linux utilizada para copiar y convertir archivos a bajo nivel. Su nombre proviene de "data duplicator" (o de la sentencia DD de los sistemas JCL de IBM). Es ampliamente utilizado para la clonación de discos, creación de copias de seguridad de particiones enteras, volcado de imágenes de sistemas operativos en memorias USB y pruebas de rendimiento de lectura y escritura.

Categoría Discos y almacenamiento
Disponible en Linux (coreutils)
Equivalente en Windows certutil, herramientas de terceros como Rufus o Win32 Disk Imager
Sustituye a No tiene un sustituto directo; es el estándar de bajo nivel.
¿Requiere permisos de administrador? Sí, habitualmente requiere privilegios de superusuario (sudo) para acceder directamente a dispositivos físicos (como /dev/sdX).

¿Qué significa su nombre?

DD proviene tradicionalmente de Dataset Definition (Definición de conjunto de datos) heredado de los sistemas operativos IBM OS/360, aunque en el ecosistema Unix/Linux popularmente se le conoce como Data Duplicator (Duplicador de datos).

Es un comando clásico del sistema operativo Unix que opera directamente a nivel de bloques, procesando la información sin interpretar el contenido ni la estructura de los archivos o sistemas de ficheros.

¿Para qué sirve?

El comando dd sirve para copiar flujos de datos byte a byte entre archivos, particiones, discos duros completos o dispositivos de almacenamiento externo. Permite especificar el tamaño de los bloques de lectura y escritura, transformar formatos (como convertir texto de ASCII a EBCDIC o cambiar mayúsculas y minúsculas) y realizar operaciones de clonación integral.

Es una herramienta de doble filo en la administración de sistemas: debido a que opera sin confirmaciones previas y directamente sobre los dispositivos físicos, un error en la selección de los parámetros de origen (if) o destino (of) puede provocar la pérdida irreversible de datos (por lo que popularmente se le suele llamar "disk destroyer").

Sintaxis

dd if=[origen] of=[destino] [opciones]

Los parámetros y opciones más habituales son:

Parámetro / Opción Descripción
if=archivo Especifica el archivo, partición o dispositivo de entrada (input file).
of=archivo Especifica el archivo, partición o dispositivo de salida (output file).
bs=bytes Establece el tamaño del bloque de lectura y escritura (ej. 4M, 512). Acelera drásticamente la transferencia.
count=N Copia únicamente N bloques especificados por bs.
status=progress Muestra una barra de progreso periódica durante la transferencia de datos.

Comandos más utilizados

Comando Descripción
dd if=... of=... status=progress Copia datos mostrando una barra de progreso en tiempo real.
dd if=/dev/zero of=archivo bs=1M count=100 Crea un archivo de un tamaño determinado rellenado de ceros (útil para pruebas).
dd if=/dev/sda of=/path/backup.img bs=64K status=progress Genera una imagen de copia de seguridad completa de un disco duro.
dd if=imagen.iso of=/dev/sdb status=progress Graba una imagen ISO booteable en un pendrive USB.

Equivalencia con otros sistemas

Acción Linux antiguo Linux actual Windows
Copia de bajo nivel / Bloques dd dd Herramientas gráficas (Rufus, Win32 Disk Imager)
Generar archivo de relleno / cero dd dd / fallocate fsutil file createnew
Clonación de discos físicos dd dd / ddrescue Software de clonación (Clonezilla, Macrium)
Verificar integridad / Hash md5sum sha256sum certutil -hashfile

Ejemplos

Crear una imagen ISO de un disco o partición

sudo dd if=/dev/sdb of=/home/usuario/imagen_usb.iso bs=4M status=progress

Flasear o grabar una imagen ISO en una memoria USB

sudo dd if=ubuntu.iso of=/dev/sdX bs=4M status=progress conv=fsync

Crear un archivo de prueba con un tamaño exacto de 1 GB lleno de ceros

dd if=/dev/zero of=archivo_prueba.img bs=1M count=1000 status=progress

Hacer una copia de seguridad comprimida rápida combinándolo con gzip

sudo dd if=/dev/sda bs=64K | gzip > /mnt/backup/disco_duro.img.gz

Ejemplo de salida

78124416+0 registros leídos
78124416+0 registros escritos
40000083200 bytes (40 GB, 37 GiB) copiados, 125,431 s, 319 MB/s

¿Cómo interpretar la salida?

  • registros leídos / escritos: número de bloques completos y parciales procesados según el tamaño indicado en bs.
  • bytes copiados: volumen total de información transferida en formato absoluto y legible.
  • tiempo transcurrido: duración total de la operación de copia de datos en segundos.
  • velocidad de transferencia: rendimiento medio sostenido de lectura y escritura durante el proceso.

Errores habituales

  • Intercambiar los parámetros if (origen) y of (destino), lo que puede sobrescribir un disco de datos importante con una partición vacía o ceros.
  • No utilizar privilegios de administrador (sudo) al intentar volcar información directamente sobre dispositivos físicos de bloques (/dev/sdX).

Conceptos relacionados

  • Dispositivos de bloques
  • Sistema de ficheros
  • Imagen ISO
  • Clonación de discos
  • Tabla de particiones
  • Tamaño de bloque (block size)

Comandos relacionados

  • lsblk
  • fdisk
  • mount
  • df
  • cp
  • gzip

Curiosidades

Debido a su sintaxis particular basada en argumentos de estilo antiguo (separados por el signo igual sin espacios) y al riesgo crítico de sobreescritura accidental si se confunden los parámetros if y of, los administradores de sistemas suelen bromear diciendo que dd significa "Destroy Disk" (Destruir Disco) o "Data Destroyer" en lugar de su significado real.


Prácticas propuestas

  1. Ejecuta un comando con dd utilizando /dev/zero como origen y un archivo temporal de 50 MB como destino, especificando bloques de 1 MB. ¿Cuánto tiempo tarda en completarse?
  2. Utiliza el parámetro status=progress junto con un comando de copia de un archivo grande para observar cómo se actualiza la información de velocidad en pantalla.
  3. Genera una copia de seguridad comprimida de una pequeña partición o archivo del sistema utilizando una tubería (|) con el comando gzip.
  4. Comprueba el espacio libre de tu almacenamiento antes y después de generar un archivo ficticio grande con dd utilizando el comando df -h.
  5. Investiga qué ocurre si ejecutas dd sin permisos de administrador (sudo) al intentar leer directamente un disco físico completo.
  6. Compara el comportamiento del comando cp frente a dd a la hora de duplicar un archivo de texto común. ¿Qué diferencias principales aprecias en su funcionamiento interno?

Consejo: Revisa siempre dos veces los parámetros if= (origen) y of= (destino) antes de pulsar Intro al utilizar dd sobre dispositivos físicos, ya que una confusión puede borrar irreversiblemente la información de tu disco principal.