dd es una utilidad de línea de comandos para Unix , Plan 9 , Inferno y sistemas operativos similares a Unix y posteriores, cuyo objetivo principal es convertir y copiar archivos. [1] En Unix, los controladores de dispositivos para hardware (como unidades de disco duro ) y archivos de dispositivos especiales (como /dev/zero y /dev/random ) aparecen en el sistema de archivos como archivos normales; dd también puede leer y/o escribir desde/hacia estos archivos, siempre que esa función esté implementada en su controlador respectivo. Como resultado, dd se puede utilizar para tareas como hacer una copia de seguridad del sector de arranque de un disco duro y obtener una cantidad fija de datos aleatorios. El programa dd también puede realizar conversiones de los datos a medida que se copian, incluido el intercambio de orden de bytes y la conversión hacia y desde las codificaciones de texto ASCII y EBCDIC . [2]
En 1974, el comando dd apareció como parte de la Versión 5 de Unix . Según Dennis Ritchie , el nombre es una alusión a la declaración DD que se encuentra en el lenguaje de control de trabajos (JCL) de IBM , [3] [4] en el que es una abreviatura de "Definición de datos". [5] [6] Según Douglas McIlroy , dd estaba "originalmente destinado a convertir archivos entre el mundo ASCII , little-endian y de flujo de bytes de las computadoras DEC , y el mundo EBCDIC , big-endian y bloqueado de IBM "; explicando así el contexto cultural de su sintaxis. [7] Eric S. Raymond cree que "el diseño de la interfaz fue claramente una broma", debido a que la sintaxis del comando se parece más a una declaración JCL que otros comandos de Unix. [4]
En 1987, el comando dd se especifica en la edición 2 de la Guía de portabilidad X/Open de 1987. Esto lo hereda IEEE Std 1003.1-2008 ( POSIX ), que forma parte de la especificación única de UNIX . [8]
En 1990, David MacKenzie anunció GNU fileutils (ahora parte de coreutils ) que incluye el dd
comando; [9] fue escrito por Paul Rubin, David MacKenzie y Stuart Kemp. [10] Desde 1991, Jim Meyering es su mantenedor. [11]
En 1995, se publicó la segunda edición del Plan 9 ; su interfaz de comando dd fue rediseñada para usar un estilo de opción de línea de comando tradicional en lugar de un estilo de declaración JCL. [12]
Desde al menos 1999, [13] , un puerto Win32 nativo para Microsoft Windows bajo UnxUtils . [14]
dd
A veces se le llama con humor "Destructor de discos", debido a sus capacidades de borrado de unidades que involucran errores tipográficos. [15]
La sintaxis de la línea de comando de dd difiere de la de muchos otros programas Unix. Utiliza la sintaxis para sus opciones de línea de comandos en lugar de los formatos o más estándar . De forma predeterminada, dd lee desde stdin y escribe en stdout , pero esto se puede cambiar usando las opciones if (archivo de entrada) y of (archivo de salida). [8]option=value
-option value
--option=value
Ciertas características de dd dependerán de las capacidades del sistema informático, como la capacidad de dd para implementar una opción de acceso directo a la memoria. Enviar una señal SIGINFO (o una señal USR1 en Linux) a un proceso dd en ejecución hace que imprima estadísticas de E/S al error estándar una vez y luego continúe copiando. dd puede leer la entrada estándar desde el teclado. Cuando se alcance el final del archivo (EOF), dd saldrá. Las señales y el EOF están determinados por el software. Por ejemplo, las herramientas de Unix trasladadas a Windows varían en cuanto al EOF: Cygwin usa + (el EOF habitual de Unix) y MKS Toolkit usa + (el EOF habitual de Windows).CtrlDCtrlZ
Las partes no estandarizadas de la invocación de dd varían según la implementación.
Al finalizar, dd imprime en el flujo stderr las estadísticas de la transferencia de datos. El formato está estandarizado en POSIX. [8] : STDERR La página del manual de GNU dd no describe este formato, pero los manuales de BSD sí.
Cada una de las líneas "Registros de entrada" y "Registros de salida" muestra el número de bloques completos transferidos + el número de bloques parciales, por ejemplo, porque el medio físico terminó antes de que se leyera un bloque completo, o porque un error físico impidió la lectura del bloque completo.
Un bloque es una unidad que mide la cantidad de bytes que se leen, escriben o convierten al mismo tiempo. Las opciones de línea de comandos pueden especificar un tamaño de bloque diferente para entrada/lectura ( ibs ) en comparación con salida/escritura ( obs ), aunque la opción de tamaño de bloque ( bs ) anulará tanto ibs como obs . El valor predeterminado para los tamaños de bloque de entrada y salida es 512 bytes (el tamaño de bloque tradicional de los discos y el tamaño de "un bloque" exigido por POSIX). La opción de conteo para copiar se mide en bloques, al igual que el conteo de omisiones para lectura y el conteo de búsquedas para escritura. Las operaciones de conversión también se ven afectadas por el "tamaño del bloque de conversión" ( cbs ). [8] : OPERANDOS
El valor proporcionado para las opciones de tamaño de bloque se interpreta como un número entero de bytes decimal (base 10). También puede contener sufijos para indicar que el tamaño del bloque es un número entero de unidades mayores que los bytes. POSIX solo especifica los sufijos b (bloques) para 512 y k ( kibibytes ) para 1024. [8] : La implementación de OPERANDOS difiere en los sufijos adicionales que admiten: BSD (gratis) usa minúsculas m ( mebibytes ), g ( gibibytes ) y y así sucesivamente para tebibytes , exbibytes , pebibytes , zebibytes y yobibytes , [16] mientras que GNU usa M y G para las mismas unidades, con kB , MB y GB usados para sus contrapartes de unidades SI ( kilobytes ). [10] Por ejemplo, para GNU dd , bs=16M indica un tamaño de bloque de 16 mebibytes (16777216 bytes) y bs=3kB especifica 3000 bytes.
Además, algunas implementaciones entienden el carácter x como un operador de multiplicación tanto para el tamaño del bloque como para los parámetros de conteo. Por ejemplo, bs=2x80x18b se interpreta como 2 × 80 × 18 × 512 =1.474.560 bytes , el tamaño exacto de un disquete de 1440 KiB . Esto es necesario en POSIX. [8] : OPERANDOS Para implementaciones que no admiten esta función, se puede utilizar la sintaxis aritmética del shell POSIX .bs=$((2*80*18))b
El tamaño del bloque tiene un efecto en el rendimiento de la copia de comandos dd . Realizar muchas lecturas o escrituras pequeñas suele ser más lento que realizar pocas lecturas grandes. El uso de bloques grandes requiere más RAM y puede complicar la recuperación de errores. Cuando se utiliza dd con dispositivos de tamaño de bloque variable, como unidades de cinta o redes, el tamaño del bloque puede determinar el tamaño de la grabación de cinta o el tamaño del paquete , según el protocolo de red utilizado.
El comando dd se puede utilizar para diversos propósitos. Para comandos de copia simple, tiende a ser más lento que las alternativas específicas de dominio, pero sobresale por su capacidad única de "sobrescribir o truncar un archivo en cualquier punto o buscar en un archivo", una interfaz de nivel bastante bajo para Unix. API de archivos. [17]
Los ejemplos siguientes suponen el uso de GNU dd, principalmente en el argumento del tamaño del bloque. Para hacerlos portátiles, reemplácelos, por ejemplo, bs=64M
con la expresión aritmética del shell o (escrito de manera equivalente con un cambio de bit ).bs=$((64*1024*1024))
bs=$((64 << 20))
dd puede duplicar datos en archivos, dispositivos, particiones y volúmenes. Los datos podrán ser ingresados o emitidos hacia y desde cualquiera de estos; pero existen diferencias importantes en cuanto a la salida al ir a una partición. Además, durante la transferencia, los datos se pueden modificar utilizando las opciones de conv para adaptarlos al medio. (Sin embargo, para este propósito, dd es más lento que cat .) [17]
La opción noerror significa continuar si hay un error, mientras que la opción de sincronización hace que se rellenen los bloques de salida.
dd puede modificar los datos en su lugar. Por ejemplo, esto sobrescribe los primeros 512 bytes de un archivo con bytes nulos:
dd if= /dev/zero of=ruta/al/archivo bs=512 count=1 conv=notrunc
La opción de conversión notrunc significa no truncar el archivo de salida; es decir, si el archivo de salida ya existe, simplemente reemplace los bytes especificados y deje el resto del archivo de salida en paz. Sin esta opción, dd crearía un archivo de salida de 512 bytes de longitud.
El ejemplo anterior también se puede utilizar para realizar una copia de seguridad y restaurar cualquier región de un dispositivo en un archivo, como un registro de arranque maestro .
Para duplicar los dos primeros sectores de un disquete:
dd if=/dev/fd0 of=MBRboot .img bs=512 recuento=2
Por razones de seguridad, a veces es necesario borrar el disco de un dispositivo desechado. Esto se puede lograr mediante una "transferencia de datos" desde archivos especiales de Unix.
dd if=/dev/zero of=/dev/sda bs=16M
dd if=/dev/urandom of=/dev/sda bs=16M
En comparación con el ejemplo de modificación de datos anterior, la opción de conversión notrunc no es necesaria ya que no tiene ningún efecto cuando el archivo de salida de dd es un dispositivo de bloque. [19]
La opción bs=16M hace que dd lea y escriba 16 mebibytes a la vez. Para los sistemas modernos, un tamaño de bloque aún mayor puede ser más rápido. Tenga en cuenta que llenar la unidad con datos aleatorios puede llevar más tiempo que ponerla a cero, porque los datos aleatorios deben ser creados por la CPU, mientras que crear ceros es muy rápido. En las unidades de disco duro modernas, poner a cero la unidad hará que la mayoría de los datos que contiene sean permanentemente irrecuperables. [20] Sin embargo, con otros tipos de unidades, como las memorias flash, es posible que muchos datos aún se puedan recuperar mediante la remanencia de datos .
Las unidades de disco duro modernas contienen un comando de borrado seguro diseñado para borrar de forma permanente y segura cada parte accesible e inaccesible de una unidad. También puede funcionar para algunas unidades de estado sólido (unidades flash). A partir de 2017, no funciona en unidades flash USB ni en memorias flash Secure Digital . [ cita necesaria ] Cuando esté disponible, esto es más rápido que usar dd y más seguro. [ cita necesaria ] En máquinas Linux , se puede acceder a él a través de la opción --security-erase-enhanced del comando hdparm .
El programa de trituración ofrece múltiples sobrescrituras, así como una eliminación más segura de archivos individuales.
La recuperación de datos implica la lectura de una unidad con algunas partes potencialmente inaccesibles. dd
encaja bien con este trabajo con su salto flexible ( seek
) y otras configuraciones de bajo nivel. El vanilla dd
, sin embargo, es complicado de usar ya que el usuario tiene que leer los mensajes de error y calcular manualmente las regiones que se pueden leer. El tamaño de bloque único también limita la granularidad de la recuperación, ya que se debe hacer un compromiso: usar uno pequeño para recuperar más datos o usar uno grande para mayor velocidad.
El programa AC llamado dd_rescue
[21] fue escrito en octubre de 1999. Eliminó la funcionalidad de conversión de dd
y admite dos tamaños de bloque para resolver el dilema. Si falla una lectura que utiliza un tamaño grande, vuelve al tamaño más pequeño para recopilar la mayor cantidad de datos posible. También puede correr hacia atrás. En 2003, dd_rhelp
se escribió un script para automatizar el proceso de uso dd_rescue
, realizando un seguimiento de qué áreas se han leído por sí sola. [22]
En 2004, GNU escribió una utilidad separada, no relacionada con dd
, llamada ddrescue . Tiene un algoritmo dinámico de tamaño de bloque más sofisticado y realiza un seguimiento de lo que se ha leído internamente. Los autores de ambos ya lo consideran superior a su implementación. [23] Para ayudar a distinguir el programa GNU más nuevo del script más antiguo, a veces se utilizan nombres alternativos para GNU , incluidos (el nombre en freecode.com y Freshmeat.net), ( nombre del paquete Debian ) y ( nombre del paquete openSUSE ).dd_rescue
dd_rhelp
ddrescue
addrescue
gddrescue
gnu_ddrescue
Otro programa de código abierto llamado savehd7
utiliza un algoritmo sofisticado, pero también requiere la instalación de su propio intérprete de lenguaje de programación .
Para realizar una prueba comparativa de unidades y analizar el rendimiento de lectura y escritura del sistema secuencial (y generalmente de un solo subproceso) para bloques de 1024 bytes:
dd if=/dev/zero bs=1024 count=1000000 of=1GB_file_to_write
dd if=1GB_file_to_read of=/dev/null bs=1024
Para crear un archivo de 100 bytes aleatorios utilizando el controlador aleatorio del kernel:
dd if= /dev/urandom of=myrandom bs=100 count=1
Para convertir un archivo a mayúsculas:
dd if=nombre de archivo de=nombre de archivo1 conv=ucase,notrunc
Al ser un programa diseñado principalmente como filtro, dd normalmente no proporciona ninguna indicación de progreso. Esto se puede superar enviando una señal USR1 al proceso GNU dd en ejecución ( INFO en sistemas BSD), lo que da como resultado que dd imprima el número actual de bloques transferidos.
La siguiente línea da como resultado una salida continua del progreso cada 10 segundos hasta que finaliza la transferencia, cuando dd-pid se reemplaza por el ID de proceso de dd :
while kill -USR1
dd-pid; do sleep 10 ; done
Las versiones más recientes de GNU dd admiten la opción status=progress , que permite la impresión periódica de estadísticas de transferencia a stderr. [24]
dcfldd es una bifurcación de GNU dd que es una versión mejorada desarrollada por Nick Harbour, quien en ese momento trabajaba para el Laboratorio de Informática Forense del Departamento de Defensa de los Estados Unidos . [25] [26] [27] En comparación con dd , dcfldd permite más de un archivo de salida, admite múltiples cálculos simultáneos de suma de verificación, proporciona un modo de verificación para la coincidencia de archivos y puede mostrar el porcentaje de progreso de una operación. En febrero de 2024, la última versión fue la 1.9.1 de abril de 2023. [28]
dc3dd es otra bifurcación de GNU dd del Centro de Delitos Cibernéticos del Departamento de Defensa de los Estados Unidos (DC3). Puede verse como una continuación de dcfldd, con el objetivo declarado de actualizarse cada vez que se actualiza GNU upstream. En junio de 2023, la última versión fue la 7.3.1 de abril de 2023. [29][actualizar]
dd siempre recibió el nombre de las tarjetas JCL dd.
Nota importante: durante algunas ocasiones, dd_rhelp fue la única herramienta (AFAIK) que hizo este tipo de trabajo, pero desde hace unos años ya no es cierto: Antonio Díaz escribió un reemplazo ideal para mi herramienta: GNU 'ddrescue'.