¿Cómo hago para que mi disco no se asigne a sectores ilegibles pendientes?


10

Tengo un disco con algunos sectores ilegibles pendientes, según smartd. ¿Cuál sería la forma más fácil de hacer que el disco los reasigne y evite que smartd se queje?

Hoy, recibo dos de estos cada hora:

10 de septiembre 23:15:35 hylton smartd [3353]: Dispositivo: / dev / sdc, 1 sectores actualmente ilegibles (pendientes)

El sistema es un sistema x86 que ejecuta Ubuntu Linux 9.10 (jaunty). El disco es parte de un grupo LVM. Así es como smartctl identifica el disco:

Familia de modelo: Familia de Western Digital Caviar Serial ATA de segunda generación
Modelo del dispositivo: WDC WD5000AAKS-00TMA0
Número de serie: WD-WCAPW4207483
Versión de firmware: 12.01C01
Capacidad de usuario: 500,107,862,016 bytes

2
Este problema se resolvió solo; el disco comenzó a quejarse más fuerte, así que lo reemplacé.
dkagedal

Respuestas:


15

Un sector ilegible pendiente es aquel que devolvió un error de lectura y que la unidad ha marcado para reasignarse en la primera oportunidad posible. Sin embargo, no puede hacer la reasignación hasta que ocurra una de dos cosas:

  1. El sector se vuelve a leer con éxito.
  2. El sector se reescribe

Hasta entonces, el sector sigue pendiente. Entonces tienes dos formas correspondientes de lidiar con esto:

  1. Sigue intentando releer el sector hasta que tengas éxito
  2. Sobrescribir ese sector con nuevos datos

Obviamente, (1) no es destructivo, por lo que probablemente debería probarlo primero, aunque tenga en cuenta que si el disco comienza a fallar de manera grave, es probable que la lectura continua de un área defectuosa lo haga fallar mucho más rápidamente . Si tiene muchos sectores pendientes y otros errores, y le preocupan los datos del disco, le recomiendo que los ponga fuera de servicio y utilice la excelente herramienta ddrescue para recuperar la mayor cantidad de datos posible. Luego deseche la unidad.

Si el sector en cuestión contiene datos que no le interesan o que puede restaurar desde una copia de seguridad, entonces sobrescribirlos es probablemente la solución más rápida y sencilla. A continuación, puede ver los recuentos reasignados y pendientes de la unidad para asegurarse de que se haya ocupado del sector.

¿Cómo saber a qué corresponde el sector en el sistema de archivos? Encontré un excelente artículo en el sitio web de smartmontools , aquí , aunque es bastante técnico y es específico para ext2 / 3/4 y sistemas de archivos reiser.

Un enfoque más simple, que utilicé en una de mis unidades (Mac), es utilizar find / -xdev -type f -print0 | xargs -0 ...para leer cada archivo en el sistema. Tome nota del recuento pendiente antes de ejecutar esto. Si el sector está dentro de un archivo, recibirá un mensaje de error de la herramienta que utilizó para leer los archivos (por ejemplo, md5sum) que le muestra la ruta hacia él. Luego puede concentrar sus atenciones en volver a leer solo este archivo hasta que se lea con éxito. A menudo, esto resolverá el problema, si se trata de un archivo de uso poco frecuente que solo necesita volver a leerse varias veces. Si el error desaparece, o no encuentra ningún error al leer todos los archivos, verifique el recuento pendiente para ver si ha disminuido. Si es así, el problema se resolvió leyendo.

Si el archivo no se puede leer con éxito después de varios intentos (por ejemplo, 20), entonces debe sobrescribir el archivo, o el bloque dentro del archivo, para permitir que la unidad reasigne el sector. Puede usar ddrescue en el archivo (en lugar de la partición) para sobrescribir solo un sector, copiando a un archivo temporal y luego volviendo a copiar. Tenga en cuenta que simplemente eliminar el archivo en este punto es una mala idea, porque el sector defectuoso irá a la lista gratuita donde será más difícil de encontrar. Sobrescribir completamente también es malo, porque nuevamente los sectores entrarán en la lista libre. Necesita reescribir los bloques existentes. La notruncopción de ddes una forma de hacer esto.

Si no encuentra errores, y el recuento pendiente no disminuyó, entonces el sector debe estar en la lista libre o en parte de la infraestructura del sistema de archivos (por ejemplo, una tabla de inodo). Puede intentar llenar todo el espacio libre con cat /dev/zero >tempfile, y luego verificar el recuento pendiente. Si se cae, el problema estaba en la lista gratuita y ahora ha desaparecido.

Si el sector está en la infraestructura, tiene un problema más grave y probablemente encontrará errores simplemente recorriendo el árbol de directorios. En esta situación, creo que la única solución sensata es reformatear el disco, opcionalmente usando ddrescue para recuperar datos si es necesario.

