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

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


43 comentarios, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   sieg84 dijo

    casi me hago diabetico con el mal uso del comando dd.
    por cierto, cual sería la diferencia con dd_rescue ¿?

    1.    eVeR dijo

      ddrescue por defecto no se detiene en los errores de lectura e intenta por varios medios recuperar la información ilegible.

    2.    Sheko dijo

      hahahha yo tambien use muy mal el comando dd, es muchisimo mas potente de lo que yo creia.

  2.   Rots87 dijo

    Comanto que yo creo que todo usuario de arch en algun momento uso

  3.   Alf dijo

    @sieg84, la diferencia esta en que el dd se interrumpía con algún error de lectura o del dispositivo en este caso no pasara esto ya que el bloque dañado lo leerá un numero determinado de veces y continuara con el siguiente, también brinda la ventaja de que podemos ejecutarlo varias veces sobre la misma imagen y no empezara de cero sino que tratara de completar la misma.

    Cabe mencionar que dd_rescue nunca lo he utilizado.

    1.    merlin el debianita dijo

      Alf existira alguna GUI hecha en qt para KDE que use este comando? o me tengo que resignar.?

      1.    julio dijo

        Gdiskdump es mas que una GUI para este comando (esta basado en el) y aunque no se si lo hicieron en qt (creo que no) casi seguro te sirve en KDE

    2.    sieg84 dijo

      gracias por la aclaración.
      solo he utilizado dd_rescue para copiar ISO a los USB (mas que nada por que en la wiki de openSUSE asi lo tenian).
      dd_rescue tu.iso /dev/sdX
      lo que me gusta es que muestra una barra de progreso:
      http://box.jisko.net/i/110db781.png

  4.   krel dijo

    Alf:
    Hace poco ví publicado este mismo post en el Blog de Hatteras. Es probable que el no se tome a mal esto pero yo que sé, como mínimo por cortesía estaría bien referenciarlo. Así también el gana en posicionamiento web.

    No quiero generar dilema con esto pero a simple vista el artículo me parece un 95% idéntico salvo por las capturas de terminal que las has adaptado. Incluso el mencionó sus fuentes.

  5.   merlin el debianita dijo

    Interesante admito que |pv| no lo conocía.

    Krel creo que la fuente esta en wiki de ubuntu o de arch saludos.

  6.   Alf dijo

    @krel, la cosa de linux es la siguiente:

    A lo largo de mi andanza en este mundo he leido y recopilado cosas, tengo un cuaderno con más de 400 post que puse en ubuntu México que fué la comunidad donde más contribui en mis inicios, desgraciadamente las cosas pueden repetirse, si revisas la gran cantidad de post en la red, están casi en el mismo orden, la cosa es que la mayoría son mas cortos.

    Puedo publicar otros 5 post en la semana y puedes encontrar otros parecidos o iguales, ¿el motivo? ubuntu tiene la mayor cantidad de foros/blogs en la red.

    De ninguna manera creo que vaya a haber dilema, y, si los administradores consideran el borrarlo, para nada me ofendería ni molestaría, me atengo a las normas y a lo que sigue, entre mis apuntes 8que no los tengo en orden) estoy buscando añadir algo para evitar la coincidencia.

    Saludos

    1.    krel dijo

      Para nadie es un misterio que como mucho solo el 10% del contenido que se genera en la red es nuevo. Con lo cual el otro 90 es contenido duplicado, renovado o rescatado, y no digo que eso sea menos importante, todo lo contrario, es una forma de diseminación del conocimiento.

      Sin embargo donde yo me detengo es en otra cosa. Cuando se tiene un blog de este tipo existe una motivación personal por ayudar y hasta quizás recibir un reconocimiento por ello. A su vez estoy seguro que la mayoría de los que escriben contenidos acerca del Software libre están de acuerdo con la idea de compartir. No obstante, no olvidemos que hasta las licencias más nobles como la de BSD piden el reconocimiento.

      Asimismo, las referencias es una forma por las que algunos buscadores como google mejoran el posicionamiento de una web. Solo digo, ya que el material fue utilizado como mínimo de agradecimiento yo referenciaría ese trabajo.

      Me parece genial que compartas pero, ¿Que pierdes por hacer una referencia? Solo piensa si desde otro blog con mejor posicionamiento que este se duplicaran los contenidos de desdelinux sin referenciarlo, al final sepultarían a este blog.

      Hatteras lo publicó hace 10 días y salvo que lo haya sacado de tu cuaderno o tu seas luis puente no me explico lo que me comentas, es que casi todo es textual. Poco probable pero no imposible.

      Pero nada, que este tipo de cosas pasan. Y no sé, yo por ética personal y por colaborar con otro colega lo referenciaría. Ya eso queda a vuestro criterio, tampoco creo que Hatteras se tome esto a mal, todo lo contrario.

  7.   eldeantes dijo

    Hmm… Hice un dd if=archivo.iso of=/media/discoduro… por error 😛
    alguna forma de recuperar archivos desde el disco duro???

    1.    elav dijo

      Puedes usar Testdisk

    2.    merlin el debianita dijo

      me ha pasado amigo tal vez con testdisk o con una distro live especializada a rescatar datos. Mi recomendación hacer un backup para próxima ya que usar ese comando es algo delicado en mis tiempos de novato formatie todo el disco duro sin quere y ahora de reiniciar pues…… sobra decir que ni el grub arranco.

  8.   Raul dijo

    Alguien me puede decir que comando usar para ver el progreso de copiado con el comando dd, a lo que me refiero es ver una barra de progreso con el % que lleva copiando.

    Slds

    1.    julio dijo

      Compa! agregando el comando pv. En este mismo post lo dice casi al principio y te explica como uasarlo. Leelo otra vez

  9.   pedro dijo

    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

  10.   Luis Rodriguez dijo

    una pregunta

    use este comando para
    for n in {1..5}; do dd if=/dev/urandom |pv|dd of=/dev/hda bs=8b conv=notrunc;
    para un disco de 2TB
    luego me quedo en la consola algo asi
    >
    debo ejecutar otro comando o cuanto se puede demorar el proceso?

    gracias y sigan adelante

    1.    Jazb dijo

      Hay un error de tipeo en el for… falta al final de la linea «; done» quedado «for n in {1..5}; do dd if=/dev/urandom |pv|dd of=/dev/hda bs=8b conv=notrunc; done»

  11.   henry salazar dijo

    muy buen articulo…..voy a ponerlo en practica…saludos cuate

  12.   Marcos_tux dijo

    Muy útil, me sirvió mucho gracias

  13.   EDFR dijo

    Buenas Alf. Gracias por la info.

    Una pregunta. Hay alguna manera de copiar solo una parte del disco origen?. El caso es, si tengo un disco de 120Gb en el cual sólo se está utilizando 25Gb y quiero hacer una copia a un disco de 40Gb, sólo me interesaría copiar el espacio utilizado (25Gb), ¿Existe alguna manera con este comando?
    Gracias de antemano.

    1.    Yukiteru dijo

      Te convendría más usar rsync, con el comando rsync -av /path/to/origin /path/to/destiny ya estarías respaldando todos tus permisos con sus correspondientes permisos.

    2.    Yukiteru dijo

      Quise decir: «todos tus archivos con sus correspondientes permisos»

  14.   FOXSPY dijo

    Estimados, alguno sabe porque al ocupar comando dd, llega solo a 4.2GB e indica que el archivo es muy grande? Es una imagen de una disco de 250GB y va a un disco externo de 1TB.

    sudo dd if=/dev/sda |pv|dd of=/home/fox/backup.iso

    1.    RaptoR dijo

      el error de los 4Gb te lo esta dando porque estas intentando hacer un backup en una particion con fs FAT16

  15.   Berna dijo

    Qué buen blog. Muy útil entrada. Ya había visto en otros lados los usos de este comando, pero de plano no explicaban nada de nada. Gracias.

  16.   carlos torres dijo

    hola tengo una maquina de inyeccion en la cual se perdio el programa ya que reemplazaron la pila de la bios, no tenemos respaldo pero tenemos otra maquina igual, solo cuenta con floppy y puerto serial y paralelo, como puedo hacer hacer un respaldo de esta maquina para cargarlo en la otro, espero me pueda ayudar gracias

  17.   ernesto dijo

    solo quiero copiar una particion sin empezar desde LIVE CD. Por ejemplo.tengo un disco con /dev/sda1, /dev/sda5, /dev/sda6 y quiero hacer una copia en /dev/sda5 desde otro disco /dev/sdb1

    el comando es dd if=/dev/sdb1 of=/dev/sda5 bs=1M ????

  18.   Pedro Lobato dijo

    Hola como estas. Yo tambien vivo en Guadalajara.
    Tu articulo sobre el comando DD es muy interesante. Yo quiero probar algunas distribuciones Linux, especificamente Archlinux, pero no he logrado usar el comando DD y copiar la ISO de Archilinux que ya descargue, en una memoria USB. No se si me puedas pasar algun tick para poder arrancar con esto. Gracias, Pedro lobato

  19.   Victor dijo

    Porque cuando se graba una iso con el comnado «dd» solo sirve para bootear en algunas PC?
    Ejp. tengo 2 laptos y en ninguna de ella bootea la iso de ninguna distribucion linux; pero al contrario SI bootea en una vieja PC de mesa con disco idle

    1.    seb dijo

      Lo mejor es irse a la segura usando unetbootin, con dd también me he quedado con la interrogante de porque a a veces no funciona.

      1.    elav dijo

        No creo que dependa de DD sino del ISO. Lo mismo sucede con Unetbootin, no funciona bien con todas las distribuciones..

  20.   Victor dijo

    Aveces funciona en todas las pc pero hay que agregar al proceso el mbr y el syslinux a la usb; pero esto es algo largo y tedioso.
    La parte facil el unetbooting

    Ojo: no es la iso ni el dd para mi es la forma de como la grabas.

  21.   danny dijo

    tengo una duda si utilizo este comando:
    sudo dd if=/dev/zero of=/dev/unidaddedisco
    en vez de este el formateo a low level, es el mismo o es mas tardado que este:
    sudo dd if=/dev/zero of=/dev/unidaddedisco bs=1M..

  22.   Arg0s dijo

    ¿Se puede utilizar el comando dd para borrar un archivo específico?

    por ejemplo,

    dd if=/dev/urandom of=/home/miarchivoaborrar

  23.   Arg0s dijo

    con bs=1M se hace más rápido

  24.   alex dijo

    y si voy a hacer una copia exacta de un disco a otro, con todas sus particiones (swap, sda…) y ambos discos iguales, pero uno está en el PC y el otro en un NAS por red????
    gracias

  25.   Gerardo dijo

    Un comentario, yo lo uso con status=progress al final y no necesito de pv, así me funciona muy bien debian para ver el progeso.
    Y la segunda, hay alguna forma de sacar solo los datos y no toda la unidad, ya que si es un disco de 2TB y solo uso 100 GB requiero de todo ese espacio. ¿hay alguna forma de solo respaldar esos 100 GB ? y cuando lo pase a otro medio pueda ser un disco más pequeño tal vez uno de 500?

  26.   Alejandro dijo

    Ayuda !!!
    Realice el comando
    dd if=cbpp-9.0-amd64-20170621.iso of=/dev/sdb

    todo bien… pero ahora quiero volver a usar la usb como unidad de almacenamiento y…

    No se monta la USB, ni siquiera aparece en GParted.

    alguien sabe que puedo hacer.

    PD: cual seria el mejor programa para recuperar información de discos duscos y CD DVDs….

    1.    Anónimo dijo

      debes re particionar prueba con fdisk