Nunca esperas que te pasa a ti, pero siempre acaba pasando. O le pasa a alguien cercano que te pide ayuda. En cualquier caso: los discos duros pueden acabar dañándose. Y mientras se pueda arreglar con la herramienta estándar del sistema operativo no pasa nada. Pero si se daña un sector que afecta al sistema de ficheros, estás en una gran apuro: te toca reconstruir el sistema de ficheros.

Sin embargo, tratar de reconstruir un disco con errores de E/S puede acabar dañando más el sistema de ficheros. Así que es más que recomendable trabajar sobre una copia del disco. Pero ¿cómo un disco dañado? Ahí es donde entra ddrescue al rescate.

Características

ddrescue es una herramienta «forense» que permite copiar a bajo nivel un dispositivo de bloques (disco duro, USB, CD, DVD, etc.) en otro dispositivo o en un fichero imagen (es decir, un fichero que es idéntico byte a byte al contenido del disco). Además el comando es tolerante a fallos, de forma que aunque algún sector defectuoso no se pueda salvar, el resto de sectores ya estarán a resguardo en nuestra imagen.

Dicha imagen puede obtenerse en una o diferentes pasadas, puesto que el comando guarda el estado de copiado de los sectores, por lo que se puede detener (porque queremos apagar el equipo, porque vamos a hacer una pasada con otras opciones, etc.). La idea general es hacer una primera pasada sin tratar de recuperar fallos, seguida de una o más dedicadas de forma específica a tratar de recuperar los sectores defectuosos.

Otro uso interesante es tratar de recuperar un imagen correcta de un sistema de ficheros espejado (mediante RAID 1 por ejemplo) en distintos discos. Es muy poco probable que todos los discos del espejo tengan fallos en los mismos sectores, así que haciendo recuperaciones de todos los discos frente a la misma imagen nos permitirán tener una sistema de ficheros libre de errores debidos a fallos de E/S en los sectores de los discos.

La instalación de ddrescue en Fedora (es similar en otras distribuciones de Linux) es sencilla:

dnf install ddrescue

No tiene dependencias y únicamente ocupa 95k.

Caso de uso: recuperando un disco USB con formato NTFS (Windows)

En este caso ha caído en mis manos un disco externo USB con formato NTFS que se ha ido degradando de forma silenciosa hasta que el disco se ha vuelto inutilizable: ni Windows ni Linux pueden acceder al sistema de ficheros. Por tanto, los pasos a seguir serán obtener una copia del disco en un medio con espacio libre suficiente y libre de errores de E/S, para luego tratar de recuperar la partición desde la copia.

  1. Repasa antes el espacio libre que te queda en el disco duro donde vas a copiar el fichero imagen. Debe haber más espacio libre que el espacio total del disco dañado. Ten en cuenta que el tamaño del fichero resultante será el mismo que todo el espacio del disco que estás reparando. Si no tienes espacio, deberás o bien liberar espacio o hacerte con un disco externo y trabajar contra él.
  2. Copiar el disco. Pasada 1: Crear una imagen con los sectores que no den problemas.
    Se realiza con estos comandos (a ejecutar como superusuario):

    cd /ruta/destino
    ddrescue --no-scrape /dev/sdb disco_usb.img disco_usb.log

    En este comando

    • /ruta/destino
      es el directorio donde quieres que quede el fichero destino,
    • –no-scrape
      indica al programa que no se detenga en los sectores problemáticos, simplemente los saltará ignorando el error de lectura,
    • /dev/sdb
      es la ruta que, en mi caso, identifica al disco y partición donde está localizado el disco USB dañado,
    • disco_usb.img
      es el archivo donde queremos dejar la imagen (insisto: asegúrate que está en un disco con espacio suficiente) y
    • disco_usb.log
      es el fichero donde guardará el progreso de la instalación.

    Copiar el disco duro es una tarea larga y tediosa, siendo más larga cuanto más sectores defectuosos tenga el disco. Hazte a la idea de que esta fase puede durar un día e incluso más.
    Cuando encuentra errores, la velocidad de lectura baja siendo del orden de 10 veces menor (se tardaría 10 veces más que en un disco sin errores). Si ves que ha dejado de encontrar errores pero está yendo muy lento, puedes pararlo con Ctrl-C y volver a ejecutar el comando ddrescue. Continuará donde lo dejó antes, volviendo a utilizar una velocidad de lectura normal.
    La salida del comando muestra algo parecido a:

    GNU ddrescue 1.22
    Press Ctrl-C to interrupt
    Initial status (read from logfile)
    rescued:   161929 MB,  errsize:  25054 kB,  errors:      23
    Current status
    rescued:   320053 MB,  errsize:  16791 kB,  current rate:       0 B/s
       ipos:   160039 MB,   errors:      28,    average rate:   29840 kB/s
       opos:   160039 MB,    time since last successful read:      10 s
    Finished

     

  3. Copiar el disco. Pasada 2: Tratar de leer los datos descartados en la pasada 1, dedicándole más tiempo y paciencia a los sectores defectuosos.
    Se trata de usar este comando:

    ddrescue --direct --max-retries=3 /dev/sdb disco_usb.img disco_usb.log

    Si no funciona puedes intentar este otro (yo no lo necesité):

    ddrescue --direct --retrim --max-retries=3 /dev/sdb disco_usb.img disco_usb.log

    La lectura pasa a ser muy lenta, del orden de bytes por segundo, pero puede recuperar muchos de los datos perdidos.
    Repite este comando todas las veces que creas adecuadas o bien incrementa el número de pasadas subiendo el valor de –max-retries. Deberías parar cuando veas que hacer más pasadas no recupera sectores. Por el contrario, mientras se sigan recuperando sectores, aunque sea lentamente, deberías seguir haciendo pasadas.

  4. Expulsa el disco dañado. Una vez que has decidido no tratar de seguir recuperando sectores, expulsa el disco duro dañado y déjale como está hasta que hayas recuperado los datos.
  5. Hacer creer al sistema operativo que el fichero obtenido es un disco duro. De esta manera haremos podremos usar las herramientas de recuperación de datos del sistema operativo.

 

Referencias