Articulo de referencia

dd (Unix)

([[AT&T Bell Laboratories]])"},"developer":{"wt":"Various [[open-source software|open-source]] and [[commercial software|commercial]] developers"},"released":{"wt":"{{Start date...

dd( Data(set) Definition ) es un comando de shell para leer, escribir y convertir datos de archivos . Desarrollado originalmente para Unix , se ha implementado en muchos otros entornos, incluidos sistemas operativos tipo Unix , Windows , Plan 9 e Inferno . [ 1 ]

El comando se puede utilizar para muchos propósitos. Para operaciones de copia relativamente sencillas, tiende a ser más lento que las alternativas específicas del dominio, pero destaca por sobrescribir o truncar un archivo en cualquier punto o por buscar en un archivo. [ 2 ]

El comando admite la lectura y escritura de archivos, y si hay un controlador disponible que admita el acceso a archivos, también puede acceder a los dispositivos. Este acceso suele ser compatible con sistemas basados ​​en Unix que proporcionan acceso a dispositivos (como almacenamiento ) y archivos de dispositivo especiales (como /dev/zero y /dev/random ) mediante este método. Por lo tanto, el comando puede utilizarse para tareas como realizar copias de seguridad del sector de arranque de una unidad y obtener datos aleatorios.

El comando también puede admitir la conversión de datos durante la copia, incluyendo el intercambio del orden de bytes y la conversión entre codificaciones de texto ASCII y EBCDIC . [ 3 ]

ddA veces se le llama humorísticamente "Destructor de discos", debido a su capacidad de borrar discos que involucran errores tipográficos . [ 4 ]

Historia

En 1974, el ddcomando apareció como parte de la versión 5 de Unix . Según Dennis Ritchie , el nombre es una alusión a la instrucción DD que se encuentra en el lenguaje de control de trabajos (JCL) de IBM , [ 5 ] [ 6 ] donde DD es la abreviatura de definición de datos . [ 7 ] [ 8 ] Al explicar el contexto cultural de su sintaxis, Douglas McIlroy ha comentado que "originalmente estaba destinado a convertir archivos entre el mundo ASCII , little-endian , de flujo de bytes de las computadoras DEC y el mundo EBCDIC , big-endian, de bloques de IBM ". [ 9 ] Eric S. Raymond cree que "el diseño de la interfaz fue claramente una broma", debido a que la sintaxis del comando se asemeja más a una instrucción JCL que otros comandos de Unix. [ 6 ]dd

En 1987, el ddcomando se especifica en la Guía de Portabilidad X/Open , número 2 de 1987. Esto es heredado por IEEE Std 1003.1-2008 ( POSIX ) , que forma parte de la Especificación UNIX Única . [ 10 ]

En 1990, David MacKenzie anunció GNU fileutils (ahora parte de coreutils ) que incluye el ddcomando; [ 11 ] fue escrito por Paul Rubin, David MacKenzie y Stuart Kemp. [ 12 ] Desde 1991, Jim Meyering es su mantenedor. [ 13 ]

En 1995, se lanzó la segunda edición de Plan 9dd con un comando que tenía un estilo de opciones de línea de comandos más tradicional que el estilo de sentencia JCL. [ 14 ]

Desde al menos 1999, UnxUtils ha proporcionado una implementación nativa para la plataforma Windows . [ 15 ] [ 16 ]

Usar

La interfaz de línea de comandos difiere significativamente de la mayoría de los comandos de shell modernos en que una opción se formatea como en lugar de la sintaxis más típica que denota una opción con un prefijo de guion como: , , , .option=value-x-y value--abc--def value

Por defecto, ddlee desde la entrada estándar y escribe en la salida estándar , pero se pueden modificar la entrada y la salida. Una opción ifespecifica un archivo de entrada y la otra, ofun archivo de salida.

Los aspectos no estandarizados dddependen del sistema o la implementación subyacente, entre los que se incluyen:

Mensajes de salida

Al completarse, ddescribe estadísticas en el error estándar . El formato está estandarizado en POSIX. [ 10 ] : 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 un error físico impidió leer el bloque completo.

Si ddrecibe una señal SIGINFO mientras se está ejecutando ( normalmente activada por el usuario al pulsar + ), escribe estadísticas intermedias en el error estándar y continúa el procesamiento.CtrlT

Tamaño del bloque

El comando procesa los datos en bloques . El tamaño predeterminado es 512 (el tamaño exigido por POSIX y un tamaño común heredado para el hardware de disco), pero se puede especificar mediante opciones de línea de comandos. La opción bsespecifica el tamaño tanto para las operaciones de entrada (lectura) como de salida (escritura). Alternativamente, la opción ibsespecifica el tamaño para las operaciones de entrada y obspara las operaciones de salida. La opción cbsafecta a las operaciones de conversión.

Opciones county especificar un número de bloques: máximo a leer, para comenzar a leer en el desplazamiento desde el inicio de la entrada y para comenzar a escribir en el desplazamiento desde el inicio de la salida, respectivamente skip. [ 10 ] : OPERANDSseek

Un valor de opción de tamaño de bloque se especifica como un número decimal entero de bytes con un sufijo opcional para indicar un multiplicador. POSIX requiere sufijos b(bloques) para 512 y k( kibibytes ) para 1024, [ 10 ] : OPERANDS pero las implementaciones difieren en otros sufijos. (Free) BSD usa mpara mebibytes , gpara gibibytes y así sucesivamente para unidades de potencia de dos mayores . [ 17 ] GNU usa My Gasí sucesivamente para estas unidades y usa kB, MB, y GBpara unidades SI . [ 12 ] Por ejemplo, para GNU dd , bs=16Mindica un tamaño de16 MiB  (16 777 216  bytes ) y bs=3kBespecifica3000  bytes .

Para cumplir con el estándar POSIX, algunas implementaciones interpretan el xcarácter como un operador de multiplicación para los valores de opción de tamaño de bloque y recuento. Por ejemplo, bs=2x80x18bse interpreta como 2 × 80 × 18 × 512 =1 474 560  bytes , el tamaño de un Disco disquete de 1440 KiB . [ 10 ] : OPERANDS 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 afecta al rendimiento. Muchas lecturas y escrituras pequeñas suelen ser más lentas que menos operaciones, pero de mayor tamaño. Como desventaja, los bloques más grandes requieren más memoria RAM y pueden complicar la recuperación de errores.

Cuando se utiliza con un dispositivo de tamaño de bloque variable, como una unidad de cinta o una red, el tamaño del bloque puede determinar el tamaño del registro de cinta o el tamaño del paquete de red , dependiendo del protocolo de red .

Ejemplos

Los ejemplos que se muestran a continuación se aplican a muchas implementaciones, pero están escritos específicamente para GNU dd. Generalmente, la única diferencia entre las implementaciones son los valores del tamaño del bloque y se pueden portables utilizando expresiones aritméticas de shell en lugar de un sufijo multiplicador de tamaño. Por ejemplo, en lugar de bs=64Musar o .bs=$((64*1024*1024))bs=$((64<<20))

Transferencia de datos

El comando puede duplicar datos en archivos, dispositivos, particiones y volúmenes, y puede transformar datos durante la transferencia según lo especificado mediante la opción conv . En algunos casos, la transferencia de datos es más rápida con cat . [ 2 ]

Para crear una imagen de disco ISO a partir de un disco CD-ROM , DVD o Blu-ray : [ 18 ]

blocks=$(isosize-d2048/dev/sr0)dd if=/dev/sr0 of=isoimage.iso bs=2048 count=$blocks status=progress

Para restaurar una unidad a partir de un archivo de imagen:

dd if=system.img of=/dev/sdc bs=64M conv=noerror

Para crear una imagen de la partición sdb2, utilizando un Tamaño del bloque: 64 MiB

dd if=/dev/sdb2 of=partition.image bs=64M conv=noerror

Para clonar una partición en otra:

dd if=/dev/sda2 of=/dev/sdb2 bs=64M conv=noerror

Para clonar la unidad ad0 a ad1; ignorando cualquier error:

dd if=/dev/ad0 of=/dev/ad1 bs=64M conv=noerror

Modificación in situ

El comando puede modificar los datos directamente. Por ejemplo, esto sobrescribe el primero.512 bytes  de un archivo con bytes nulos:

dd if=/dev/zero of=path/to/file bs=512 count=1 conv=notrunc

Esta opción conv=notruncsolicita que no se trunque el archivo de salida. Es decir, si el archivo de salida ya existe, se reemplazarán los bytes especificados y el resto del archivo permanecerá sin cambios. Sin esta opción, el comando crearía un archivo de salida de 512 bytes.

Copia de seguridad y restauración del registro de arranque maestro

El ejemplo anterior también se puede utilizar para realizar copias de seguridad y restaurar cualquier región de un dispositivo en un archivo, incluido un registro de arranque maestro . Para duplicar los dos primeros sectores de un disquete:

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

Borrado de disco

Por motivos de seguridad, en ocasiones es necesario borrar 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, utilice .dd if=/dev/zero of=/dev/sda bs=16M
  • Para escribir datos aleatorios en un disco, utilice .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 es un dispositivo de bloques. [ 19 ]

Esta opción bs=16Mpermite que dd lea y escriba.16 MiB  a la vez. Para 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 la unidad a cero 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, muchos datos aún pueden ser recuperables por remanencia de datos .

Los discos duros modernos incluyen un comando de borrado seguro diseñado para borrar de forma permanente y segura todas las partes, tanto accesibles como inaccesibles, de la unidad. También puede funcionar con algunas unidades de estado sólido (unidades flash). A fecha de 2017, no funciona con unidades flash USB ni con memorias flash Secure Digital . Cuando está disponible, es más rápido y seguro que usar dd. En sistemas Linux, se puede acceder a él mediante la opción del comando hdparm .--security-erase-enhanced

El shredprograma ofrece múltiples opciones para sobrescribir archivos, así como una eliminación más segura de archivos individuales.

Recuperación de datos

La recuperación de datos implica leer desde una unidad con algunas partes potencialmente inaccesibles. El comando es ideal para esta tarea gracias a su flexibilidad para saltar bloques ( seek ) y otras configuraciones de bajo nivel. Sin embargo, el comando dd estándar es engorroso de usar, ya que el usuario debe 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, por lo que hay que elegir entre usar un bloque pequeño para recuperar más datos o 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 abordar el dilema. Si una lectura con un tamaño grande falla, recurre al tamaño más pequeño para recopilar la mayor cantidad de datos posible. También puede ejecutarse en sentido inverso. En 2003, se escribió un script dd_rhelp para automatizar el proceso de uso de dd_rescue , realizando un seguimiento de las áreas que se han leído por sí mismo. [ 22 ]

En 2004, GNU escribió una utilidad separada, no relacionada con dd, llamada ddrescue. Tiene un algoritmo de tamaño de bloque dinámico más sofisticado y mantiene un registro de lo que se ha leído internamente. Los autores de dd_rescue y dd_rhelp la consideran superior a su implementación. [ 23 ] Para ayudar a distinguir el programa GNU más nuevo del script anterior, a veces se usan nombres alternativos para ddrescue de GNU , incluyendo addrescue (el nombre en freecode.com y freshmeat.net), gddrescue ( nombre del paquete Debian ) y gnu_ddrescue ( nombre del paquete openSUSE ).

Rendimiento de referencia de la unidad

Para realizar pruebas de rendimiento de la unidad y analizar el rendimiento de lectura y escritura del sistema secuencial (y generalmente de un solo hilo) para bloques de 1024 bytes:

  • Escribir actuación:dd if=/dev/zero bs=1024 count=1000000 of=1GB_file_to_write
  • Lea el rendimiento:dd if=1GB_file_to_read of=/dev/null bs=1024

Generar un archivo con datos aleatorios

Para crear un archivo de 100 bytes aleatorios usando el controlador aleatorio:

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=filename of=filename1 conv=ucase,notrunc

Comentarios sobre el progreso

A petición del usuario, el comando informa del progreso. Cuando recibe la señal USR1 ( INFO en sistemas BSD), escribe el número de bloques transferidos en el error estándar.

El siguiente script bash solicita progreso cada10 s  hasta que finalice la transferencia. El texto PID significa identificador del proceso dd .

mientras kill -USR1 PID ; hacer sleep 10 ; hecho

Las versiones más recientes de GNU dd admiten la opción status=progressque habilita la retroalimentación periódica del estado. [ 24 ]

Horquillas

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 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. A febrero de 2026, la última versión fue la 1.9.3 de junio de 2025. [ 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 considerarse una continuación de dcfldd, con el objetivo declarado de actualizarse cada vez que se actualice el repositorio principal de GNU. A partir de junio de 2023 , la última versión fue la 7.3.1 de abril de 2023. [ 29 ]

Véase también

Referencias

  1. Austin Group. "Estándar POSIX: invocación dd" . Archivado del original el 10 de marzo de 2010. Consultado el 29 de septiembre de 2016 .
  2. 1 2 Gilles (2011). "clonación - dd vs cat – ¿sigue siendo relevante dd hoy en día?" . Unix & Linux Stack Exchange . Archivado del original el 24-10-2023 . Recuperado el 24-04-2020 .
  3. Chessman, Sam. "¿Cómo y cuándo usar el comando dd?" . CodeCoffee. Archivado del original el 14 de febrero de 2008. Recuperado el 19 de febrero de 2008 .
  4. "Cómo usar dd en Linux sin dañar el disco" . Opensource.com . 5 de julio de 2018. Archivado del original el 11 de octubre de 2020. Consultado el 11 de octubre de 2020 .
  5. Ritchie, Dennis (17 de febrero de 2004). "Re: origen del comando dd de UNIX" . Grupo de noticias : alt.folklore.computers . Usenet: c0s1he$1atuh9$1@ID-156882.news.uni-berlin.de . Archivado del original el 22 de enero de 2011. Recuperado el 10 de enero de 2016. dd siempre recibió su nombre de las tarjetas dd de JCL.  
  6. 1 2 Raymond, Eric S. "dd" . Archivado del original el 13-12-2018 . Recuperado el 19-02-2008 .
  7. Struble, George (1969). Programación en lenguaje ensamblador: el IBM System/360 . Reading, Mass., Addison-Wesley Pub. Co. pág. 123 . 
  8. Shein, Barry (22 de abril de 1990). "Re: etimología del comando "dd" de Unix" . Grupo de noticias : alt.folklore.computers . Usenet: 1990Apr22.191928.11180@world.std.com . Archivado del original el 24 de octubre de 2023. Consultado el 14 de julio de 2016 .  
  9. McIlroy, MD (1987). Un lector de Research Unix: extractos anotados del Manual del programador, 1971–1986 (PDF) (Informe técnico). CSTR. Bell Labs. 139.
  10. 1 2 3 4 5Referencia de shell y utilidades, Especificación única de UNIX , Versión 5 de The Open Groupdd  
  11. "GNU file utilities release 1.0" . groups.google.com . Archivado del original el 28 de abril de 2023. Consultado el 28 de abril de 2023 .
  12. 1 2Manual de usuario de Linux – Comandos de usuario de Manned.orgdd(1)  
  13. "Quién es GNU" . Archivado del original el 28 de abril de 2023. Consultado el 28 de abril de 2023 .
  14. Manual del programador de Plan 9 , Volumen 1dd(1)  
  15. "Adaptaciones nativas para Win32 de algunas utilidades GNU" . 15 de agosto de 2000. Archivado del original el 15 de agosto de 2000. Consultado el 28 de abril de 2023 .
  16. "Adaptaciones nativas para Win32 de algunas utilidades GNU" . unxutils.sourceforge.net . Archivado del original el 9 de febrero de 2006. Consultado el 23 de febrero de 2022 .
  17. Manual de comandos generales de FreeBSDdd(1)  
  18. "Creación de una imagen ISO a partir de un CD, DVD o BD" . ArchWiki . Archivado del original el 18 de abril de 2022. Consultado el 18 de abril de 2022 .
  19. "linux - ¿Por qué usar conv=notrunc al clonar un disco con dd?" . Stack Overflow. 11/12/2013. Archivado del original el 24/03/2014 . Consultado el 24/03/2014 .
  20. Wright, Craig S.; Kleiman, Dave; S., Shyaam Sundhar R. (2008). "Sobrescritura de datos de disco duro: La gran controversia del borrado". En Sekar, R.; Pujari, Arun K. (eds.). Seguridad de los sistemas de información, 4.ª Conferencia Internacional, ICISS 2008, Hyderabad, India, 16-20 de diciembre de 2008. Actas . Lecture Notes in Computer Science. Vol. 5352. Springer. pp. 243–257 . doi : 10.1007/978-3-540-89862-7_21 . ISBN   978-3-540-89861-0.
  21. "dd_rescue" . garloff.de . Archivado del 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 de dd_rhelp" . Archivado del original el 16 de mayo de 2008. Recuperado el 13 de mayo de 2008. Nota importante : Durante un tiempo, dd_rhelp fue la única herramienta (hasta donde sé) que hacía este tipo de trabajo, pero desde hace algunos años, ya no es así: Antonio Díaz escribió un reemplazo ideal para mi herramienta: GNU 'ddrescue'. 
  23. "Ddrescue - Proyecto GNU - Fundación del Software Libre (FSF)" . gnu.org . Archivado del original el 2 de julio de 2021. Consultado el 22 de julio de 2016 .
  24. "GNU Coreutils: invocación de dd" . El sistema operativo GNU y el movimiento del software libre . Archivado del original el 22 de agosto de 2019. Consultado el 26 de agosto de 2019 .
  25. "DCFLDD en Source Forge" . Source Forge. Archivado del original el 2 de agosto de 2013. Consultado el 17 de agosto de 2013 .
  26. Jeremy Faircloth, Chris Hurley (2007). Penetration Tester's Open Source Toolkit . Syngress. págs. 470–472 . ISBN  9780080556079.
  27. Jack Wiles, Anthony Reyes (2011). El mejor libro sobre ciberdelincuencia y análisis forense digital, sin duda . Syngress. págs. 408–411 . ISBN  9780080556086.
  28. "dcfldd: Versión mejorada de dd para análisis forense y seguridad" . GitHub. Archivado del original el 31/10/2020 . Consultado el 19/11/2020 .
  29. "dc3dd" . SourceForge . 25 de abril de 2023. Archivado del original el 25 de febrero de 2020. Consultado el 24 de abril de 2020 .