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.