stringtranslate.com

dd (Unix)

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]

Historia

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 ddcomando; [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]

ddA veces se le llama con humor "Destructor de discos", debido a sus capacidades de borrado de unidades que involucran errores tipográficos. [15]

Uso

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.

Mensajes de salida

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.

Tamaño de bloque

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.

Usos

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=64Mcon la expresión aritmética del shell o (escrito de manera equivalente con un cambio de bit ).bs=$((64*1024*1024))bs=$((64 << 20))

Transferencia de datos

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.

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=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.

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 arranque maestro .

Para duplicar los dos primeros sectores de un disquete:

dd if=/dev/fd0 of=MBRboot .img bs=512 recuento=2

borrado de disco

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.

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.

Recuperación de datos

La recuperación de datos implica la lectura de una unidad con algunas partes potencialmente inaccesibles. ddencaja 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 ddy 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_rhelpse 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_rescuedd_rhelpddrescueaddrescuegddrescuegnu_ddrescue

Otro programa de código abierto llamado savehd7utiliza un algoritmo sofisticado, pero también requiere la instalación de su propio intérprete de lenguaje de programación .

Rendimiento del motor de evaluación comparativa

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:

Generando un archivo con datos aleatorios

Para crear un archivo de 100 bytes aleatorios utilizando el controlador aleatorio del kernel:

dd if= /dev/urandom of=myrandom bs=100 count=1

Convertir 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 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]

tenedores

dcfldd

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

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]

Ver también

Referencias

  1. ^ Grupo Austin. "Estándar POSIX: invocación dd". Archivado desde el original el 10 de marzo de 2010 . Consultado el 29 de septiembre de 2016 .
  2. ^ Jugador de ajedrez, Sam. "¿Cómo y cuándo utilizar el comando dd?". CódigoCafé. Archivado desde el original el 14 de febrero de 2008 . Consultado el 19 de febrero de 2008 .
  3. ^ Ritchie, Dennis (17 de febrero de 2004). "Re: origen del comando dd de UNIX". Grupo de noticias : alt.folklore.computers. Usenet:  [email protected]. Archivado desde el original el 22 de enero de 2011 . Consultado el 10 de enero de 2016 . dd siempre recibió el nombre de las tarjetas JCL dd.
  4. ^ ab Raymond, Eric S. "dd". Archivado desde el original el 13 de diciembre de 2018 . Consultado el 19 de febrero de 2008 .
  5. ^ Lucha, George (1969). Programación en lenguaje ensamblador: IBM System/360. Reading, Mass., Pub Addison-Wesley. Co.p. 123.
  6. ^ Shein, Barry (22 de abril de 1990). "Re: etimología del comando" dd "de Unix". Grupo de noticias : alt.folklore.computers. Usenet:  [email protected]. Archivado desde el original el 24 de octubre de 2023 . Consultado el 14 de julio de 2016 .
  7. ^ McIlroy, Doctor en Medicina (1987). Un lector de Research Unix: extractos comentados del Manual del programador, 1971-1986 (PDF) (Informe técnico). CSTR. Laboratorios Bell. 139.
  8. ^ abcdef dd : referencia de shell y utilidades, la especificación única de UNIX , versión 4 de The Open Group
  9. ^ "Utilidades de archivos GNU versión 1.0". grupos.google.com . Archivado desde el original el 28 de abril de 2023 . Consultado el 28 de abril de 2023 .
  10. ^ ab dd(1) -  Manual de usuario de Linux - Comandos de usuario
  11. ^ "Quién de GNU". Archivado desde el original el 28 de abril de 2023 . Consultado el 28 de abril de 2023 .
  12. ^ dd(1)  -  Manual del programador del Plan 9 , volumen 1
  13. ^ "Puertos nativos Win32 de algunas utilidades GNU". 15 de agosto de 2000. Archivado desde el original el 15 de agosto de 2000.
  14. ^ "Puertos nativos Win32 de algunas utilidades GNU". unxutils.sourceforge.net . Archivado desde el original el 9 de febrero de 2006 . Consultado el 23 de febrero de 2022 .
  15. ^ "Cómo usar dd en Linux sin destruir tu disco". Opensource.com . 2018-07-05. Archivado desde el original el 11 de octubre de 2020 . Consultado el 11 de octubre de 2020 .
  16. ^ dd(1)  –  Manual de comandos generales de FreeBSD
  17. ^ ab Gilles (2011). "clonación - dd vs cat - ¿sigue siendo relevante dd en estos días?". Intercambio de pilas de Unix y Linux . Archivado desde el original el 24 de octubre de 2023 . Consultado el 24 de abril de 2020 .
  18. ^ "Creación de una imagen ISO desde un CD, DVD o BD". ArchiWiki . Archivado desde el original el 18 de abril de 2022 . Consultado el 18 de abril de 2022 .
  19. ^ "linux - ¿Por qué utilizar conv=notrunc al clonar un disco con dd?". Desbordamiento de pila. 2013-12-11. Archivado desde el original el 24 de marzo de 2014 . Consultado el 24 de marzo de 2014 .
  20. ^ Wright, Craig S.; Kleiman, Dave; S., Shyaam Sundhar R. (2008). "Sobrescritura de datos del disco duro: la gran controversia sobre la eliminación". En Sekar, R.; Pujari, Arun K. (eds.). Seguridad de sistemas de información, Cuarta Conferencia Internacional, ICISS 2008, Hyderabad, India, 16 al 20 de diciembre de 2008. Actas . Apuntes de conferencias sobre informática. vol. 5352. Saltador. págs. 243–257. doi :10.1007/978-3-540-89862-7_21.
  21. ^ "dd_rescue". garloff.de . Archivado desde el original el 16 de mayo de 2001 . Consultado el 10 de noviembre de 2006 .
  22. ^ LAB Valentin (19 de septiembre de 2011). "repositorio del autor dd_rhelp". Archivado desde el original el 16 de mayo de 2008 . Consultado el 13 de mayo de 2008 . 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'.
  23. ^ "Ddrescue - Proyecto GNU - Fundación de Software Libre (FSF)". gnu.org . Archivado desde el original el 2021-07-02 . Consultado el 22 de julio de 2016 .
  24. ^ "GNU Coreutils: invocación dd". El sistema operativo GNU y el movimiento del software libre . Archivado desde el original el 22 de agosto de 2019 . Consultado el 26 de agosto de 2019 .
  25. ^ "DCFLDD en Source Forge". Forja de origen. Archivado desde el original el 2 de agosto de 2013 . Consultado el 17 de agosto de 2013 .
  26. ^ Jeremy Faircloth, Chris Hurley (2007). "Kit de herramientas de código abierto de Penetration Tester" . Singreso. págs. 470–472. ISBN 9780080556079.
  27. ^ Jack Wiles, Anthony Reyes (2011). "El mejor período del libro sobre ciberdelincuencia y ciencia forense digital" . Singreso. págs. 408–411. ISBN 9780080556086.
  28. ^ "dcfldd: versión mejorada de dd para análisis forense y seguridad". GitHub. Archivado desde el original el 31 de octubre de 2020 . Consultado el 19 de noviembre de 2020 .
  29. ^ "dc3dd". FuenteForge . 25 de abril de 2023. Archivado desde el original el 25 de febrero de 2020 . Consultado el 24 de abril de 2020 .

enlaces externos