Cuando escribes para una Web con múltiples autores y millares de artículos publicados, llega un momento en que comienzas a perder la noción de lo que se ha escrito anteriormente y te cuesta trabajo encontrar una temática llamativa que no haya sido tocada. Hace unos días alguien me preguntó por la sintaxis de dd para resolver cierto problema en un ordenador y lo mandé sin pensarlo a revisar en GUTL (Foro, Wiki y Lista de Correos) y como para abundar un poquitín más hoy quiero compartir desde nuestro Portal algunos detalles de dd, familiar para usuarios avanzados pero tal vez de mucha utilidad para recién llegados al universo GNU/Linux o sistemas Unix Like en general.
Hablemos de dd
dd (creo que es el acrónimo de data description) viene instalado de modo predeterminado. En GNU/Linux forma parte del paquete coreutils que es un componente obligatorio del sistema operativo.
dd es un comando de la familia de los sistemas operativos Unix que permite copiar y convertir datos de archivos a bajo nivel. Debemos partir de una idea fundamental: en sistemas operativos Unix Like, cualquier dispositivo se trata y gestiona como un archivo. El comando dd puede ser utilizado con diversos dispositivos y volúmenes (particiones), más allá de los archivos propiamente dichos. Es generalmente usado para realizar operaciones avanzadas sobre dispositivos o archivos, como pueden ser:
- Transferencias de datos específicos.
- Copias de seguridad de la información «en crudo» (raw data).
- Conversión de algunas codificaciones soportadas y/o caracteres predefinidos.
Según la especificación POSIX, dd copia el archivo indicado como origen en el archivo indicado como destino, teniendo en cuenta la conversión de los datos y el tamaño de bloque requerido. Si no se hubiera especificado el origen o el destino, dd por defecto utilizaría la entrada o la salida estándar, respectivamente, para llevar a cabo la operación.
Respaldando y restaurando el sector de arranque maestro con dd.
Este es uno de los usos más extendido de este popular comando.
Los primeros 512 bytes del disco duro o unidad de almacenamiento utilizado para el sistema operativo, corresponde al sector de arranque maestro, donde:
- Los primeros 446 bytes corresponden al gestor de arranque.
- Los siguientes 64 bytes corresponden a la tabla de particiones. 16 bytes para cada partición primaria y/o extendida que existan.
- Los últimos 2 bytes corresponden a la firma de unidad con capacidad de inicio. También se les conoce como los 2 bytes mágicos.
Ejecutando lo siguiente podremos realizar un respaldo del sector de arranque maestro:
dd if=/dev/sda of=mbr.bin bs=512 count=1
Y ejecutando lo siguiente podremos restaurar el sector de arranque maestro:
dd if=mbr.bin of=/dev/sda bs=512 count=1
Si ejecutamos lo siguiente estaremos respaldando exclusivamente el gestor de arranque:
dd if=/dev/sda of=gestor.bin bs=446 count=1
Para restaurar el gestor de arranque ejecutemos lo siguiente:
dd if=gestor.bin of=/dev/sda bs=446 count=1
Respaldaremos exclusivamente la tabla de particiones si ejecutamos:
dd if=/dev/sda of=tabla.bin skip=446 bs=1 count=64
Restauraremos exclusivamente la tabla de particiones ejecutando:
dd if=tabla.bin of=/dev/sda seek=446 bs=1 count=64
Si deseamos borrar exclusivamente el gestor de arranque entonces podríamos lograrlo con:
dd if=/dev/zero of=/dev/sda bs=446 count=1
Lo siguiente nos serviría para borrar exclusivamente la tabla de particiones, algo que nadie en su sano juicio haría sin tener un respaldo a la mano:
dd if=/dev/zero of=/dev/sda seek=446 bs=1 count=64
Para borrar todo el sector de arranque completo, es decir el gestor de arranque, tabla de particiones y los dos bytes mágicos:
dd if=tabla.bin of=/dev/sda bs=512 count=1
El comando dd es útil pero letal. Si te equivocas al usar uno de los comandos anteriores, simplemente metiste la pata hasta el fondo
Realizando un formato de bajo nivel
Sí, para estas tareas tan sensibles también sirve dd. En ocasiones necesitamos formatear un dispositivo a bajo nivel, sea para tratar de solucionar algún problemilla en el funcionamiento del dispositivo (aunque en este caso lo mejor es botarlo y comprar uno nuevo) o simplemente para borrar información del dispositivo de manera definitiva y que sea totalmente irrecuperable hasta para el equipo de CSI Cyber (ya sabrás tú lo que quieres ocultar de por vida).
Para dar un formato de bajo nivel y eliminar así toda la información de una hipotética unidad de almacenamiento que corresponde a /dev/sde (por ejemplo), escribiendo 0 (ceros) en cada sector de ésta podríamos ejecutar:
dd if=/dev/zero of=/dev/sde
Ejecutaremos lo siguiente para dar formato de bajo nivel escribiendo números aleatorios en todos los sectores de una unidad de almacenamiento que corresponde a /dev/sde:
dd if=/dev/urandom of=/dev/sde
Dicen los que saben que es más eficiente la eliminación de datos si se utiliza el dispositivo de números aleatorios (segundo ejemplo).
Eso me recuerda un artículo que leí:
http://blog.desdelinux.net/review-solus-daily
Al final se usa dd para crear un live USB
Muy buen artículo
Muy común el uso de
dd
para hacer esto, incluso concat
también se puede hacer.Me has dado una idea, o mejor un tema para otro post, donde el protagonista sea
cat
Excelente artículo, pero ¿realmente se le debe recomendar el uso de dd a un novato?
Pura leyenda urbana, como mismo otros recomiendan ese mismo método pero pasarlo 7 veces o 2 o 4, recomendaciones del NIST, Guttman, etc. Utilizando
/dev/zero
y un solo pase, es suficiente.