Reparar discos con sectores defectuosos en Linux

Se trata del error hardware más frecuente en cualquier tipo de servidor/ordenador o dispositivo dedicado de almacenamiento:

Fallos de disco duro con errores de escritura

Lo aconsejable en estos casos sería hacer un backup del disco que presenta problemas y sustituirlo. Con la frecuencia que estos errores se presentan, provocadas por factores de entorno (humedad, temperatura, vibraciones, fallos electricos o mecánicos, … ) o por fin de vida útil, la prevención es la herramienta más eficaz de forma que:

Se disponga de un sistema que controle dichas variables de entorno (Utilizar herramientas de monitorización basadas en SMART) y El sistema tenga tolerancia a fallos de disco ( por ejemplo RAID1,5) de forma que cuando presenta un fallo, el disco es aislado y solicita a su administrador que lo sustituya, previniendo las pérdidas de datos y su acceso , ya sea por recostrucción automática en disco auxiliar (spare) y/o recreación de la información (algoritmos de paridad).

No siempre se administran sistemas con un diseño previsor a estos tipos de errores, pueden ser por deficiencias provocadas por los presupuestos de la empresa ( el disco duro históricamente era un soporte de almacenamiento bastante caro) o por algo muy “typical spanish”:

El aprendizaje a base de palos porque no hay previsión.

Por ejemplo, errores hardware en el almacenamiento que provoca caida de algunos de los servicios básicos de una empresa, incluso con pérdidas  datos valiosos e irrecuperables.  Esto generará entonces un replanteamiento de la seguridad en el almacenamiento. Una auditoría y una inversión acorde con el valor y cantidad de datos eliminaría este riesgo, no olvidemos que se suele cumplir la máxima de:

Se tiene lo que se paga

Aún así, sean técnicos o responsables de sistemas de una empresa, convertidos en unos Mc Gyver, tratan de cubrir muchas deficiencias de las instalaciones informáticas, al recaer en ellos la responsabilidad de mantener unas instalaciones inseguras y con bajo presupuesto … Me refiero a esos Googleadores natos, con el destornillador siempre a mano,

que tienen disponibilidad absoluta cuando el jefe lo llama a las 12 de la noche porque no puede conectarse a la VPN de la empresa desde su casa.

La migración de entornos a Linux es una opción muy típica para estas instalaciones, debido a la compatibilidad con el hardware, facilidad de control y supervisión y por lo tanto seguridad, con paquetes completos para estas labores de administración sin ningún coste (para los más arerriesgados), o disponer de un soporte de todo el software de una distribución Enterprise a bajo precio.

En la actualidad, debido al aumento de capacidad y la bajada de precios del disco duro, hasta un usuario particular puede permitirse pagarse el hardware para un sistema raid tolerante a fallos de disco en el PC de su casa, …, tema pendiente para otro post.

Volviendo al tema que tocamos ahora, que hacer cuando hay que reparar unos sectores defectuosos, por ejemplo de un disco sin garantía o contrato de soporte o simplemente testear cuales son esos sectores para valorar el riesgo. Se pueden usar herramientas específicas para esta causa, que tienen los fabricantes de discos y que están basado en la tecnología SMART. Poniendo un ejemplo, en la creación de un raid 5 para uso doméstico, me encontré que la herramienta de software  para raid mdadm se negaba a integrar en el nuevo volumen uno de los discos de tera y medio comprados específicamente para esta función. La finalización del paso de creación del raid  (mdadm –create) terminaba con un sistema degradado. Después de varias búsquedas por internet, por sintomatología determino que es error de escritura para un sector de la LBA específico, por lo que me dispongo abrir un caso a Soporte de Seagate. Soporte me solicitó usar una herramienta propia para diagnóstico y reparación de sectores defectuosos, pero el consejero Google me llevó por otros derroteros, e intenté repararlo con herramientas propias de la distribución. Por equivalencia, como estas herramientas de diagnóstico se basan en SMART instalé smartmontools, paquete de aplicaciones que incluye Debian y demás distros en linux para diagnóstico de discos con SMART implementado.   Lo que a continuación expondré son unos pasos prácticos para en primer momento diagnóstico, y si es posible reparación.

