El comando dd en Linux es una utilidad para copiar y convertir archivos y tiene muchos usos prácticos.
Se ha sugerido que el nombre se deriva de una función anterior del lenguaje de control de trabajos de IBM donde dd significaba "Definición de datos". En Linux, la abreviatura significa "Duplicador de datos" o "Volcado de disco" o una variedad de otras aliteraciones según su fuente.
Es posible que incluso se haya ganado el conmovedor apodo de "destructor de datos", lo que me lleva a un punto importante. Tenga cuidado al practicar el comando dd.
Este comando es capaz de causar daños graves. Asegúrese de verificar su sintaxis para evitar un error costoso. No querrás ser la persona que confunde los nombres de las particiones y observa angustiado cómo se destruye su partición raíz y se reemplaza con un archivo en blanco.
Conociendo el comando dd
Esta es la sintaxis del comando dd:
dd if=<filename> of=<filename> [options]
Hay una amplia gama de usos para este comando, presentaré algunos enfoques comunes.
Medios fisicos/Clones de particiones/Copias de seguridad
En la sintaxis anterior, 'si' y 'de' son para archivo de entrada y archivo de salida, respectivamente. Esta es la funcionalidad principal de dd. Duplica datos de una fuente a otra. No necesita usar medios físicos con dd.
Manipulación de texto
Es posible usar stdin (entrada estándar) desde su teclado para recopilar entradas y apuntarlas a un archivo. También es posible convertir rápidamente mayúsculas y minúsculas y en la página de manual se incluyen una variedad de otras herramientas útiles de edición de texto.
Mencioné a IBM antes aludiendo a la larga historia de este programa. Una de las funcionalidades originales de este comando en realidad se centraba en convertir EBCDIDC, un esquema de codificación creado por IBM, a ASCII.
Manipulación del sistema de archivos
También puede copiar archivos con él, pero se recomienda el comando cp sobre dd para esta aplicación simple. Tenemos un artículo donde puedes leer sobre el comando cp.
Algunas notas de comportamiento
Al copiar con dd
, también debe tener en cuenta que por defecto copiará el completo información de una fuente específica.
Lo que significa que si intenta duplicar una partición o un disco, también copiará el espacio libre.
Entonces, por ejemplo, si está clonando un disco duro con 4 TB, necesitará una unidad de destino con al menos 4 TB para evitar archivos truncados y errores. Recuerde también, si el disco tiene solo 1 TB de datos, dd seguirá copiando los otros 3 TB de espacio. Ese es un mal movimiento que desperdiciará mucho tiempo y recursos.
Hay algunas restricciones que podemos agregar a dd y otras medidas que podemos tomar para cambiar este comportamiento. En realidad, hay una cantidad abrumadora de controles que se pueden usar junto con dd. Intentaré abordar algunas de las que creo que pueden beneficiar más a nuestros lectores, pero el objetivo de este artículo es brindar una introducción a dd, no documentar todas las funciones posibles.
¡Atención! Para practicar, use una Máquina Virtual
Le insto a conceptualizar su objetivo y ejecutarlo con cuidado para evitar corromper o destruir archivos importantes. Obviamente, no nos hacemos responsables de la pérdida de su información. Si comete un error. No digas que no te lo advertimos.
Recomiendo practicar en una máquina virtual ficticia para familiarizarse antes de intentar alterar cualquier activo del "mundo real". Esto se debe a que el comando dd tiene la capacidad de cambiar y, por lo tanto, dañar su sistema de archivos si lo usa incorrectamente.
Para este tutorial, decidí probar algo fuera de la familia Debian e hice girar una copia de Fedora 31 en VirtualBox.
5 Ejemplos practicos del comando dd
Con las advertencias y alguna información contextual fuera del camino, estamos listos para pasar a algunas aplicaciones para este comando simple pero poderoso.
Ejemplo 1:Clonar discos
Clonar un disco a otro puede ser muy fácil con dd. Para mi ejemplo, tengo dos discos llamados 'sda' y 'sdb'.
Recuerde que 'sda' intentará copiarse a sí mismo en 'sdb' utilizando todo el contenido de la unidad, no solo los datos.
Debe asignar suficiente espacio en su archivo de salida para acomodar el espacio no utilizado en el sector. También puede optar por volver a particionar la unidad al tamaño exacto que actualmente ocupan los datos. Recomendaría este método. Disminuirá la cantidad de tiempo que lleva realizar la operación y creará un documento más útil.
Cuando esté listo para clonar un disco, puede ejecutar fdisk
para identificar sus discos, sus particiones y su capacidad.
sudo fdisk -l
Ejecutar este comando enumerará las unidades y particiones disponibles y sus respectivos tamaños. Esto puede ser útil para identificar correctamente su dispositivo de destino.
Nuevamente, para nuestra aplicación estamos usando los nombres 'sda' y 'sdb' y asumiremos que tienen el mismo tamaño.
[[email protected] ~]$ sudo dd if=/dev/sda of=/dev/sdb
[[enter pw for sudo]]
dd: writing to 'dev/sdb': No space left on device
8108369+0 records in
8108369+0 records out
4151484416 bytes (4.2 GB, 3.9 GiB) copied, 12.3602 s 336 MB/s
El resultado nos permite saber que la escritura fue exitosa, podemos ignorar el mensaje que dice que ya no queda espacio en 'sdb'.
El resumen también enumera la cantidad de datos copiados, cuánto tiempo tomó y qué tan rápido se copió. Veremos esto un poco más cuando cubra el tamaño del bloque.
Ejemplo 2:Copia de seguridad de una partición de disco
Los pasos para clonar un dispositivo y hacer una copia de seguridad de una partición son similares. En lugar de que nuestro archivo de destino sea un dispositivo, podemos crear un archivo '.img' (imagen de disco sin procesar).
Digamos que nuestro sistema tiene una partición separada para nuestro directorio de inicio en 'sda2' y queremos hacer una copia de seguridad en un archivo llamado 'home_backup.img' en nuestro directorio actual.
dd if=/dev/sda2 of=home_backup.img
¡Es fácil! Así que ya no tienes excusa para no tener una buena rutina de respaldo.
Claro, eso fue fácil, pero siempre hay más que aprender.
Tratar con el tamaño del bloque en el comando dd
Antes de pasar al siguiente ejemplo, hablemos de BS o tamaño de bloque. Si ha visto que esto se usa para especificar un valor con los comandos dd, es posible que se pregunte por qué está ahí.
Si su curiosidad lo lleva a una búsqueda en Internet, estoy dispuesto a apostar que probablemente todavía preguntándose por qué está ahí.
Haré todo lo posible para dar una explicación en un lenguaje sencillo. Los dispositivos de bloque suelen ser medios físicos con almacenamiento finito.
Puede buscar información en un medio como un disco buscando un bloque específico de datos. Entonces, por ejemplo, el sistema puede leer un CD-ROM y buscar información a partir del bloque 500 (un número arbitrario). También se puede usar para "sujetar" información y tal vez usar información del bloque 500 al bloque 1500.
Estos bloques se pueden segmentar de manera que sean eficientes para que el sistema los analice. Esto puede reflejar el espacio de almacenamiento del medio o las especificaciones estándar del sistema con las que probablemente esté asociado el medio.
Continuaré con el ejemplo de un CD-ROM que tiene su propio tamaño de bloque definido (2048). Cada bloque debe tener un máximo de 2048 bytes. Incluso si un bloque solo contiene 100 bytes de datos, seguirá ocupando los mismos 2048 bytes.
Hay algunos casos en los que es posible que desee definir el tamaño del bloque para hacer que dd se ejecute más rápido o evitar la corrupción de datos. Volviendo a nuestro ejemplo de CD-ROM, la creación de bloques de un tamaño diferente podría causar anomalías a la hora de leer los datos.
Si no se define, dd usará un tamaño de bloque de 512. Este es el tamaño de bloque más pequeño que puede leer un disco duro típico.
Si su medio no está limitado a un cierto tamaño de bloque, probablemente esté seguro ajustándolo para el rendimiento (tiempo de escritura). Veamos algunos ejemplos.
Rendimiento con tamaño de bloque no especificado
[[email protected] ~]$ sudo dd if=/dev/sda of=home_backup.img
[sudo] password for linuxhandbook:
dd: writing to 'home_backup.img': No space left on device
31974953+0 records in
31974952+0 records out
16371175424 bytes (16 GB, 15 GiB) copied, 113.848 s, 144 MB/s
Rendimiento con tamaño de bloque de 1024
[[email protected] ~]$ sudo dd if=/dev/sda of=home_backup.img bs=1024
[sudo] password for linuxhandbook:
dd: error writing 'home_backup.img': No space left on device
15987477+0 records in
15987476+0 records out
16371175424 bytes (16 GB, 15 GiB) copied, 75.4371 s, 217 MB/s
Puede ver que el proceso se realizó a una velocidad más rápida. Otra ejecución con un tamaño de bloque de 4096 fue más rápida pero con una velocidad de 327 MB/s. El almacenamiento en caché del sistema también puede influir en la velocidad, pero ese es un tema para otro día.
Es posible que haya notado la variación en la cantidad de registros entrantes y salientes. Esto se debe a que estamos cambiando el tamaño de cada bloque y, por lo tanto, la capacidad de los bloques individuales, a pesar de que el archivo de salida sigue teniendo el mismo tamaño. Por esta razón, ajustar el valor de bs puede tener consecuencias no deseadas. Por ejemplo, podría dar lugar a discrepancias cuando se realiza una suma de comprobación.
Ejemplo 3:Eliminar datos y poner a cero el disco
¿Recuerdas todas las advertencias de antes? Este comando reemplazará cada bloque de 'sda' con ceros.
dd if=/dev/zero of=/dev/sda
¿Como funciona esto? Esencialmente, lo mismo que todos los demás comandos dd de entrada y salida. ¿Qué es '/dev/cero'?
Es un pseudodispositivo incluido en los sistemas operativos Unix/Linux que escribirá ceros en un archivo hasta que llegue al final del archivo.
De manera similar, puede usar 'dev/random' que genera bits de datos aleatorios. Esto puede ser innecesario si planea usar un archivo de imagen sin formato para reemplazar el contenido, ya que usar dd ya copiará el espacio no utilizado.
Tenga en cuenta que algunas personas desagradables engañan a los usuarios desprevenidos al ejecutar este comando en varios foros de Linux. Ahora que sabes lo que hace este comando, no serás víctima de esta malvada broma.
Ejemplo 4:Crear .ISO desde CD/DVD
Puede copiar directamente desde la unidad de CD-ROM si su computadora aún tiene una. Anteriormente mencioné que el tamaño de bytes estándar de un CD-ROM es 2048. Estableceremos el tamaño de bytes para que coincida con eso para evitar problemas de conversión y luego agregaremos un par de comandos más.
dd if=/dev/cdrom of=space_jam_dvd.iso bs=2048 conv=noerror,sync
Déjame explicarte algunas cosas. Con conv=noerror , cualquier error será ignorado. El programa continuará hasta el bloque final sin detenerse. No se detendrá para ellos.
Cuando se usa junto con 'noerror', 'sync' garantizará que cualquier bloque de datos que falte se rellene automáticamente con información nula.
Esto significa que los datos existentes se asignarán a las mismas ubicaciones, presumiblemente conservando la mayor cantidad de contenido posible.
Es importante asegurarse de que sus archivos de origen y de destino tengan los mismos "bs" configurados para estas operaciones, de lo contrario, no tendrán los resultados esperados.
Ejemplo 5:Crear un USB de arranque
Puede usar dd para crear un USB de arranque y es tan fácil como cabría esperar. De hecho, este es uno de los usos más populares del comando dd.
Hay un paso adicional involucrado aquí. Usamos el comando mkfs para compilar el sistema de archivos en nuestro USB antes de ejecutar 'dd'.
Sin opciones, utiliza el sistema ext2 predeterminado. Entonces, asumiendo que el USB que queremos preparar se llama 'sdb' y queremos cambiar el sistema de archivos a ext4, ejecutaríamos el siguiente comando:
sudo mkfs.ext4 /dev/sdb
Si desea usar con un sistema Windows, puede reemplazar la primera parte del comando con mkfs.ntfs.
También puede utilizar la siguiente sintaxis:
mkfs -t [for type] $filesystem.
Una vez que el medio de arranque esté preparado, podemos continuar con nuestro comando dd.
dd if=someFile.iso of=/dev/sdb
Utilice la imagen montable .iso y cópiela en el nombre de la unidad correspondiente para su dispositivo USB.
Conclusión
Gracias por leer. Espero que hayas disfrutado este manual básico sobre 'dd'. Hay tantas formas diferentes de usar este comando. Traté de cubrir muchos de los ejemplos más útiles. Si tienes algo que te gustaría ver o una pregunta directa, me encantaría ayudarte. Déjame saber lo que piensas a continuación en los comentarios.