Autor(es) original(es) | Ken Thompson ( Laboratorios Bell de AT&T ) |
---|---|
Desarrollador(es) | Varios desarrolladores comerciales y de código abierto |
Lanzamiento inicial | Junio de 1974 ( 1974-06 ) |
Repositorio | Utilidades básicas: git.savannah.gnu.org/cgit/coreutils.git/ |
Escrito en | Plan 9: C |
Sistema operativo | Unix , similar a Unix , Plan 9 , Inferno , Windows |
Plataforma | Multiplataforma |
Tipo | Dominio |
Licencia | coreutils : GPLv3+ Plan 9: Licencia MIT |
dd es una utilidad de línea de comandos para Unix , Plan 9 , Inferno y sistemas operativos similares a Unix y posteriores, cuyo propósito 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 respectivo controlador. Como resultado, dd se puede utilizar para tareas como realizar copias 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 en 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 fue "originalmente pensado para convertir archivos entre el mundo ASCII , little-endian, de flujo de bytes de las computadoras DEC y el mundo EBCDIC , big-endian, bloqueado de IBM "; lo que explica 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 parecía más a una declaración JCL que otros comandos de Unix. [4]
En 1987, el comando dd se especifica en la Guía de Portabilidad X/Open número 2 de 1987. Esto lo hereda IEEE Std 1003.1-2008 ( POSIX ), que es 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 lanzó la segunda edición de Plan 9 ; su interfaz de comando dd fue rediseñada para utilizar 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] existe un puerto Win32 nativo para Microsoft Windows bajo el nombre UnxUtils . [14]
dd
A veces se lo llama humorísticamente "Destructor de discos", debido a sus capacidades de borrado de unidades que involucran errores tipográficos. [15]
La sintaxis de la línea de comandos de dd difiere de la de muchos otros programas Unix. Utiliza la sintaxis de 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 utilizando las opciones if (archivo de entrada) y of (archivo de salida). [8]option=value
-option value
--option=value
Algunas 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 memoria. El envío de una señal SIGINFO (o una señal USR1 en Linux) a un proceso dd en ejecución hace que imprima las estadísticas de E/S en el error estándar una vez y luego continúe copiando. dd puede leer la entrada estándar desde el teclado. Cuando se alcanza el final del archivo (EOF), dd saldrá. Las señales y el EOF están determinados por el software. Por ejemplo, las herramientas Unix trasladadas a Windows varían en cuanto al EOF: Cygwin utiliza + (el EOF habitual de Unix) y MKS Toolkit utiliza + (el EOF habitual de Windows).CtrlDCtrlZ
Las partes no estandarizadas de la invocación de dd varían entre implementaciones.
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 la cantidad de bloques completos transferidos + la cantidad de bloques parciales, por ejemplo, porque el medio físico terminó antes de que se leyera un bloque completo o un error físico impidió leer el bloque completo.
Un bloque es una unidad que mide la cantidad de bytes que se leen, escriben o convierten a la vez. Las opciones de la línea de comandos pueden especificar un tamaño de bloque diferente para la entrada/lectura ( ibs ) en comparación con la 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 de 512 bytes (el tamaño de bloque tradicional de los discos y el tamaño exigido por POSIX de "un bloque"). La opción de conteo para copiar se mide en bloques, al igual que el conteo de saltos para la lectura y el conteo de búsquedas para la escritura. Las operaciones de conversión también se ven afectadas por el "tamaño de bloque de conversión" ( cbs ). [8] : OPERANDS
El valor proporcionado para las opciones de tamaño de bloque se interpreta como un número entero decimal (base 10) de bytes. También puede contener sufijos para indicar que el tamaño de bloque es un número entero de unidades más grandes que los bytes. POSIX solo especifica los sufijos b (bloques) para 512 y k ( kibibytes ) para 1024. [8] : OPERANDS La implementación difiere en los sufijos adicionales que admiten: (Free) BSD usa m minúscula ( mebibytes ), g ( gibibytes ), 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] : OPERANDS Para las implementaciones que no admiten esta característica, se puede utilizar la sintaxis aritmética del shell POSIX de .bs=$((2*80*18))b
El tamaño de 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 menos lecturas o escrituras 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 de bloque puede determinar el tamaño del registro de cinta o el tamaño del paquete , según el protocolo de red utilizado.
El comando dd se puede utilizar para distintos propósitos. Para los comandos de copia simple, tiende a ser más lento que las alternativas específicas del dominio, pero se destaca 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 la API de archivos de Unix. [17]
Los ejemplos que se muestran a continuación suponen el uso de GNU dd, principalmente en el argumento de tamaño de bloque. Para que sean portables, reemplace eg bs=64M
con la expresión aritmética de shell or (escrita de manera equivalente con un bit shift ).bs=$((64*1024*1024))
bs=$((64 << 20))
dd puede duplicar datos en archivos, dispositivos, particiones y volúmenes. Los datos pueden ingresarse o enviarse a y desde cualquiera de estos; pero existen diferencias importantes en cuanto a la salida cuando se va a una partición. Además, durante la transferencia, los datos pueden modificarse utilizando las opciones conv para adaptarse al medio. (Para este propósito, sin embargo, dd es más lento que cat .) [17]
| Crea una imagen de disco ISO a partir de un disco CD-ROM , DVD o Blu-ray . [18] |
dd si=sistema.img de= /dev/sdc bs=64M conv=sinerror | Restaura una unidad de disco duro (o una tarjeta SD, por ejemplo) a partir de una imagen creada previamente. |
dd if=/dev/sdb2 of=partición.imagen bs=64M conv=noerror | Cree una imagen de la partición sdb2, utilizando un tamaño de bloque de 64 MiB. |
dd si=/dev/sda2 de=/dev/sdb2 bs=64M conv=sinerror | Clona una partición a otra. |
dd si=/dev/ad0 de=/dev/ad1 bs=64M conv=sinerror | Clona una unidad de disco duro "ad0" a "ad1". |
La opción noerror significa continuar si hay un error, mientras que la opción sync hace que los bloques de salida se rellenen.
dd puede modificar datos en el 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 que no se trunca el archivo de salida; es decir, si el archivo de salida ya existe, solo se reemplazan los bytes especificados y se deja el resto del archivo de salida intacto. 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 copias 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 si=/dev/fd0 de=MBRboot.img bs =512 conteo=2
Por razones de seguridad, a veces es necesario borrar el disco de un dispositivo descartado. Esto se puede lograr mediante una "transferencia de datos" desde los 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 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 incluso mayor puede ser más rápido. Tenga en cuenta que llenar la unidad con datos aleatorios puede llevar más tiempo que poner a cero la unidad, porque los datos aleatorios deben ser creados por la CPU, mientras que la creación de ceros es muy rápida. En las unidades de disco duro modernas, poner a cero la unidad hará que la mayoría de los datos que contiene sean irrecuperables de forma permanente. [20] Sin embargo, con otros tipos de unidades, como las memorias flash, muchos datos aún pueden recuperarse 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 todas las partes accesibles e inaccesibles de una unidad. También puede funcionar con 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 requerida ] Cuando está disponible, esto es más rápido que usar dd y más seguro. [ cita requerida ] En las máquinas Linux , se puede acceder a él a través de la opción --security-erase-enhanced del comando hdparm .
El programa Shred ofrece sobrescrituras múltiples, así como una eliminación más segura de archivos individuales.
La recuperación de datos implica leer desde una unidad con algunas partes potencialmente inaccesibles. dd
es una buena opción para este trabajo con su omisión flexible ( seek
) y otras configuraciones de bajo nivel. dd
Sin embargo, la versión vanilla es complicada 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 equilibrio: o se usa uno pequeño para recuperar más datos o se usa 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 lidiar con el dilema. Si una lectura que utiliza un tamaño grande falla, vuelve al tamaño más pequeño para recopilar la mayor cantidad de datos posible. También puede ejecutarse al revés. En 2003, dd_rhelp
se escribió un script para automatizar el proceso de uso de dd_rescue
, manteniendo un registro de qué áreas se han leído por sí solo. [22]
En 2004, GNU escribió una utilidad independiente, no relacionada con ddrescue dd
, llamada ddrescue . Tiene un algoritmo de tamaño de bloque dinámico más sofisticado y lleva un registro de lo que se ha leído internamente. Los autores de ambos y 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 usan nombres alternativos para los ddrescue de 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 la unidad 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 si= /dev/urandom de=myrandom bs=100 conteo=1
Para convertir un archivo a mayúsculas:
dd if=nombrearchivo of=nombrearchivo1 conv=ucase,notrunc
Al ser un programa diseñado principalmente como filtro, dd normalmente no proporciona ninguna indicación de progreso. Esto se puede solucionar enviando una señal USR1 al proceso dd de GNU en ejecución ( INFO en sistemas BSD), lo que hace que dd imprima la cantidad actual de bloques transferidos.
La siguiente línea genera una salida continua del progreso cada 10 segundos hasta que finaliza la transferencia, momento en el que dd-pid se reemplaza por el id del proceso de dd :
while kill -USR1
dd-pid; do sleep 10 ; done
Las versiones más nuevas de GNU dd admiten la opción status=progress , que permite la impresión periódica de estadísticas de transferencia en 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 cálculos simultáneos de múltiples sumas de comprobación, proporciona un modo de verificación para la coincidencia de archivos y puede mostrar el porcentaje de progreso de una operación. A febrero de 2024, la última versión fue 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 considerarse una continuación de dcfldd, con el objetivo declarado de actualizarse siempre que se actualice el upstream de GNU. A junio de 2023, la última versión fue 7.3.1 de abril de 2023. [29][actualizar]
dd siempre recibió el nombre de tarjetas dd de JCL.
Nota importante: durante algún tiempo, dd_rhelp fue la única herramienta (que yo sepa) que hacía este tipo de trabajo, pero desde hace unos años, esto ya no es así: Antonio Díaz escribió un reemplazo ideal para mi herramienta: GNU 'ddrescue'.