martes, 31 de julio de 2012

Recuperación de discos dañados con herramientas libres

Es curioso ver como últimamente mucha gente confía en sus discos duros USB como métodos de almacenamiento infalible. Es por ello que terminan guardando sus documentos más valiosos en estos discos. Por otro lado, al ser de naturaleza portátil están mucho más expuestos a golpes y caídas que, por ejemplo, los discos de un ordenador de sobremesa. Total, que con un poco de ayuda de la ley de Murphy la gente acaba perdiendo sus datos por un fallo del hardware. En el peor de los casos serán prácticamente irrecuperables, pero la mayoría de las veces, el disco duro sólo tiene unos pocos sectores dañados que harán que el sistema de ficheros sea imposible de utilizar normalmente, pero buena parte de la información será recuperable.

Existen múltiples soluciones comerciales para recuperar discos duros dañados, pero en este caso me centraré en dos herramientas libres que son las que suelo utilizar normalmente con resultados bastante buenos. Las herramientas en cuestión son ddrescue (para volcar el contenido del disco duro, no confundir con dd_rescue, son proyectos distintos aunque tienen un propósito similar) y photorec (para recuperar los ficheros que contiene el sistema de ficheros).

Lo primero que vamos a necesitar es mucha paciencia, leer discos duros dañados suele ser muy lento por lo que puede que nos lleve mucho tiempo (horas o incluso días). Lo segundo es tener instalada una distribución de GNU/Linux (aunque photorec en concreto lo podéis encontrar para casi cualquier sistema operativo). Una vez instalados ddrescue y photorec (los detalles de instalación dependerán de la distribución que tengáis en vuestro sistema) nos pondremos manos a la obra.

En primer lugar volcaremos el contenido del disco duro dañado a un disco duro "sano". Eso lo haremos por varios motivos, uno de ellos es que en caso de fallo mecánico, puede que al disco duro le queden sólo unas cuantas horas de vida, por lo tanto tendremos que obtener la información que contiene lo antes posible. Por otra parte, trabajar con un disco duro dañado suele ser MUY lento, ya que por defecto el disco intenta leer los sectores defectuosos numerosas veces antes de darse por vencido. Para esto utilizaremos ddrescue, que al igual que el comando dd original nos permite volcar el contenido de un dispositivo de bloques a un fichero u otro dispositivo y viceversa. Sin embargo ddrescue nos ofrece opciones adicionales para trabajar con dispositivos defectuosos.

Por tanto en el supuesto de que tuviésemos una partición de un disco defectuoso, a la cual llamaremos /dev/sda1, poderíamos proceder de la siguiente forma:

  1. ddrescue --no-scrape /dev/sda1 archivo_imagen.img archivo.log : con ésto lo que hacemos es volcar todo el contenido de la partición /dev/sda1 al archivo archivo_imagen.img. Además se guarda un fichero de log archivo.log que nos permitirá retomar el volcado más tarde en caso de interrupción o hacer nuevas pasadas. En este caso no se reintentará leer sectores defectuosos para acabar lo más rápido posible. [Actualizado 15/06/2018: en las versiones actuales ya no existe la opción --no-split, por lo que debemos utilizar la opción --no-scrape]
  2. ddrescue --direct --retry-passes=3 /dev/sda1 archivo_imagen.img archivo.log : ahora hacemos un intento más exhaustivo. Intenta leer los sectores defectuosos hasta 3 veces y usa un modo en acceso a disco directo, sin usar los cachés del kernel. En este caso no volverá a leer toda la partición, tan sólo los sectores defectuosos que se especifican en el fichero de log. [Actualizado 15/06/2018: en versiones antiguas se usaba el parámetro --max-retries en vez de --retry-passes]
  3. ddrescue --direct --retrim --max-retries=3 /dev/sda1 archivo_imagen.img archivo.log : si aún quedan sectores por recuperar, podemos utilizar la opción retrim con la que se vuelven a intentar leer los sectores defectuosos en un orden diferente.
Ahora que tenemos una imagen del disco defectuoso, lo que queremos es volver a montar el sistema de ficheros, para intentar recuperarlo tal y como estaba en un principio. Para ello seguiremos los siguientes pasos:
  1. Creamos un dispositivo de tipo loopback con el comando losetup: losetup /dev/loop0 archivo_imagen.img
  2. Ahora podemos chequear el sistema de ficheros, para ello usaremos: e2fsck -y -v /dev/loop0
  3. Si todo va bien deberíamos poder montar esa imagen un directorio, por ejemplo /mnt/ejemplo : mount -o loop archivo_imagen.img /mnt/ejemplo
  4. Si se ha podido montar sin problemas, podemos echar un vistazo que están todos nuestros archivos y copiarlos a donde deseemos. Es posible que debido a algún sector defectuoso algún fichero esté corrupto. Si lo deseamos también podemos volcar esta imagen en una nueva partición (que debe ser del mismo tamaño) con el comando dd.
  5. Si no se ha podido montar, tendremos que recuperar los datos "a la desesperada", para ello utilizaremos photorec, que es un software que analiza una partición en busca de ficheros de un formato reconocible (jpg, mp3, pdf...). Es muy útil para recuperar información de sistemas de ficheros dañados, aunque como inconveniente, no es capaz de recuperar los nombres de los ficheros ni la estructura de directorios. Podéis encontrar un tutorial paso a paso de cómo utilizar photorec en el siguiente enlace: Photorec paso a paso.

Referencias:
http://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html
http://www.forensicswiki.org/wiki/Ddrescue
http://www.cgsecurity.org/wiki/PhotoRec_ES