dd es una utilidad de línea de comandos para Unix y sistemas operativos similares a Unix , cuyo propósito principal es convertir y copiar archivos. [1]
Autor (es) original (es) | Ken Thompson ( Laboratorios Bell de AT&T ) |
---|---|
Desarrollador (es) | Varios desarrolladores comerciales y de código abierto |
Versión inicial | Junio de 1974 |
Repositorio | git |
Sistema operativo | Unix , similar a Unix , Plan 9 , Inferno |
Plataforma | Multiplataforma |
Tipo | Mando |
Licencia | coreutils : GPLv3 + |
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 la 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 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]
Historia
El nombre dd es una alusión a la declaración de DD encuentra en IBM 's lenguaje de control de trabajos (JCL), [3] [4] en el que es una abreviatura de 'definición de datos'. [5] La sintaxis del comando se parece más a una declaración JCL que otros comandos de Unix, tanto que Eric S. Raymond dice que "el diseño de la interfaz fue claramente una broma". [3] La interfaz se rediseñó en el comando dd de Plan 9 para usar un estilo de opción de línea de comandos. [6] a dd
veces se llama con humor "Disk Destroyer", debido a sus capacidades de borrado de unidades. [7]
Originalmente destinado a convertir entre ASCII y EBCDIC , dd apareció por primera vez en la versión 5 de Unix . [8] El El comando dd se especifica desde la publicación X / Open Portability Guide, edición 2 de 1987. Este es heredado por IEEE Std 1003.1-2008 ( POSIX ), que es parte de la Especificación Única de UNIX . [9]
La versión dd
incluida en GNU coreutils fue escrita por Paul Rubin, David MacKenzie y Stuart Kemp. [10]
Uso
La sintaxis de la línea de comandos de dd se diferencia de muchos otros programas de Unix. Utiliza la sintaxis opción = valor para sus opciones de línea de comandos en lugar de las más estándar - valor de la opción o - opción = formatos de valor . Por defecto, dd lee de stdin y escribe en stdout , pero estos se pueden cambiar usando el if (archivo de entrada) y de las opciones (archivo de salida). [9]
Ciertas características de dd dependerá de las capacidades del sistema informático, como Capacidad de dd para implementar una opción para el acceso directo a la memoria. Enviar una señal SIGINFO (o una señal USR1 en Linux) a un El proceso dd hace que imprima estadísticas de E / S con 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 EOF están determinados por el software. Por ejemplo, las herramientas de Unix portadas a Windows varían en cuanto al EOF: Cygwin usa Ctrl+ D(el EOF de Unix habitual) y MKS Toolkit usa Ctrl+ Z(el EOF de Windows habitual).
Las partes no estandarizadas de la invocación dd varían entre implementaciones.
Mensajes de salida
En la terminación, dd imprime en el flujo stderr acerca de las estadísticas de la transferencia de datos. El formato está estandarizado en POSIX. [9] ( STDERR ) La página de 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, p. Ej., Porque el medio físico terminó antes de leer un bloque completo o un error físico impidió la lectura del bloque completo.
Tamaño de bloque
Un bloque es una unidad que mide el número 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 el tamaño del bloque ( bs ) la opción anulará tanto ibs y 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 obligatorio de POSIX de "un bloque"). La La opción de recuento para copiar se mide en bloques, al igual que los salte el conteo para leer y busca contar para escribir. Las operaciones de conversión también se ven afectadas por el "tamaño del bloque de conversión" ( cbs ). [9] ( OPERANDOS )
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 del bloque es un número entero de unidades más grandes que bytes. POSIX solo especifica los sufijos b (bloques) para 512 y k ( kibibytes ) para 1024. [9] ( OPERANDS ) La implementación difiere en los sufijos adicionales que admiten: (Gratis) BSD usa minúsculas m ( mebibytes ), g ( gibibytes ), y así sucesivamente para tebibytes , exbibytes , pebibytes , zebibytes y yobibytes , [11] mientras que GNU usa M y G para las mismas unidades, con kB , MB y GB utilizados para sus equivalentes 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 comprenden el carácter x como operador de multiplicación tanto para el tamaño de bloque como para los parámetros de recuento. 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, pero GNU no parece admitirlo. [9] ( OPERANDS ) Como resultado, es más portátil usar la sintaxis aritmética de shell POSIX de .bs=$((2*80*18))b
El tamaño del bloque tiene un efecto en el rendimiento de la copia. comandos dd . Hacer muchas lecturas o escrituras pequeñas suele ser más lento que hacer menos lecturas grandes. El uso de bloques grandes requiere más RAM y puede complicar la recuperación de errores. Cuándo dd se utiliza con dispositivos de tamaño de bloque variable, como unidades de cinta o redes, el tamaño del bloque puede determinar el tamaño del registro de la cinta o el tamaño del paquete , según el protocolo de red utilizado.
Usos
La El comando dd se puede utilizar para una variedad de propósitos. Para los comandos de copia simple, tiende a ser más lento que las alternativas específicas del dominio, pero sobresale en 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 archivo. [12]
Los ejemplos siguientes asumen el uso de GNU dd, principalmente en el argumento de tamaño de bloque. Para hacerlos portátiles, reemplácelos, por ejemplo, bs=64M
con la expresión aritmética de shell bs=$((64*1024*1024))
o bs=$((64 << 20))
(escrito de forma equivalente con un desplazamiento de bits ).
Transferencia de datos
dd puede duplicar datos en archivos, dispositivos, particiones y volúmenes. Los datos pueden ser de entrada o salida hacia y desde cualquiera de estos; pero existen diferencias importantes con respecto a la salida cuando se pasa a una partición. Además, durante la transferencia, los datos se pueden modificar utilizando el opciones de conv para adaptarse al medio. (Para este propósito, sin embargo, dd es más lento que cat .) [12]
blocks = $ (isosize -d 2048 / dev / sr0) | Crea una imagen de disco ISO a partir de un CD-ROM , DVD o disco Blu-ray . [13] |
dd if = system.img of = / dev / sdc bs = 64M conv = noerror | Restaura una unidad de disco duro (o una tarjeta SD, por ejemplo) a partir de una imagen creada anteriormente. |
dd if = / dev / sdb2 de = partición.imagen bs = 64M conv = noerror | Cree una imagen de la partición sdb2, usando un tamaño de bloque de 64 MiB. |
dd if = / dev / sda2 of = / dev / sdb2 bs = 64M conv = noerror | Clona una partición a otra. |
dd if = / dev / ad0 of = / dev / ad1 bs = 64M conv = noerror | Clona una unidad de disco duro "ad0" a "ad1". |
La La opción noerror significa continuar si hay un error, mientras que La opción de sincronización hace que los bloques de salida se rellenen.
Modificación in situ
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 = path / to / file bs = 512 count = 1 conv = notrunc
La 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 solo. Sin esta opción, dd crearía un archivo de salida de 512 bytes de longitud.
Copia de seguridad y restauración del registro de arranque maestro
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 inicio maestro .
Para duplicar los dos primeros sectores de un disquete:
dd if = / dev / fd0 of = MBRboot .img bs = 512 count = 2
Limpiar disco
Por razones de seguridad, a veces es necesario limpiar el disco de un dispositivo desechado. Esto se puede lograr mediante una "transferencia de datos" desde los archivos especiales de Unix.
- Para escribir ceros en un disco, use .
dd if=/dev/zero of=/dev/sda bs=16M
- Para escribir datos aleatorios en un disco, use .
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 la El archivo de salida de dd es un dispositivo de bloque. [14]
La 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 poner a cero la unidad, porque la CPU debe crear los datos aleatorios, 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. [15] Sin embargo, con otros tipos de unidades, como las memorias flash, es posible que se puedan recuperar muchos datos 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 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 requerida ] Cuando esté disponible, esto es más rápido que usar dd y más seguro. [ cita requerida ] En máquinas Linux se puede acceder a través del comando hdparm- opción mejorada de borrado de seguridad .
El programa de destrucción ofrece múltiples sobrescrituras, así como una eliminación más segura de archivos individuales.
Recuperación de datos
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 ( buscar ) y otros entornos de bajo nivel. La vainilla dd , sin embargo, es torpe 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 un solo bloque también limita la granularidad de la recuperación, ya que se debe hacer una compensación: use uno pequeño para recuperar más datos o use uno grande para la velocidad.
Programa de aire acondicionado llamado dd_rescue [16] fue escrito en octubre de 1999. Eliminó la funcionalidad de conversión de dd y admite dos tamaños de bloque para solucionar el dilema. Si falla una lectura que usa un tamaño grande, recurre al tamaño más pequeño para recopilar la mayor cantidad de datos posible. También puede funcionar al revés. En 2003, un El script dd_rhelp fue escrito para automatizar el proceso de uso dd_rescue , realizando un seguimiento de las áreas que se han leído por sí solo. [17]
En 2004, GNU escribió una utilidad separada, no relacionada con dd , llamado 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 dd_rescue y dd_rhelp lo considera superior a su implementación. [18] Para ayudar a distinguir el programa GNU más nuevo del script anterior, a veces se usan nombres alternativos para GNU ddrescue , incluido addrescue (el nombre en freecode.com y freshmeat.net), gddrescue ( nombre del paquete Debian ) y gnu_ddrescue ( nombre del paquete openSUSE ).
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 .
Evaluación comparativa del rendimiento de la unidad
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:
- Rendimiento de escritura:
dd if=/dev/zero bs=1024 count=1000000 of=1GB_file_to_write
- Leer rendimiento:
dd if=1GB_file_to_read of=/dev/null bs=1024
Generando un archivo con datos aleatorios
Para hacer un archivo de 100 bytes aleatorios usando el controlador aleatorio del kernel:
dd if = / dev / urandom of = myrandom bs = 100 count = 1
Conversión de un archivo a mayúsculas
Para convertir un archivo a mayúsculas:
dd if = nombre de archivo de = nombre de archivo1 conv = ucase, notrunc
Indicador de progreso
Al ser un programa diseñado principalmente como filtro, dd normalmente no proporciona ninguna indicación de progreso. Esto se puede solucionar enviando un Señal USR1 al GNU en ejecución dd proceso, lo que resulta en dd imprimiendo el número actual de bloques transferidos.
El siguiente de una sola línea da como resultado una salida continua de 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 ; dormir 10; hecho
Nuevas versiones de GNU dd apoyar el opción status = progress , que permite la impresión periódica de estadísticas de transferencia a stderr. [19]
tenedores
dcfldd
dcfldd es una bifurcación de GNU dd que es una versión mejorada desarrollada por Nick Harbor, quien en ese momento trabajaba para el Laboratorio de Informática Forense del Departamento de Defensa de los Estados Unidos . [20] [21] [22] Comparado con dd , dcfldd permite más de un archivo de salida, admite cálculos de suma de verificación múltiples simultáneos, proporciona un modo de verificación para la coincidencia de archivos y puede mostrar el porcentaje de progreso de una operación. El último lanzamiento fue en 2020. [23]
dc3dd
dc3dd es otro GNU mejorado 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 siempre que se actualice GNU upstream. Su último lanzamiento fue en 2018. [24]
Ver también
- Respaldo
- Clonación de disco
- Copia de disco
- Imagen de disco
- .img (extensión de nombre de archivo)
- Lista de comandos de Unix
- ddrescue una versión GNU que copia datos de archivos corruptos
Referencias
- ^ Grupo de Austin. "Estándar POSIX: invocación dd" . Consultado el 29 de septiembre de 2016 .
- ^ Ajedrez, Sam. "¿Cómo y cuándo usar el comando dd?" . CodeCoffee . Consultado el 19 de febrero de 2008 .
- ^ a b Raymond, Eric S. "dd" . Consultado el 19 de febrero de 2008 .
- ^ Ritchie, Dennis (17 de febrero de 2004). "Re: origen del comando dd de UNIX" . Grupo de noticias : alt.folklore.computers . Usenet: [email protected] . Consultado el 10 de enero de 2016 .
dd siempre recibió el nombre de las tarjetas dd de JCL.
- ^ Shein, Barry (22 de abril de 1990). "Re: etimología del comando" dd "de Unix" . Grupo de noticias : alt.folklore.computers . Usenet: [email protected] . Consultado el 14 de julio de 2016 .
- ^ - Manual del programador de Plan 9 , Volumen 1
- ^ "Cómo usar dd en Linux sin destruir tu disco" . Opensource.com . 2018-07-05 . Consultado el 11 de octubre de 2020 .
- ^ McIlroy, MD (1987). Un lector de investigación Unix: extractos comentados del Manual del programador, 1971–1986 (PDF) (Informe técnico). CSTR. Bell Labs. 139.
- ^ a b c d e f - Referencia de comandos y utilidades, la especificación única de UNIX , número 7 de The Open Group
- ^ a b - Manual del usuario de Linux - Comandos de usuario
- ^ - Manual de comandos generales de FreeBSD
- ^ a b Gilles (2011). "La clonación - dd vs cat - ¿sigue siendo relevante dd en estos días?" . Stack Exchange de Unix y Linux .
- ^ Leyendo una imagen ISO de un CD, DVD o BD , documentación de ARCH linux, consultado: 2017-01-22.
- ^ "linux - ¿Por qué usar conv = notrunc al clonar un disco con dd?" . Desbordamiento de pila. 2013-12-11 . Consultado el 24 de marzo de 2014 .
- ^ Wright, Craig; Kleiman, Dave; Sundhar RS, Shyaam (2008). "Sobrescritura de datos del disco duro: la gran controversia de borrado". Apuntes de conferencias en Ciencias de la Computación . Seguridad de los sistemas de información. 5352 : 243-257. doi : 10.1007 / 978-3-540-89862-7_21 . ISBN 978-3-540-89861-0.
- ^ "dd_rescue" . garloff.de .
- ^ LAB Valentin (19 de septiembre de 2011). "repositorio del autor dd_rhelp" .
Nota importante: Durante algunas ocasiones, dd_rhelp era la única herramienta (AFAIK) que hacía este tipo de trabajo, pero desde hace unos años, ya no es cierto: Antonio Diaz sí escribió un reemplazo ideal para mi herramienta: GNU 'ddrescue'.
- ^ "Ddrescue - Proyecto GNU - Free Software Foundation (FSF)" . gnu.org .
- ^ "GNU Coreutils: dd invocación" . El sistema operativo GNU y el movimiento del software libre . Consultado el 26 de agosto de 2019 .
- ^ "DCFLDD en Source Forge" . Fuente Forge . Consultado el 17 de agosto de 2013 .
- ^ Jeremy Faircloth, Chris Hurley (2007). Kit de herramientas de código abierto de Penetration Tester . Syngress. págs. 470–472. ISBN 9780080556079.
- ^ Jack Wiles, Anthony Reyes (2011). The Best Damn Cybercrime and Digital Forensics Book Period . Syngress. págs. 408–411. ISBN 9780080556086.
- ^ "dcfldd: versión mejorada de dd para análisis forense y seguridad" . GitHub . Consultado el 19 de noviembre de 2020 .
- ^ "dc3dd" . SourceForge .
enlaces externos
- : convertir y copiar un archivo - Referencia de comandos y utilidades, La especificación única de UNIX , Edición 7 de The Open Group
- - Manual del programador de Plan 9 , Volumen 1
- - Manual de comandos generales de Inferno
- dd : página de manual de GNU Core Utilities .
- - Manual de comandos generales de Darwin y macOS
- dd para Windows .
- savehd7 : guarde una partición de disco duro potencialmente dañada
- Página de Softpanorama dd .
- DD en Linux Questions Wiki .
- Forense (DD) Dcfldd
- ddpt : una variante especializada en archivos que son dispositivos de bloque
- sg_dd : variante especializada de Linux para dispositivos que utilizan el conjunto de comandos SCSI