Esté atento a la unidad. La reasignación del sector es un muy buen canario en la mina de carbón , lo que potencialmente le avisa de una unidad que está fallando. Al tomar medidas tempranas, puede prevenir un derrumbe catastrófico y doloroso posterior. No estoy sugiriendo que algunas reasignaciones de sector sean una indicación de que debe descartar la unidad. Todas las unidades modernas necesitan hacer una reasignación. Sin embargo, si la unidad no es muy antigua (<1 año) o si recibe nuevas reasignaciones frecuentes (> 1 / mes), le recomiendo que la reemplace lo antes posible.

No tengo pruebas empíricas para probarlo, pero mi experiencia sugiere que los problemas de disco se pueden reducir leyendo todo el disco de vez en cuando, ya sea con un dddisco sin procesar o leyendo cada archivo usando find. Casi todos los problemas de disco que he experimentado en los últimos años han surgido primero en archivos raramente usados, o en máquinas que no se usan mucho. Esto también tiene sentido heurísticamente, ya que si un sector se vuelve a leer con frecuencia, la unidad tiene la oportunidad de reasignarlo cuando detecta por primera vez un problema menor con ese sector en lugar de esperar hasta que el sector sea completamente ilegible. La unidad no puede hacer nada con un sector a menos que el host acceda de alguna manera, ya sea leyéndola, escribiéndola o realizando una de las pruebas SMART.

Me gustaría experimentar con la idea de un trabajo cron nocturno o semanal que lea todo el disco. Actualmente estoy usando un "RAID de pobre" en el que tengo un segundo disco duro en la máquina y hago una copia de seguridad del disco principal cada noche. De alguna manera, esto es realmente mejor que la duplicación RAID, porque si hago el tonto y elimino un archivo por error, puedo obtener la versión de ayer inmediatamente del disco de respaldo. Por otro lado, creo que un controlador RAID de hardware hace un buen trabajo en segundo plano para monitorear, informar y solucionar problemas de disco a medida que surgen. Mi script de respaldo actual se usa rsyncpara evitar copiar datos que no han cambiado, pero en vista de la necesidad de releer todos los sectores, tal vez sería mejor copiar todo, o tener un script separado que lea todo el disco sin formato cada semana.


2
Si hace copias de seguridad (la sincronización a un disco interno no cuenta;)) entonces todos sus datos se (re) leen en ciertos intervalos de tiempo (dependiendo de su programa de copia de seguridad completo / incremental). RAID o rsync no son sustitutos de respaldo. Y por cierto, "creo" que tiene demasiada fe en los proveedores de RAID de hardware. ;)
maxschlepzig

@maxschlepzig: Tienes razón. También tengo un régimen de respaldo por separado. Sin embargo, mi experiencia ha sido que la probabilidad de pérdida de datos debido a una falla de la unidad supera con creces todos los demás riesgos juntos (robo, incendio, etc.). Los discos duros modernos tienen una confiabilidad tan pobre que estoy completamente paranoico sobre ellos hoy en día. Entonces, mi segundo disco interno es una parte importante de mi estrategia.
Neil Mayhew el

He leído y releído el contenido del disco usando dd if=/dev/sda ...y los sectores aún están pendientes, ¿alguna idea de por qué?
dmansfield

@dmansfield, si no encontró ningún error, entonces no estoy seguro de por qué. Me di cuenta de que solo el valor bruto es exacto en la salida inteligente, por lo que si solo estaba mirando el valor 'cocido' puede ser que no tenga ningún sector pendiente.
Neil Mayhew


1
  1. Copia de seguridad de sus datos
  2. Eliminar este dispositivo del grupo LVM
  3. dd if=/dev/zero of=/dev/sdc bs=4k- esto borrará todos los datos en/dev/sdc
  4. Inclúyalo nuevamente en el grupo LVM
  5. Restaura tu copia de seguridad

3
0. Tener una copia de seguridad. :-)
Steven D

Pero este es un error de lectura pendiente, entonces, ¿no debería ser suficiente simplemente leer todos los sectores?
dkagedal

1
@dkagedal: No, el firmware de la HD ya detectó que no puede leer este sector. No tiene forma de recuperarlo (por sí solo, además de quizás volver a intentarlo y volver a intentarlo y tener suerte en algún momento ... ojalá no se corrompan los datos que se devuelven) y, por lo tanto, configura este error INTELIGENTE. Pero si el firmware detecta una escritura en ese sector específico, mapea este sector (y ya no lo usa) y en su lugar asigna un sector de repuesto (en funcionamiento) a esta dirección.
maxschlepzig

@dkagedal: a veces solo una o dos lecturas adicionales traerán de vuelta el sector. Otras veces, nada lo traerá de vuelta. Además, la unidad decide internamente si reasignar el sector o reutilizarlo, en función de la gravedad del error original, y si puede volver a leerlo con éxito después de escribir en él. La única forma de saberlo es mirando el recuento reasignado para la unidad. Creo que las unidades utilizan una suma de comprobación bastante extensa para garantizar que cuando se leen los datos no se corrompan, por lo que puede tener una confianza razonable en un sector que no se reasignó.
Neil Mayhew
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.