Linux / Comando dd: copiar datos por bloques y verificar origen y destino

dd es un comando que lee datos de la entrada en bloques y los escribe en la salida, controlando el tamaño del bloque y el método de conversión. Es útil para la creación y restauración de imágenes de disco, copiado de secciones limitadas y conversión de formatos de datos, pero si se especifica incorrectamente of, se puede sobrescribir inmediatamente el disco o archivo destino.

En este artículo se explican if y of, bs·count·skip·seek, la visualización de progreso, el manejo de errores y las opciones de sincronización, destacando el procedimiento de verificación antes de operar con dispositivos.

¿Qué es el comando dd?

dd básicamente lee de la entrada estándar y escribe en la salida estándar, especificando la entrada y salida con if= y of=. A diferencia de los comandos comunes, los operandos principales usan el formato NOMBRE=VALOR y no se coloca espacio alrededor del signo igual. El archivo de salida se puede truncar de forma predeterminada si no se especifica conv=notrunc.

Sintaxis básica

dd [OPERANDO]...

Los operandos principales de dd usan NOMBRE=VALOR. Para rutas con espacios, escriba, por ejemplo, if="ruta de entrada" y of="ruta de salida"; no aplique sin más la sintaxis de operandos de cp. Los ejemplos son independientes: use primero un directorio nuevo con archivos desechables y destinos que pueda reemplazar. Compruebe las opciones de su versión con dd --help y man dd.

Uso básico de dd

Copiar un archivo a otro

if es el archivo de entrada y of es el archivo de salida. Para la copia de archivos común, generalmente cp es más simple, pero se usa dd cuando se necesita control de bloques.

dd if=source.img of=copy.img bs=4M status=progress

Crear archivo de prueba de tamaño fijo

El siguiente ejemplo solicita escribir 100 bloques de 1 MiB de ceros, es decir, 100 MiB. No usa conv=sparse, por lo que genera operaciones de escritura; la compresión, deduplicación y otras funciones del almacenamiento pueden alterar la asignación física. Verifique espacio y carga antes de ejecutarlo y no lo use como prueba de borrado físico.

dd if=/dev/zero of=test.bin bs=1M count=100 status=progress

Guardar imagen de disco en un archivo

Si el dispositivo está en uso, la imagen puede ser inconsistente. Desmonte si es posible o use una instantánea, y verifique el dispositivo de lectura con precisión.

sudo dd if=/dev/sdb of=/backup/disk-sdb.img bs=16M status=progress conv=fsync

Verificar resultado de la copia con un archivo pequeño en lugar del dispositivo

dd copia byte a byte desde la entrada (if=) a la salida (of=). Si indica incorrectamente la ruta del dispositivo, los datos se sobrescribirán, así que primero comprenda el funcionamiento con un archivo normal pequeño.

printf 'ABC' > source.bin
dd if=source.bin of=copy.bin bs=1 status=none
cmp -s source.bin copy.bin
echo $?

El estado 0 de cmp significa que ambos archivos tienen el mismo contenido en bytes. status=none omite el progreso y el resumen de dd, pero no oculta sus diagnósticos de error. La igualdad de estos archivos pequeños no verifica por sí sola un dispositivo real, su estado de montaje ni la posibilidad de restaurarlo.

Opciones principales

Opciones Descripción
if=FILE Especifique el archivo o dispositivo de entrada.
of=FILE Especifica el archivo o dispositivo de salida.
bs=SIZE Especifica el tamaño de los bloques de entrada y salida juntos.
count=N Limita el número de bloques de entrada a copiar.
skip=N Omite la cantidad de bloques especificada desde la entrada.
seek=N Escribe desde la posición saltando la cantidad de bloques especificada en la salida.
status=progress Muestra periódicamente la cantidad transferida y el progreso.
conv=noerror,sync Continúa después de un error de lectura y rellena bloques cortos. Se deben entender los propósitos y limitaciones para la recuperación.
conv=fsync Solicita la sincronización de los datos de salida y los metadatos antes de finalizar.
iflag=fullblock Reúna lecturas cortas para llenar el bloque de entrada. Puede ser importante en la entrada de tuberías.

