Uso del comando DD en consola para clonar una imagen

El comando dd (Dataset Definition), es una herramienta sencilla, útil, y sorprendentemente fácil de usar; con esta herramienta se puede hacer lo mismo, sobre dispositivos: discos y particiones, que con programas comerciales como Norton Ghost, en Windows o libres como CloneZilla, en Linux, con solo una pequeña línea de comandos.

Índice [Ocultar]

Sintaxis Básica:

La sintaxis mas básica para el uso del comando dd, seria esta:

sudo dd if=origen of=destino

Donde if significa “input file=archivo de entrada“, es decir, lo que se quiere copiar y of significa “output file=archivo de salida“, o sea, el archivo destino (donde se van a copiar los datos);origen y destino pueden ser dispositivos (lectora de CD o DVD, disco duro, diskettera, pendrive, partición, etc.), archivo de copia de seguridad o imagen de disco, etc, pero no carpetas o subcarpetas.

Para el uso sin problemas de este comando,lo primero siempre es tener claro como se llaman las particiones/discos duros en Linux (/dev/sda1 por ejemplo; /dev deriva de device= dispositivo, en inglés ). para saber el disco/partición de origen y el de destino, algo que averiguamos fácilmente con el comando sudo fdisk -l o con algún programa gráfico de particiones como gparted. Toda la información sobre el comando dd, se puede consultar con el comando man dd e info dd ,

Se debe utilizar este comando con precaución, y comprobando siempre el orden y nombre de los discos/particiones, porque lo mismo que se clona un disco, lo borra en un visto y no visto.

Sintaxis con el comando pv: Usar el comando dd con la sintaxis anterior tiene un pequeño inconveniente, ya que es un comando muy reservado – no da información – , pues al ejecutarlo, el prompt de la terminal queda inmóvil, por lo que no sabemos que es lo que esta pasando y cuanto tiempo falta para que termine de ejecutarse. Este pequeño inconveniente se puede solucionar añadiendo el comando pv, ( *) – el cual actúa como una tubería de terminal que mide los datos que pasan a través de ella- a la sintaxis del comando dd , de forma que ahora la sintaxis seria:

dd if=origen |pv|dd of=destino

Como resultado obtendríamos en el terminal una especie de barra de progreso, la información sobre bytes transferidos, el tiempo que lleva ejecutándose y la tasa de transferencia, todo esto en tiempo real.

( alf ) - ( ~ )

└──┤ dd if=/devmmcblk0p1 |pv|dd of=/dev/mmcblk0p2

1,630GB 0:21:30 [1,12MB/s] [

Además al terminar nos muestra estadísticas de la tasa de transferencia, el total de bytes transferidos y el tiempo total que tardó en transferir todos los datos.

( alf ) - ( ~ )

└──┤ dd if=/devmmcblk0p1 |pv|dd of=/dev/mmcblk0p2

10530816+0 registros leídos <=>

10530816+0 registros escritos

5391777792 bytes (5.4 GB) copiados, 3873,48 s, 1,4 MB/s

5,02GB 1:04:33 [1,33MB/s] [ <=>

10530816+0 registros leídos <=>

10530816+0 registros escritos

5391777792 bytes (5.4 GB) copiados, 3873,48 s, 1,4 MB/s

( alf ) - ( ~ )

└──┤

(*) Comprobar antes de ejecutar cualquier linea de comandos con esta segunda sintaxis, que tenemos instalado en el sistema el paquete pv, o instalarlo si no lo tuviéramos: ambas cosas con Synaptic.

Vamos a ver algunos ejemplos prácticos y opciones de este comando ( en su versión con el truco explicado anteriormente con el comando pv ) :

A) Sobre discos duros y particiones:

= Clonar un disco duro:

Con esto clonaríamos el disco hda en hdb. (discos IDE):

sudo dd if=/dev/hda |pv|dd of=/dev/hdb bs=1M

Con esto clonaríamos el disco sda en sdb. (discos SATA):

sudo dd if=/dev/sda |pv|dd of=/dev/sdb bs=1M

Con la opción bs=1M , se consigue que tanto la lectura como la escritura se haga en bloques de 1 megabyte, (menos, seria mas lento pero mas seguro, y con mas nos arriesgamos a perder datos por el camino).

Hay que tener en cuenta que de esta forma se graba el disco “tal cual”, MBR, tabla de particiones, espacio vacío, etc…, por lo que solo podrás grabar en un disco del mismo o mayor tamaño.

= Grabar solo la primera partición (hda1) del disco de origen en el disco (hdb) de destino:

sudo dd if=/dev/hda1 |pv|dd of=/dev/hdb bs=1M

= Grabar el disco completo (hda) en la primera partición (hdb1) del disco de destino:

sudo dd if=/dev/hda |pv|dd of=/dev/hdb1 bs=1M

= Crear una imagen – puede ser bin o iso – del disco duro (hda) , en el directorio /home:

sudo dd if=/dev/hda |pv|dd of=/home/hda.bin

= Borrar totalmente la información de un disco: para ello, llena el disco con caracteres aleatorios, cinco veces. No va a quedar ni rastro de información en el disco:

for n in {1..5}; do dd if=/dev/urandom |pv|dd of=/dev/hda bs=8b conv=notrunc;

= Borrar cualquier partición y disco completo de cualquier dispositivo:

sudo dd if=/dev/zero |pv|dd of=/dev/sdx (Borrado de disco completo)

sudo dd if=/dev/zero |pv|dd of=/dev/sdxa (Borrado de partición de disco)

donde: x es el disco a borrar , a es la partición a borrar

Esta operación es muy útil para borrar completamente cualquier partición, además los datos que se borrarán no se pueden recuperar, por lo tanto es un borrado a bajo nivel y muy seguro, muy útil por ejemplo para cuando los pendrives se nos infectan de virus con nuestro querido windows.

B) Sobre un CD/DVD

