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.
-
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:
=== 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:
=== 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 smartmontoolspara 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:
=== 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 0×0003 100 100 000 Pre-fail Always - 0
4 Start_Stop_Count 0×0032 100 100 020 Old_age Always - 45
5 Reallocated_Sector_Ct 0×0033 100 100 036 Pre-fail Always - 2
7 Seek_Error_Rate 0x000f 100 253 030 Pre-fail Always - 675601
9 Power_On_Hours 0×0032 100 100 000 Old_age Always - 103
10 Spin_Retry_Count 0×0013 100 100 097 Pre-fail Always - 0
12 Power_Cycle_Count 0×0032 100 100 020 Old_age Always - 45
184 Unknown_Attribute 0×0032 100 100 099 Old_age Always - 0
187 Reported_Uncorrect 0×0032 060 060 000 Old_age Always - 40
188 Unknown_Attribute 0×0032 100 093 000 Old_age Always - 59
189 High_Fly_Writes 0x003a 100 100 000 Old_age Always - 0
190 Airflow_Temperature_Cel 0×0022 061 055 045 Old_age Always - 39 (Lifetime Min/Max 25/40)
194 Temperature_Celsius 0×0022 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 0×0012 100 100 000 Old_age Always - 1
198 Offline_Uncorrectable 0×0010 100 100 000 Old_age Offline - 1
199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always - 0
240 Head_Flying_Hours 0×0000 100 253 000 Old_age Offline - 59180354371687
241 Unknown_Attribute 0×0000 100 253 000 Old_age Offline - 3587000442
242 Unknown_Attribute 0×0000 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:
=== 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:
=== 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