Las opciones largas facilitan entender su significado y también ayudan a revisar scripts. Sin embargo, en scripts donde la portabilidad es importante, primero verifique si el sistema objetivo soporta esas opciones de extensión GNU.

Ejemplos de uso práctico

Restaurar la imagen después de identificar el dispositivo

La restauración sobrescribe las particiones y los datos existentes del dispositivo de salida. El nombre del dispositivo puede variar según el reinicio o el orden de conexión, así que verifique el modelo, el número de serie, el tamaño y el estado de montaje, y desmonte el sistema de archivos de destino.

lsblk -o NAME,SIZE,MODEL,SERIAL,FSTYPE,MOUNTPOINTS
findmnt
sudo dd if=/backup/disk.img of=/dev/sdc bs=16M status=progress conv=fsync

Extraer solo parte del archivo

Con bs=1M, el ejemplo omite 100 MiB y copia como máximo 20 MiB. Si la entrada termina antes, la salida puede ser menor sin que eso signifique por sí solo un fallo. Para expresar desplazamientos y límites en bytes, compruebe si su GNU dd admite iflag=skip_bytes,count_bytes.

dd if=disk.img of=segment.bin bs=1M skip=100 count=20 status=progress

Verificar los resultados de la copia

Verifique el estado de salida de dd, el tamaño y el contenido conforme al objetivo. Los hashes solo son comparables si cubren exactamente la misma secuencia de bytes: el hash de un dispositivo más grande no coincide necesariamente con el de la imagen escrita en su inicio. conv=fsync solicita sincronizar los datos y metadatos de salida antes de finalizar; no sustituye una lectura de verificación ni una prueba de recuperación. Para datos de servicios en uso, prepare una copia coherente con las herramientas de la aplicación.

sha256sum source.img copy.img
stat -c '%s %n' source.img copy.img
sync

Comparación con comandos relacionados con dd

Comando / método Rol principal Situaciones adecuadas
dd Copia y transformación por bloques Trabajos basados en imágenes de disco y desplazamiento
cp Copia general a nivel de sistema de archivos Copia de archivos y directorios normales
rsync Sincronización de archivos incrementales y remotos Copias de seguridad repetidas y copia en red
ddrescue Reintentos y archivos de mapa especializados en recuperación de medios defectuosos Estructuras de datos accesibles en discos con errores de lectura

Precauciones al usar

Si se intercambian if y of, se puede perder el original

of es el objetivo de escritura. Verifique nuevamente la identificación del dispositivo y la dirección de entrada/salida justo antes de ejecutar el comando.

Un bloque grande no siempre es más rápido.

El tamaño adecuado varía según el dispositivo, el caché del kernel y el tipo de operación. Los bloques demasiado grandes pueden aumentar la unidad de recuperación de errores y el uso de memoria.

Para la recuperación de discos defectuosos, considere herramientas dedicadas.

conv=noerror,sync es solo una función de manejo continuo de errores simples. Para recuperación que requiere reintentos repetidos y gestión detallada del progreso, herramientas dedicadas como GNU ddrescue son más adecuadas.

FAQ

¿Qué son if y of en dd?

if es la entrada que se va a leer, of es la salida que se sobrescribe. Cambiar la dirección en operaciones de dispositivo puede causar una pérdida de datos catastrófica.

¿Cómo se puede ver el progreso?

En GNU dd se agrega status=progress. Verifique por separado las estadísticas finales y si la escritura se completó realmente.

¿Se especifica la ruta de la partición al escribir una imagen de arranque USB?

Las imágenes comunes de disco completo a menudo se escriben en todo el dispositivo de destino, no en una partición, pero debe seguir las instrucciones del formato de imagen. Asegúrese de verificar la selección del dispositivo.

¿Se puede recuperar un disco con errores de lectura usando dd?

Se pueden leer algunos datos, pero para la recuperación que requiere reintentos de áreas dañadas y reanudación después de interrupciones, generalmente son más adecuados herramientas dedicadas como GNU ddrescue.

Para comparar otras herramientas, consulte la Lista de comandos de uso frecuente en Linux. Para consultar las reglas y opciones, use Documentación oficial de GNU Coreutils dd y Manual oficial de GNU Coreutils.