Para diagnosticar y reparar, en el campo que sea lo primero es formarse y el conocimiento no aparece de forma espontánea, viene después de mucho trabajo y experiencia, aunque una cultura de base acelera el proceso de aprendizaje de forma exponencial. Dejo varios links para este propósito:

Básico

Procedente de la Wikipedia: Una magnífica introducción al disco duro, componentes físicos, divisiones físicas y lógicas, formas de direccionamientos, tecnologías usadas,  … , Un trabajo inmejorable de síntesis en un artículo y en castellano!

Procedente de Wikipedia: Definición de tecnología SMART,  parámetros que controla para diagnóstico de error y en castellano.

Procedente de Monografías: Aunque es información básica, en ocasiones obsoleta y orientado a entornos de Microsoft. Se definen conceptos básicos como tiempos de acceso o buffer de disco interesantes.

Procedente de Wikipedia: Definición, historia, especificaciones,… sobre discos SATA (Serial-ATA).

Google: El oráculo de Delfos, hasta ahora …  responde preguntas y sobre todo crea nuevas para seguirte respondiendo.

Herramientas referidas en este post

smartmontools – Paquete que contiene dos utilidades smartctl y smartd, para controlar y monitorizar sistemas de almacenamiento que usan SMART.

sg3-tools – Paquete para enviar comandos scsi a dispositivos scsi.

Seatools for DOS: Herramienta de Seagate para diagnóstico y reparación de discos.

Procedimiento de diagnóstico de sectores defectuosos

En este ejemplo se tratará de un entorno GNU/Linux, distribución Debian, al usar sus repositorios se usará la utilidad de paquetes nativas (apt-get) de la distribución, de forma análoga se usará yum en las variantes de Red Hat, Yast en Novell/Suse, …

En un sistema Debian, podremos tirar de repositorio para instalar el paquete smartmontools:

Comprobar que está en repositorio:

nas-ferras:~# apt-cache search smartmontools
smart-notifier – graphical hard disk health status notifier
smartmontools – control and monitor storage systems using S.M.A.R.T.

Instalar paquete smartmontools:

nas-ferras:~# apt-get install smartmontools
Leyendo lista de paquetes… Hecho
Creando árbol de dependencias
Leyendo la información de estado… Hecho
Se instalarán los siguientes paquetes NUEVOS:
smartmontools
0 actualizados, 1 se instalarán, 0 para eliminar y 1 no actualizados.
Se necesita descargar 0B/332kB de archivos.
Se utilizarán 848kB de espacio de disco adicional después de esta operación.
Seleccionando el paquete smartmontools previamente no seleccionado.
(Leyendo la base de datos …
91982 ficheros y directorios instalados actualmente.)
Desempaquetando smartmontools (de …/smartmontools_5.38-2+lenny1_amd64.deb) …
Procesando disparadores para man-db …
Configurando smartmontools (5.38-2+lenny1) …
Not starting S.M.A.R.T. daemon smartd, disabled via /etc/default/smartmontools (warning).

Comprobar la versión instalada:

nas-ferras:~# dpkg -l smartmontools
Desired=Unknown/Install/Remove/Purge/Hold
| Estado=No/Instalado/Config-files/Desempaquetado/Fallo-config/Medio-inst/espera-disparo/pendiente-disparo
|/ Err?=(ninguno)/Retenido/Requiere-reinst/X=ambos problemas (Estado,Err: mayúsc.=malo)
||/ Nombre                            Versión                          Descripción
+++-=================================-=================================-==================================================================================
ii  smartmontools                     5.38-2+lenny1                     control and monitor storage systems using S.M.A.R.T.

DIAGNÓSTICO

Ejecución de test sobre disco sospechoso:

Se puede usar la versión short o long:

