systemadmin.es > Storage > Sistemas de ficheros > Recuperar datos de un disco con I/O errors con dd

Recuperar datos de un disco con I/O errors con dd

Recientemente un amigo se encontró con un disco en fallo en un servidor sin RAID. Vamos a ver como realizar una copia de los datos que se puedan aún leer llenando de ceros los bloques con I/O errors.

Los errores que veríamos serian similares a estos:

end_request: I/O error, dev sda, sector 9672
Buffer I/O error on device sda, logical block 959
end_request: I/O error, dev sda, sector 9672
Buffer I/O error on device sda, logical block 959
end_request: I/O error, dev sda, sector 9672
Buffer I/O error on device sda, logical block 959

Primero de todo deberemos apagar el sistema y probar sacando y volviendo a meter el disco, a veces es tan simple como esto. Si no da resultado deberemos proceder a recuperar el sistema usando un LiveCD.

Cuando lo tengamos arrancado y con un disco destino preparado podremos empezar a copiar los datos con dd. Mediante if indicamos el dispositivo origen (en este caso, sda) y con of el dispositivo destino (sdb).

Por otro lado, para evitar que se pare al encontrar un error de lectura deberemos añadir las siguientes opciones al parámetro conv (indicamos opciones de como se realiza la copia de datos):

  • noerror: Continuar en caso de error
  • sync: Llenar con ceros el bloque leído hasta el tamaño de bloque destino

Finalmente deberemos escoger un tamaño de bloque adecuado. Aquí es donde debemos ajustar según interese. Los bloques corruptos de disco como mínimo serán de 512 bytes, pero de 512 en 512 vamos a tardar mucho. Por el contrario, si usamos un tamaño grande y nos encontramos un error de lectura al principio, llenaremos de ceros todos los demás hasta llegar al tamaño del bloque (bs). Es un compromiso entre velocidad y datos a recuperar. Podemos usar por ejemplo el 512k:

dd if=/dev/sda of=/dev/sdb conv=sync,noerror bs=512k

Por ejemplo, usando un HP proLiant DL360 con un solo disco, conectando otro a la controladora tardó 8 horas para 250G con bloques de 512 bytes (tamaño físico de los bloques de disco). Con un bloque (bs) más grande (512k por decir algo) hubiera ido más rápido pero se hubiera perdido más información.

Para no desesperar en el tiempo que tarda a copiar los datos, mediante SIGUSR1 podremos ir viendo el progreso del dd.

12 comments to “Recuperar datos de un disco con I/O errors con dd”

  1. “Recientemente un amigo se encontró con un disco en fallo en un servidor sin RAID.”

    Entiendo que sin RAID y sin copia de seguridad actualizada… ¿no?

  2. Pues no estoy seguro, simplemente me dijo que quería intentar recuperar los datos del disco. Se trataba de un servidor de maquinas virtuales, seguramente tendría del sistema base pero no de las virtuales.

    Ya le preguntaré

  3. Me ha comentado que tenia backups de los datos pero no del sistema. La verdad es creo que hubiera sido más fácil reinstalar, pero bueno, al menos el sistema arrancó sin problemas con el tema del dd

  4. Hola ante todo, tengo un disco duro q no lo pilla la bios, de un golpe q se dio, mi pregunta es …….. con este sistema podria intentar recuperar los datos? gracias x vuestro tiempo

  5. Hola caspol,

    El problema está en que si la BIOS no detecta el disco es probable que el Live CD no lo pille, con lo cual el disco no existirà como dispositivo físico en el /dev/sdX, el cual te hace falta para hacer el dd if=/dev/sdX ….

    Yo me he encontrado con BIOS que no detectaban els disco pero en cambio las Live CD o el mismo SO instalado sí, pero claro, no era a consecuencia de un golpe en el disco sino de una versión de BIOS antigua, de manera que si el SO no hacia caso de las interrupciones del la BIOS para acceder al disco esto si que era posible.

    Lo tendrás que probar…

  6. xavi, si el disco duro se ha dado el golpe, el daño seguramente estara en al cabezal del disco, lo podras distinguir por un sonico inequivoco de claqueo.

    Si es asi, dalo por perdido, puesto que existen varios metodos cuando se produce un daño en el cabezal pero a mi no me han funcionado, cuando lo he intentado.

    Congelar el disco:(Esto solo funciona si el cabezal se ha deformado por un exceso de temperatura)

    Golpear el disco en la parte lateral o dejarlo caer sobre una superficie plana,(esto solo funciona si el cabezal se ha quedado enganchado en una pista para que salte)

    En resumen un daño en el cabezal del disco implica la perdida de este a no ser que te gastes un paston en llevarlo a Recovery Labs 😉

  7. Congelar el disco me da a mi que se puede acabar de cascar por la humedad. Supongo que mas bien te refieres a un “golpe de frío”.

    Si tienes otro disco igual y eres un poco manitas puedes intentar cambiar los platos antes de darlo completamente por perdido. Si no lo intentas pierdes los datos y si lo intentas puedes perder otro disco igual pero vacío. Cada uno debe decidi

  8. para estos casos, yo también usaba dd hasta que descubrí dd_rescue:

    http://www.garloff.de/kurt/linux/ddrescue/

    aparte de ser algo más “verbose” que dd, usa un tamaño de bloque adaptativo, grande mientras no encuentra errores y si aparecen, lo va dividiendo por la mitad hasta coger el último byte antes del error… bastante más rápido que coger 250GB en bloques de 512kB! 🙂

    un saludo y enhorabuena por el blog!

  9. Este no lo conocía, tiene muy buena pinta!

  10. Mandar a recuperar un disco a un laboratorio especializado no cuesta tanto como se cree.

    Hace algunos años, el hecho de tener que enviar a recuperar los datos a una empresa especializada insumia una inversion de unos cuantos de miles…

    Pero hoy en dia, se recuperan discos por apenas unos cientos.

    Este es el caso de ONRETRIEVAL, especializados en recuperaciones de discos individuales o RAID entre otros dispositivos.

    Si los datos son importantes, la inversion para recuperarlos se considera muy en cuenta.

  11. Hola amigos, ¿como puedo determinar si un disco tiene sectores dañados ?, muchas gracias.

  12. Tengo una lista del siguiente mensaje de un servidor con Debian, alguna manera de poder solucionar este problema.

    [79584.636754] end_request: I/O error, dev sda, sector 91032683

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>