= Crear/Montar una imagen .iso de un CD (o DVD)

Para crear la imagen .iso de un CD en el directorio /home:

sudo dd if=/dev/cdrom |pv|dd of=/home/imagendeCD.iso

Para montar la imagen .iso del CD:

sudo mount -o loop imagedeCD.iso /mnt/home

= Recuperar un DVD rayado (Esto no recupera todo el DVD, en este caso, solo los sectores legibles). Sirve también para discos duros defectuosos:

sudo dd if=/dev/cdrom |pv|dd of=/home/dvd_recuperado.iso conv=noerror,sync

La opción noerror, sirve para obviar los errores de lectura en cualquier situación.

C) Sobre MBR y VBS:

= Copiar/Restaurar el Master Boot Record (MBR):

Para copiar el MBR:

sudo dd if=/dev/hda |pv|dd of=mbr count=1 bs=512

Para restaurar el MBR:

sudo dd if=mbr |pv|dd of=/dev/hda

= Limpiar nuestro MBR y la tabla de particiones:

sudo dd if=/dev/zero |pv|dd of=/dev/hda bs=512 count=1

= Limpia el MBR pero no toca la tabla de particiones, ( muy útil para borrar el GRUB sin perder datos en las particiones):

sudo dd if=/dev/zero |pv|dd of=/dev/hda bs=446 count=1

= Copiar/Restaurar el Volume Boot Sector (VBS):

Para copiar el VBS:

sudo dd if=/dev/hda |pv|dd of=/home/sector_arranque_hda count=1 bs=512

Para restaurar el VBS:

sudo dd if=/home/sector_arranque_hda |pv|dd of=/dev/hda

D) Otros:

= Grabar una imagen del disco en nuestro directorio /home saltándonos los errores del disco(muy útil para discos que se están muriendo):

sudo dd conv=noerror if=/dev/hda |pv|dd of=~/home/imagen_disco_con_errores.iso

= Crear un archivo vacío de 1 Mb:

sudo dd if=/dev/zero |pv|dd of=archivo_nuevo_vacio bs=1024 count=1024

= Crear un archivo swap de 2Gb:

sudo dd if=/dev/zero |pv|dd of=/swapspace bs=4k count=2048M
mkswap /swapspace
swapon /swapspace

= Convertir todas las letras en mayúsculas:

sudo dd if=miarchivo |pv|dd of=miarchivo conv=ucase

Usar el comando dd con un programa con entorno gráfico: Gdiskdump, es un entorno gráfico para este comando dd que nos facilita la tarea de clonar particiones o discos, de una forma rápida y sencilla. Se puede descargar desde la página https://launchpad.net/gdiskdump/ Una vez lo abrimos , con permisos de root – sudo gdiskdump – , vemos que el programa es muy fácil de usar, ya que solo tenemos que decirle la partición o disco a clonar (Formato de Entrada ) y su destino (Formato de Salida).