Definición
Dataset Definition, dd, es un comando que nos permite copiar y convertir datos de archivos a bajo nivel con solo unas pocas líneas de código. Generalmente, se usa para realizar operaciones avanzadas sobre dispositivos o archivos, como pueden ser: transferencias de datos específicos o copias de seguridad de la información en crudo. Es una herramienta muy potente que al igual que nos permite copiar un disco, también nos lo puede borrar.
La sintaxis de dd es:
dd if=<archivo de origen> of<archivo de destino> [Opciones]
if=origen
- “i” proviene de input por lo que aquí vamos a especificar la ruta de origen.
of=destino
- “o” proviene de output aquí vamos a especificar la ruta de destino
Por lo que si nosotros ejecutamos:
dd if=/dev/urandom of=/dev/sda
Lo que estamos haciendo es escribir los datos que se encuentran en el dispositivo urandom en la unidad que se encuentra en /dev/sda
En este caso en la ruta /dev/urandom lo que encontramos es un archivo especial que genera números aleatorios. Esto es lo que hemos escrito en nuestra unidad
Copias completas
Si por ejemplo nosotros queremos hacer una copia entera de disco a disco, lo que haremos será:
dd if=/dev/sda of=/dev/sdb
Esto solo funciona si el segundo dispositivo es igual o más grande que el primero. De lo contrario, tendremos particiones truncadas.
El comando dd tiene muchos parámetros que podemos utilizar para configurarlo. Podemos añadir la opción bs para reducir la duración de este proceso
bs=BYTES Establece el tamaño de los bloques de entrada y salida en BYTES. Esto hace que ‘dd’ lea y escriba BYTES por bloque.
Por lo que nuestro comando sería
dd if=/dev/sda of=/dev/sdb bs=4096
Estoy utilizando un disco duro externo de 1 TB
Un tamaño de bloque entre 4096 y 512 KB deben ser suficientes.
Si usamos un bs menor que el del sector sería horriblemente lento.
Ahora vamos a crear un archivo .img de la unidad /dev/sdb y lo vamos a guardar en nuestro escritorio
dd if=/dev/sdb of=/home/Diego/Desktop/disco_sdb.img
Esta imagen no tiene que ser creada del disco completo, también podemos crearla de una partición.
dd if=/dev/sdb3 of=/home/Diego/Desktop/particion3.img bs=4096
En este caso he vuelto a utilizar el parámetro bs para establecer el número de bytes que vamos a copiar de una sola vez, en este caso al estar utilizando un disco duro de 1 TB tendrá un impacto en la velocidad de la operación. Este valor depende de su hardware.
Restaurar esta imagen que hemos creado es muy fácil, solo tendremos que invertir los valores de if y of. Por lo que nos quedaría así el comando:
dd if=particion3.img of=/dev/sdb3
Uso avanzado
Todos estos comandos podemos ejecutarlos en un solo comando utilizando pipe “|”
Ahora crearemos una imagen comprimida de una unidad remota utilizando SSH y guardaremos el archivo resultante en nuestro equipo local:
ssh Diego@192.168.1.143 "dd if=/dev/sda | bzip2 -1 -" | dd of=backup.bz2
Para no sobrecargar la máquina remota se puede hacer el bzip2 en local, como a continuación:
ssh Diego@192.168.1.143 "dd if=/dev/sda" | bzip2 -1 - | dd of=backup.bz2
Este comando lo que hace es copiar los archivos que se encuentran en el directorio /dev/sda del ssh. Vamos a comprimirlo desde el servidor remoto y después vamos a copiar los archivos que hemos cifrado en nuestra máquina local.
Esta operación durará bastante tiempo. Si queremos reducir un poco este tiempo, en vez de usar ssh podemos emplear netcat, es cierto que netcat no está cifrado, por lo que la gente podrá ver qué hay en nuestro disco duro, pero si estamos haciendo esta operación en un entorno seguro, recomiendo utilizar netcat.
En este artículo podéis ver una comparación de las velocidades.
Espero que os haya sido de utilidad
Un saludo
DiegoAltF4
Inicio
Deja una respuesta