Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

sábado, 23 de julio de 2016

El comando dd y sus posibilidades en Linux

Hola a todos, tras unos días un poco ajetreados en los que me ha sido difícil encontrar hueco para escribir, hoy por fin os vengo con un nuevo post; en esta ocasión quiero hacer referencia a un comando bastante curioso al que se le puede sacar un partido más que considerable en Linux, ya sea en servidores o en entornos de escritorio: Se trata de la herramienta dd, conocido también con Dataset Definition.

CDROM_dd

La herramienta dd es de lo más versátil, pues permite manipular discos y/o particiones con mucha facilidad; ya sea para volcar datos de un sitio a otro, para transformar un CD-rom en ISO (o viceversa) o simplemente para borrar los datos de un disco duro de forma "segura". Si bien la sintaxis varía ligeramente en algunos casos especiales, la estructura general del comando dd es tan sencilla como hacer lo siguiente:

dd if=dispositivo_origen |pv|dd of=dispositivo_destino

Se podría ejecutar sin necesidad de usar |pv|dd, pero el agregar dichos parámetros hacen que la experiencia de usuario final sea más agradable, pues permiten saber el % de progreso del proceso dd... El uso del comando "a pelo" únicamente ejecutaría la operación; es decir que no sabríamos el estado de esta, pudiendo estar durante varios minutos esperando a que la acción se finalizase y sin conocer el estado de la operación ni el tiempo restante de esta... Es por ello que es recomendable agregar ambos parámetros, si bien no es una obligación.

Uno de los usos más básicos que podemos hacer gracias a este comando sería la clonación de discos... Imaginemos que tenemos dos discos duros; uno lleno y con información valiosa y otro vacío. Podemos recurrir a herramientas de terceros tales como Clonezilla ¿Pero para qué hacerlo pudiendo recurrir a la propia shell de Linux? El comando para volcar el contenido de un disco duro en otro sería tan simple como:

dd if=/dev/sdb |pv|dd of=/dev/sdc

Obviamente dependiendo del tamaño del disco, la velocidad de clonado variaría... Además dd también nos permitiría realizar volcado de datos por particiones y no por discos; lo cual sería exactamente lo mismo que lo anterior, con la diferencia de que especificaríamos el número de partición en vez del disco entero; algo como:

dd if=/dev/sdb1 |pv|dd of=/dev/sdc

El proceso también puede hacerse al revés; es decir que también podría hacerse un volcado desde un disco entero a una partición.

Por otro lado tendríamos una de las funcionalidades más conocidas y más "jugosas" que ofrece el comando dd... Generalmente para realizar una ISO, es necesario recurrir a programas de terceros que, si bien generalmente funcionan, no dejan ocupar espacio en el disco duro, espacio que nunca está de más ahorrar... Es por ello que teniendo nuestro creador de isos instalado por defecto en el sistema, ¿Por qué recurrir a otro? Más aún cuando el comando es realmente sencillo:

dd if=/dev/cdrom |pv|dd of=/tmp/mi_iso.iso

Al recibir como entrada un CD ROM y al poner como salida un archivo .iso; el programa de por sí ya es capaz de realizar la conversión de forma adecuada... Cosa que viene muy bien cuando por ejemplo quieres hacerte un liveUSB que te pide que especifiques la iso; o cuando quieres usar dicho CD constantemente y prefieres tener una imagen de disco con el fin de no rallar dicho CD.

Como veis todo se basa en volcados; simplemente se especifica un origen y un destino, sin importar qué hay en cada lado, pues dd simplemente lo volca... Esto obviamente nos permite hacer otras cosas... Una de ellas que en mi opinión es realmente interesante es el borrado seguro de discos duros. Cuando un disco duro se obsoleta, ya sea por que es viejo o por falta de capacidad... El tirarlo sin más o tirarlo tras simplemente formatearlo puede ser peligroso... A modo de recomendación diría que lo mejor sería romper el disco a base de taladro, martillo y fuego, pero en caso de no querer ponernos tan extremos, podemos intentar al menos dificultar lo mejor posible la recuperación de datos del disco duro. Ya en su día mostré en este blog cómo eliminar archivos de forma segura con shred pero el problema de dicha opción es que está orientada a borrados individuales y puntuales... En este caso vamos a optar por algo más global y, dicho sea de paso, peligroso dependiendo de qué queramos borrar, pues una vez borrado será muy difícil recuperarlo, y sin garantías de que conserve su integridad.

Existen una serie de "dispositivos" que no son tales sino que tienen funciones especiales y que aparecen dentro del directorio /dev/. Esos dispositivos, por llamarlos de alguna forma se llaman:

/dev/zero
/dev/random

Estos dos dispositivos están preparados para trabajar junto con dd y tienen la siguiente característica. El primero está lleno de bits con valor 0 que machacarían los bits existentes en el disco con ceros... Supuestamente hay empresas especializadas que pueden solventar dicho machaque de ceros y ver el contenido real, es por ello que el dispositivo random puede ser más interesante... El dispositivo random, sobrescribe el contenido del disco duro con bits aleatorios, haciendo que el contenido original sea sobrescrito con bits ficticios... Haciendo que el proceso de recuperación de datos sea muy difícil y haciendo está opción muy interesante que sería:

dd if=/dev/random |pv|dd of=/dev/sdb

Lo ideal con estos procesos suele ser que se repitan varias veces con el fin de estar completamente seguros de que la información es irrecuperable. Como amante de los scripts que soy, he realizado uno pequeño que simplemente cogería como argumento el número de pasadas; algo como:

  1. #!/bin/sh
  2. if ! [ "$1" -eq "$1" ] 2>/dev/null
  3. then
  4.         echo "Solo valen numeros enteros"
  5.         exit
  6. fi
  7. if [ $1 -lt "1" ]then
  8.         echo 'Por favor introduzca un valor mayor que 0'
  9. elif [ $1 -ge "1" ]then
  10.         i=1
  11.         while [ "$i" -le "$1" ]
  12.         do
  13.                 echo "Borrado numero $i"
  14.                 dd if=/dev/random |pv|dd of=/dev/sdb
  15.                 i=$[$i+1]
  16.         done
  17. fi

Como podéis ver dd es un comando de lo más útil que puede realizar múltiples tipos de volcado que pueden servirnos para diferentes ocasiones.

Espero que os haya resultado útil.

Saludos.

2 comentarios :

  1. Antes que nada felicitaciones por el blog, acabo de descubrirlo y saque muy buena data de lo que voy leyendo.

    Referente al post, para aumentar notablemente la velocidad de dd se puede establecer la opcion bs=4k para que tome bloques de 4kb, siguiendo tu ejemplo quedaria:

    dd if=/dev/sdb1 |pv|dd of=/dev/sdc bs=4k

    ResponderEliminar
    Respuestas
    1. Muchísimas gracias tus palabras DanielrHat.

      Con respecto a tu consejo lo pondré en práctica con algún dispositivo grande para comprobar la mejoría. Con dispositivos pequeños el comando de por sí es muy rápido, pero probablemente con este cambio note una notable mejoría al aplicarlo con discos duros grandes.

      Saludos.

      Eliminar