nas-ferras:~# smartctl -t long /dev/sda
smartctl version 5.38 [x86_64-unknown-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: “Execute SMART Extended self-test routine immediately in off-line mode”.
Drive command “Execute SMART Extended self-test routine immediately in off-line mode” successful.
Testing has begun.
Please wait 255 minutes for test to complete.
Test will complete after Wed Oct 14 01:13:52 2009

Use smartctl -X to abort test.

Una revisión del log mostrará los resultados de los diferentes tests ejecutados sobre el disco de la siguiente forma:

nas-ferras:~# smartctl -l selftest /dev/sda
smartctl version 5.38 [x86_64-unknown-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed: read failure       90%        99         2597324513
# 2  Extended offline    Completed: read failure       90%        62         2597324513
# 3  Short offline       Completed: read failure       90%        61         2597324513
# 4  Short offline       Completed: read failure       90%        61         2597324513
# 5  Short offline       Completed: read failure       90%        61         2597324513
# 6  Short offline       Completed: read failure       90%        60         2597324513
# 7  Extended offline    Completed: read failure       90%        60         2597324513
# 8  Extended offline    Completed: read failure       90%        58         2597324513
# 9  Extended offline    Completed: read failure       90%        58         2597324513
#10  Extended offline    Completed: read failure       90%        58         2597324513

Que apunta en todos sus test ejecutados a fallos de lectura en el sector 2597324513.

Ya tenemos diagnóstico,  un sector está defectuoso, siendo el causante de que mdadm no lo quiera integrar como elemento en el raid5, etiquetándolo como disco en fallo.

REPARACIÓN

La reparación será una reasignación del sector en fallo, para un disco SCSI/Fibra sería posible realizarlo con las herramientas del paquete sg3-utils siguiendo los siguientes pasos: Instalación #apt-get install sg3-utils, confirmación del sector defectuoso #sg_verify –lba=2597324513 /dev/sda y reasignar el sector en el firmware del disco con # sg_reassign –grown /dev/sda #sg_reassign –address=2597324513 /dev/sda. Más detallado se encuentra éste procedimiento basado en un caso práctico en éste link.

Para nuestro caso, se trata de un disco SATA, en principio no podemos disfrutar de las sg3-utils para los tipo SCSI, pero una pregunta a Google responde que este paquete en versiones actuales ya tiene soporte para este tipo de discos y trataremos de probar suerte.

nas-ferras:~# sg_verify –lba=2597324513 /dev/sda
verify (10):  Descriptor format, current;  Sense key: Medium Error
Additional sense: Unrecovered read error – auto reallocate failed
Descriptor type: Information
0x0000ffff9ad006e1
medium or hardware error, reported lba=0xffff9ad006e1
nas-ferras:~# sg_reassign –address=2597324513 /dev/sda
REASSIGN BLOCKS not supported
nas-ferras:~# sg_verify –lba=2597324513 /dev/sda
verify (10):  Descriptor format, current;  Sense key: Medium Error
Additional sense: Unrecovered read error – auto reallocate failed
Descriptor type: Information
0x0000ffff9ad006e1
medium or hardware error, reported lba=0xffff9ad006e1

En un principio no responde nada parecido a dispositivo no soportado por la herramienta y la información que proporciona es coherente, pareciendo que interactúa con dispositivos SATA. Pero partiendo  de que se trata de una herramienta que a bajo nivel trabaja con dd, tampoco parece raro que detecte errores de lectura para cualquier dispositivo ya que no tendría porque usar los driver sg ( SCSI generic) para dispositivos SCSI y fibra en esta comprobación.

Nos quitará las dudas cuando forzaremos la reasignación del sector(reallocate):

nas-ferras:~# sg_reassign –grown /dev/sda
READ DEFECT DATA (10) not supported

nas-ferras:~# sg_reassign –address=2597324513 /dev/sda
REASSIGN BLOCKS not supported

En un principio parece que esta tools no está preparada para la reasignación de sectores en dispositivos  SATA, o el firmware del disco no es compatible con las sg3-tools. De todas formas no encuentro referencias a que interactúe con dispositivos SATA en ninguna parte del man de sg3-tools o sg_reassign.

Persistiendo en la forma de realizar una reasignación del sector defectuoso desde linux, se formatea el disco en ext3 y se sigue la guía Bad block HOWTO for smartmontools para el caso de una partición extended:

Se formatea en ext3

nas-ferras:~#mkfs.ext3 /dev/sda2

Se recogen los atributos de la partición /dev/sda:

nas-ferras:~# smartctl -A /dev/sda
smartctl version 5.38 [x86_64-unknown-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate     0x000f   103   097   006    Pre-fail  Always       –       88063229
3 Spin_Up_Time            0x0003   100   100   000    Pre-fail  Always       –       0
4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       –       45
5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       –       2
7 Seek_Error_Rate         0x000f   100   253   030    Pre-fail  Always       –       675601
9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       –       103
10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       –       0
12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       –       45
184 Unknown_Attribute       0x0032   100   100   099    Old_age   Always       –       0
187 Reported_Uncorrect      0x0032   060   060   000    Old_age   Always       –       40
188 Unknown_Attribute       0x0032   100   093   000    Old_age   Always       –       59
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       –       0
190 Airflow_Temperature_Cel 0x0022   061   055   045    Old_age   Always       –       39 (Lifetime Min/Max 25/40)
194 Temperature_Celsius     0x0022   039   045   000    Old_age   Always       –       39 (0 21 0 0)
195 Hardware_ECC_Recovered  0x001a   039   030   000    Old_age   Always       –       88063229
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       –       1
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      –       1
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       –       0
240 Head_Flying_Hours       0x0000   100   253   000    Old_age   Offline      –       59180354371687
241 Unknown_Attribute       0x0000   100   253   000    Old_age   Offline      –       3587000442
242 Unknown_Attribute       0x0000   100   253   000    Old_age   Offline      –       3852047273

Se busca comienzo de la partición sda2:

nas-ferras:~# fdisk -lu /dev/sda

Disco /dev/sda: 1500.3 GB, 1500301910016 bytes
255 heads, 63 sectors/track, 182401 cylinders, 2930277168 sectores en total
Units = sectores of 1 * 512 = 512 bytes
Disk identifier: 0x0009ec06

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sda1   *          63    29302559    14651248+  83  Linux
/dev/sda2        29302560 2930272064  1450484752+  83  Linux

Como sda2 empieza en el sector 293302560 y el sector en error es 2597324513, para obtener la posición del sector en error relativo a la partición sda2 hay que hacer la resta 2597324513 – 293302560 = 2304021953.

Para saber el tamaño de bloque usado por el sistema de ficheros en sda2 :

nas-ferras:~# tune2fs -l /dev/sda2 | grep Block
Block count:              362621188
Block size:               4096
Blocks per group:         32768

Para finalizar las cuentas nos queda por saber que bloque del sistema de ficheros contiene esta LBA. Que sigue la siguiente ecuación

  b = (int)((L-S)*512/B)
Donde:
b = Número de bloque en el sistema de ficheros
B = Tamaño de bloque en bytes del sistema de fichero
L = LBA del sector defectuoso
S = Sector de comienzo de la partición que muestra la herramienta fdisk -lu
y (int) que denota la parte entera.

En nuestro ejemplo quedaría así:

b=((int)(2597324513 - 293302560)*512/4096)= (int) 288002744,125=288002744

Comprobamos que el bloque no está en uso:

nas-ferras:~# debugfs
debugfs 1.41.3 (12-Oct-2008)
debugfs:  open /dev/sda2

debugfs:  testb 288002744
Block 288002744 not in use

Y por último realizar un dd para forzar un reallocate del sector defectuoso como se describe en la guía:

nas-ferras:~# dd if=/dev/zero of=/dev/sda2 bs=4096 count=1 seek=288002744
1+0 records in
1+0 records out
4096 bytes (4,1 kB) copied, 0,000607736 s, 6,7 MB/s

Ejecuto test dos veces:

nas-ferras:~# smartctl -t short /dev/sda
smartctl version 5.38 [x86_64-unknown-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: “Execute SMART Short self-test routine immediately in off-line mode”.
Drive command “Execute SMART Short self-test routine immediately in off-line mode” successful.
Testing has begun.
Please wait 1 minutes for test to complete.
Test will complete after Wed Oct 14 01:14:43 2009

Sorpresa !! No se ha producido una nueva reasignación de sectores, se puede comprobar mirando del atributo Reallocated_Sector_Ct en la salida del comando smartctl -A /dev/sda:

nas-ferras:~# smartctl -A /dev/sda
smartctl version 5.38 [x86_64-unknown-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate     0x000f   103   097   006    Pre-fail  Always       –       89275771
3 Spin_Up_Time            0x0003   100   100   000    Pre-fail  Always       –       0
4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       –       46
5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       –       2
7 Seek_Error_Rate         0x000f   100   253   030    Pre-fail  Always       –       679040
9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       –       104
10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       –       0
12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       –       46
184 Unknown_Attribute       0x0032   100   100   099    Old_age   Always       –       0
187 Reported_Uncorrect      0x0032   060   060   000    Old_age   Always       –       40
188 Unknown_Attribute       0x0032   098   093   000    Old_age   Always       –       61
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       –       0
190 Airflow_Temperature_Cel 0x0022   066   055   045    Old_age   Always       –       34 (Lifetime Min/Max 26/34)
194 Temperature_Celsius     0x0022   034   045   000    Old_age   Always       –       34 (0 21 0 0)
195 Hardware_ECC_Recovered  0x001a   038   030   000    Old_age   Always       –       89275771
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       –       1
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      –       1
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       –       0
240 Head_Flying_Hours       0x0000   100   253   000    Old_age   Offline      –       143872814481511
241 Unknown_Attribute       0x0000   100   253   000    Old_age   Offline      –       3587013738
242 Unknown_Attribute       0x0000   100   253   000    Old_age   Offline      –       3874184123

Y lógicamente los resultados de los test ejecutados después del dd, siguen dando fallo en mismo sector:

nas-ferras:~# smartctl -l selftest /dev/sda
smartctl version 5.38 [x86_64-unknown-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed: read failure       90%       103         2597324513
# 2  Short offline       Completed: read failure       90%       103         2597324513
# 3  Extended offline    Completed: read failure       90%        99         2597324513
# 4  Extended offline    Completed: read failure       90%        62         2597324513
# 5  Short offline       Completed: read failure       90%        61         2597324513
# 6  Short offline       Completed: read failure       90%        61         2597324513
# 7  Short offline       Completed: read failure       90%        61         2597324513
# 8  Short offline       Completed: read failure       90%        60         2597324513
# 9  Extended offline    Completed: read failure       90%        60         2597324513
#10  Extended offline    Completed: read failure       90%        58         2597324513
#11  Extended offline    Completed: read failure       90%        58         2597324513
#12  Extended offline    Completed: read failure       90%        58         2597324513

Tampoco este HOWTO nos lleva a la reparación del sector defectuoso.

Herramienta SEATOOLS for DOS

Queda usar la herramienta propia de Seagate llamada SEATOOLS, que se trata de un LiveCD basado en FreeDOS que posee una interfaz gráfica que reconoce los discos SATA y proporciona herramientas de diagnóstico, reparación y configuración. Esta herramienta se puede descargar desde el siguiente link.

Los resultados de ejecución de esta herramienta han sido eficaces, detecta en su Basic Test Short  el sector defectuoso, y en su Basic Test Long en su finalización solicita la reparación del mismo. Con la reparación ha pasado los test del mdadm  e integrado en el raid5 sin problemas. Sólo queda tenerlo un tiempo en observación para comprobar que es sólamente un error puntual en el sector o el disco es inestable con tendencia a errores.

Conclusiones:

  • Herramientas basadas en SMART como smartctl, es eficaz en el diagnóstico de sectores defectuosos.
  • La herramientas de diagnóstico propias de los fabricantes de discos, pueden ser el único medio para la reparación de sectores defectuosos. Además, automatizan el proceso de análisis y reparación de forma cómoda. Cuyo único inconveniente en la herramienta usada es que al ser LiveCD se necesita reiniciar el ordenador y dejarlo fuera de servicio varias horas mientras se ejecuta el análisis de disco. Una integración en el sistema operativo de esta herramienta sería lo ideal si no se quieren parar los servicios de la máquina durante tanto tiempo. Otra opción, la que usé, es apagar el ordenador, extraer el disco y ponerlo en otro PC para que ejecute el diagnóstico, cuya parada fue de pocos minutos (apagar, extraer disco y encender).
  • De forma preventiva es altamente aconsejable usar otra herramienta como smartd perteneciente al mismo paquete de smartmontools, que realiza un continua monitorización del estado de los discos, quedando pendiente debido a su extensión para otro post.