Cuenta la leyenda que en el principio Ken Tompshon y Denis Ritchie (los creadores de UNIX, antecesor de Linux) desde las entrañas de Bell Labs, necesitaron copiar exactamente byte a byte de una unidad a otra, como no existía ninguna utilidad para este propósito en su recién concebido sistema operativo simplemente la crearon… y así nació dd (Dataset Definition).
Rescrita y portada varias veces desde los ‘70 está aplicación ha demostrado ser de utilidad y persistió en el tiempo. Lo que pocos saben es que en verdad es un cortaplumas suizo en lo referente a datos, discos y archivos.
El comando dd (alias: disk destroyer, data destroyer o delete data) es el más claro ejemplo de uno de los pilares de la filosofia UNIX, en parte heredada por GNU/Linux…
“UNIX was not designed to stop its users from doing stupid things, that would also stop you from doing clever things.” – Doug Gwyn
Qué podría ser traducido como…
“UNIX no fue diseñado para impedir a los usuario de hacer cosas estúpidas, por que esta política les hubiese impedido también hacer cosas inteligentes”
Esto es un hecho aún en la vida real, si queremos un cuchillo que sea seguro, compraríamos uno de plástico. Esté dejaría de ser útil en muchos aspectos, al punto de limitarnos. Bueno.. no sé si fue el mejor ejemplo pero mas o menos es la idea básica que engloba esta filosofía.
Así dd con la misma facilidad que hace una imagen de cd puede blanquear un disco rígido no dejando el mínimo rastro de datos.
Antes de empezar, una pequeña intro para los que no conocen este comando cuya versatilidad es solo comparable a su simplicidad, (irónico y poco común en el mundo del software actual). Tanto es así que a pesar de sus mil usos al hacer un $ whatis dd
obtendremos un “- convert and copy a file
”
No hay que dejarse llevar con la palabra file
aqui (fichero, archivo en inglés) ya que hay que recordar que en los sistemas tipo UNIX (UNIX-like, como Linux) todo, absolutamente todo es un archivo (o es lo que se intentó hacer, gracias Denis & Ken) lo que extiende el rango de uso de esta herramienta.
La sintaxis simplificada es la siguiente:
dd if=<origen> of=<destino>
dd simplemente toma datos (en crudo) de un origen (if = input file),
y los copia a un destino (of = output file) opcionalmente aplicando el filtro o conversión que se le indique en el ínterin.
Por más trivial que parezca a demostrado ser muy útil y lo es! créanme..
¿Qué tan simple? Por ej.
dd if=/dev/cdrom of=imagendeCD.iso
Para cuando los usuarios de Windows se dieron cuenta que se les expiró la versión de prueba del Nero, Linux ya contaba con una herramienta con más años que el mismo kernel para hacer imágenes de CD. Luego la montamos en carpeta con:
mount -o loop imagedeCD.iso /mnt/carpeta
¿A que me refiero con crudo ?
# dd if=/dev/zero of=/dev/hda bs=512 count=1
Copiara ceros a (limpiará) nuestro MBR (Master Boot Record). Mientras que
# dd if=/dev/zero of=/dev/hda bs=446 count=1
Limpiara el sector de datos del MBR pero dejara la tabla de particiones intacta. Esto es útil para borrar el GRUB (o Lilo) sin que corran riesgo las particiones.
Algunas opciones frecuentemente usadas son bs
y count
. BS es el tamaño en bytes de los bloques de archivos que leerá antes de escribirlos. Es decir si bs=512, hasta que no termine de leer esos 512 bytes (que no es mucho) no los escribirá, esto nos da mucho control sobre la velocidad a la que el disco lee y escribe, cuando estamos haciendo por ejemplo una imagen del disco. Generalmente el valor de bs es una potencia de 2. COUNT es la cantidad de bloques de tamaño especificado en BS que queremos que copie. O sea, si tenemos bs=1024 y count=3, copiará 3 kilobytes en 3 veces (o cuotas ).
No está de más decir que depende de nuestro disco rígido (o cualquier otro dispositivo de bloques del que estemos leyendo o escribiendo) que a diferentes valores de bs y count, diferentes velocidades.
Para hacer una imagen de una partición.
dd if=/dev/sda2 of=/backups/sda2.img bs=1M
Para recuperarla…
dd of=/backups/sda2.img of=/dev/sda2
Y ahora es cuando te empiezas a reír de los pagaron la licencia del Norton ® Ghost (o empiezas a llorar si tú eres ese alguien ).
Aunque me gustaría, no voy a dar un curso sobre el uso completo de dd, daré algunos ejemplos para resaltar sus usos más interesantes y curiosos. Al final tendrán algunos links a páginas que explican exhaustivamente cada uno de sus usos (y hasta proponen nuevos).
Remplazar una cadena de texto por otra en todo el disco rígido.
dd if=/dev/sda | sed 's/BinLaden/Cuca/g' | dd of=/dev/sda
Remplazar BinLaden por Cuca en todo el disco puede servir para eliminar cosas que nos incriminen Pero el FBI, en tal caso hará un análisis a bajo nivel de tu disco duro. Eso se puede solucionar borrandoló todo…. varias veces HAHAHA (*risa macabra)
for n in {1..7}; do dd if=/dev/urandom of=/dev/sda bs=8b conv=notrunc; done
.. nos llenará el disco rígido con caracteres al azar siete veces El mínimo rastro magnético de nuestra información ya se habrá ido para la cuarta pasada.
dd if=/dev/mem | hexdump -C | grep 'algún texto dentro del archivo que me olvide de guardar cuando apreté el botón cerrar'
Esta creo que se explica sola ..
dd if=miarchivo of=miarchivo conv=ucase
Convierte todo el contenido alfabético del archivo a mayúsculas.
dd if=/dev/zero of=archivo_nuevo_vacio bs=1024 count=1024
Crea un archivo de 1 MB vacío, esto aunque no parezca, tiene bastante utilidad, por ej. para hacer un archivo swap (desde su versión 2.6, los archivos swap en Linux son tan rápidos como las particiones swap).
dd if=/dev/zero of=/swapspace bs=4k count=250000
mkswap /swapspace
swapon /swapspace
.. lo más interesante de esto es que crea el archivo swap sobre la marcha. Puede ser muy útil en servidores sobrecargados (o en nuestra PC porque no).
Bueno, espero les haya gustado el artículo e incentive a descubrir más de las ¿mil y un? posibilidades de este comando. Úsenlo con cuidado y recuerden…