viernes, 18 de enero de 2013

Algunos usos prácticos del comando dd

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.

-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:

 [ (*) 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. ]

dd if=origen |pv|dd of=destino

( Para que aparezca el símbolo |  hay que teclear la combinación de teclas: AltGr+1    ;  de forma que |pv| se escribe tecleando: AltGr+1 pv AltGr+1 )

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.

dd

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.

dd-2



-----------------------------------------------------

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

= Crear un pendrive iniciable a partir de una imagen .iso de una distrosudo dd if=/nombre-de-la.iso of=/dev/sdb ( por ejemplo: sudo dd if=/linuxmint-13-cinnamon-dvd-64bit.iso of=/dev/sdb , teniendo la .iso en el directorio raiz y siendo la partición del pendrive /dev/sdb: para saber el dispositivo en que esta montado el pendrive hay que ejecutar el comando sudo fdisk -l con el pendrive conectado y montado)

= 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

------------------------------------

Uso del 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).




----------------------------------------

http://blog.luispuente.net/comando dd

http://usemoslinux.blogspot.com/2012/03/tip-comando-dd-con-barra-de-progreso.html


http://linuxzone.es/2012/12/10/gdiskdump-el-comando-dd-en-modo-grafico/

---------------------------------------------------

16 comentarios:

  1. Gracias por el aporte, sobre todo para los que nos iniciamos en linux.

    ResponderEliminar
  2. Perdona, una pregunta, creo que no lo he entendido:

    Quiero copiar una partición a una carpeta de un disco duro concreta. ¿La orden sería esta?

    Partición 1 = /dev/sdb2
    Disco 2 con su carpeta >> disco sdc5 y la carpeta se llama, por ej, ubuntu

    Entonces sería:

    sudo dd if=/dev/sdb2 |pv| dd of=/dev/sdc5/ubuntu

    ¿Estaría bien?

    Gracias y perdona las molestias.

    ResponderEliminar
  3. Internetlan:
    El origen, y también el 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.

    ResponderEliminar
  4. Muchas gracias por tu respuesta. Todo aclarado.

    ResponderEliminar
  5. Gracias, buenísimo aporte, me instalaré el modo gráfico, por si lo necesito más adelante...

    ResponderEliminar
  6. Muy bueno, hatteras. Me lo quedo pa luego.

    ResponderEliminar
  7. Impresionante tutorial. Me viene de maravillas. ¡Gracias Hatteras!

    ResponderEliminar
  8. Hola,

    un poco tarde pero,

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

    ¿no debería ser

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

    dado que la primera instancia de dd es la que lee?

    Un saludo.

    ResponderEliminar
  9. mediante este comando:
    dd if=/dev/sdc | bzip2 > /media/Elements/iso.gz
    he logrado hacer una imagen iso de un disco de 16 Gb y guardarlo en un disco de 400Gb.
    Pero no se cual seria el comando para restaurar esa imagen en el disco original de 16GB o en otro de la misma capacidad

    ResponderEliminar
  10. Pedro:
    Ya que fille-roller es el programa gráfico que sirve para comprimir y descomprimir archivos comprimidos ( que contienen varios archivos ), puedes usar este programa, también desde un modo live, para descomprimir todo el contenido del archivo iso.gz ( que al fin y al cabo no es mas que un archivo comprimido ) en el directorio / de tu disco duro, el cual debe de estar previamente totalmente vacío, mejor previamente formateado en el mismo formato que estuviera cuando creaste el archivo iso.gz
    Esta es la forma en que lo suelo hacer yo.

    Otra forma seria usar el comando dd: Desde un cd/dvd live o un pendrive live el comando dd a usar seria algo así:

    dd if=dirección donde esta el archivo iso.gz |pv|dd of=dirección de tu disco duro

    Puedes probar también con gdiskdump

    ResponderEliminar
  11. pero la direccion del disco duro de destino ¿debe ser montado o sin montar?

    dd if=/media/Elements/iso.gz |pv|dd of=/dev/sdc

    o tal vez :

    dd if=/dev/sdb//iso.gz |pv|dd of=/media/nombre del disco montado

    Por cierto , el programa gdiskdump, tanto en formato .deb como en tar.gaz se instala sin problemas y aparece en el menu, incluso pide la contraseña de root, pero no se abre

    ResponderEliminar
  12. Pedro:
    Los discos duros/particiones deben estar montados.
    Ejecuta en la terminal: sudo gdiskdump
    y mira a ver si te sale algún mensaje de error.

    ResponderEliminar
  13. Si .Daba este error

    gdiskdump
    Traceback (most recent call last):
    File "gdiskdump.py", line 555, in
    gdiskdumpGui = gdiskdump()
    File "gdiskdump.py", line 60, in __init__
    self.builder.add_from_file("data/ui/GdiskdumpWindow.ui")
    glib.GError: Unknown internal child: selection

    Desinstalé y volvi a instalar y pasaba lo mismo.
    Envié una consulta al autor (andywilhelm@online.de)
    y aun estoy esperando la respuesta

    ResponderEliminar
  14. Excelente. Exhaustivo, concreto, sin errores, perfecto. Por favor sigue escribiendo.

    ResponderEliminar
  15. Hola buenas tardes, soy novata en la clonación de discos, he estado viendo varios tutoriales pero aun no me queda clara la respuesta a la siguiente pregunta:
    Si tengo una pc con Linux dentro de la cual instale un servidor y lo quiero cambiar a una maquina virtual de mayor capacidad ¿Puedo ejecutar el comando: sudo dd if=/dev/hda |pv|dd of=/dev/hdb1 bs=1M, sin
    que este comando afecte a mi servidor montado en la PC donde esta el Linux?
    ¿O bien es mejor extraer el disco duro de mi PC y ejecutar el comando (podría ser) sudo dd if=/dev/hdb |pv|dd of=/dev/hdc1 bs=1M? Suponiendo que el disco duro de la maquina sea hda, el disco duro al que le quiero hacer la copia sea el hdb y el disco duro donde quedara guardada es el hdc? Esto para que no dañe al disco duro donde esta actualmente Linux, ya que como es un servidor constantemente esta recibiendo datos.

    (En este caso cambiaría el hdx or sdx ya que estoy trabajando con discos SATA)

    Y es que no me queda claro si al momento de ejecutar el comando "dd" automaticamente detiene la entrada y salida de datos del servidor y solo se dedica a copiar el disco duro de la maquina donde se escribio el comando (donde esta linux) al disco duro externo donde quiero crear la copia.

    Espero haberme explicado, no quiero que mi servidor quede sin funcionar por este comando o produzca errores, por eso pregunto :P.
    Ya lo de crear la imagen y todo eso ya me quedo claro, por si alguien le interesa.

    Y muchas gracias por tu aportación, es la mas entendible que he visto hasta ahora. en hora buena!

    ResponderEliminar

A la vez que haces un comentario, por favor da una puntuación al tema: malo, normal, bueno o muy bueno.
Gracias.