Sistema operativo Unix

Utilidad de línea de comandos para sistemas operativos Unix y similares
Oído
Autor(es) original(es)Ken Thompson
( Laboratorios Bell de AT&T )
Desarrollador(es)Varios desarrolladores comerciales y de código abierto
Lanzamiento inicialJunio ​​de 1974 ; hace 50 años ( 1974-06 )
RepositorioUtilidades básicas: git.savannah.gnu.org/cgit/coreutils.git/
Escrito enPlan 9: C
Sistema operativoUnix , similar a Unix , Plan 9 , Inferno , Windows
PlataformaMultiplataforma
TipoDominio
Licenciacoreutils : 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]

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

ddA veces se lo llama humorísticamente "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 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.

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

Tamaño del bloque

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.

Usos

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

Transferencia de datos

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]

Formularios de transferencia de datos de dd
blocks=$(isosize -d 2048 /dev/sr0)
dd if=/dev/sr0 of=isoimage.iso bs=2048 count=$blocks estado=progreso
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.

Modificación in situ

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.

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, 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

Borrado de disco

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.

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.

Recuperación de datos

La recuperación de datos implica leer desde una unidad con algunas partes potencialmente inaccesibles. ddes una buena opción para este trabajo con su omisión flexible ( seek) y otras configuraciones de bajo nivel. ddSin 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_rhelpse 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_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 .

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
  • Rendimiento de lectura:dd if=1GB_file_to_read of=/dev/null bs=1024

Generando un archivo con datos aleatorios

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

dd si= /dev/urandom de=myrandom bs=100 conteo=1

Convertir un archivo a mayúsculas

Para convertir un archivo a mayúsculas:

dd if=nombrearchivo of=nombrearchivo1 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 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]

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

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]

Véase también

Referencias

  1. ^ Austin Group. «Estándar POSIX: invocación dd». Archivado desde el original el 10 de marzo de 2010. Consultado el 29 de septiembre de 2016 .
  2. ^ Chessman, Sam. "¿Cómo y cuándo utilizar el comando dd?". CodeCoffee. 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 tarjetas dd de JCL.
  4. ^ de Raymond, Eric S. "dd". Archivado desde el original el 13 de diciembre de 2018. Consultado el 19 de febrero de 2008 .
  5. ^ Struble, George (1969). Programación en lenguaje ensamblador: el IBM System/360. Reading, Mass., Addison-Wesley Pub. Co. pág. 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, MD (1987). Un lector de Unix para investigación: extractos anotados del Manual del programador, 1971–1986 (PDF) (Informe técnico). CSTR. Bell Labs. 139.
  8. ^ abcdef dd – Referencia de shell y utilidades, La única especificación de UNIX , versión 4 de The Open Group
  9. ^ "Utilidades de archivos GNU versión 1.0". groups.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 es GNU". Archivado desde el original el 28 de abril de 2023. Consultado el 28 de abril de 2023 .
  12. ^ dd(1)  –  Manual del programador de 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. ^ "Ports nativos Win32 de algunas utilidades GNU". unxutils.sourceforge.net . Archivado desde el original el 2006-02-09 . Consultado el 2022-02-23 .
  15. ^ "Cómo usar dd en Linux sin destruir el disco". Opensource.com . 2018-07-05. Archivado desde el original el 2020-10-11 . Consultado el 2020-10-11 .
  16. ^ dd(1)  –  Manual de comandos generales de FreeBSD
  17. ^ ab Gilles (2011). "clonación - dd vs cat - ¿sigue siendo relevante dd en la actualidad?". Unix & Linux Stack Exchange . Archivado desde el original el 2023-10-24 . Consultado el 2020-04-24 .
  18. ^ "Creación de una imagen ISO a partir de un CD, DVD o BD". ArchWiki . Archivado desde el 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. 2013-12-11. Archivado desde el original el 2014-03-24 . Consultado el 2014-03-24 .
  20. ^ Wright, Craig S.; Kleiman, Dave; S., Shyaam Sundhar R. (2008). "Sobrescritura de datos del 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, del 16 al 20 de diciembre de 2008. Actas . Lecture Notes in Computer Science. Vol. 5352. Springer. 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). «dd_rhelp author's repositorio». Archivado desde el original el 16 de mayo de 2008. Consultado el 13 de mayo de 2008. 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'.
  23. ^ "Ddrescue - Proyecto GNU - Free Software Foundation (FSF)". gnu.org . Archivado desde el original el 2021-07-02 . Consultado el 2016-07-22 .
  24. ^ "GNU Coreutils: invocación de 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". Source Forge. Archivado desde el original el 2013-08-02 . Consultado el 2013-08-17 .
  26. ^ Jeremy Faircloth, Chris Hurley (2007). Kit de herramientas de código abierto para probadores de penetración . Syngress. págs. 470–472. ISBN 9780080556079.
  27. ^ Jack Wiles, Anthony Reyes (2011). El mejor libro sobre delitos informáticos y análisis forense digital . Syngress. pp. 408–411. ISBN 9780080556086.
  28. ^ "dcfldd: versión mejorada de dd para análisis forense y seguridad". GitHub. Archivado desde el original el 2020-10-31 . Consultado el 2020-11-19 .
  29. ^ "dc3dd". SourceForge . 25 de abril de 2023. Archivado desde el original el 25 de febrero de 2020 . Consultado el 24 de abril de 2020 .
  • dd: convertir y copiar un archivo – Referencia de shell y utilidades, La especificación única de UNIX , versión 4 de The Open Group
  • dd(1) –  Manual del programador de Plan 9 , volumen 1
  • dd(1) –  Manual de comandos generales de Inferno
  • dd: página del manual de GNU Core Utilities .
  • dd(1) –  Manual de comandos generales de Darwin y macOS
  • dd para Windows.
  • savehd7 – salva una partición del disco duro potencialmente dañada
  • Página dd de Softpanorama.
  • DD en Linux Questions Wiki.
  • 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
Obtenido de "https://es.wikipedia.org/w/index.php?title=Dd_(Unix)&oldid=1248189458"