¿Cómo maneja Linux md-RAID los errores de lectura de disco?

Hay 2 casos:

  • el command de lectura agota el time en el nivel del kernel (30 segundos por defecto),
  • el disco informa que no puede leer un sector determinado antes de que el núcleo pierda la paciencia (el caso que me interesa).

Tiempo de espera del kernel

Como el acceso a la unidad generalmente pasa por la capa SCSI de Linux, creo que esta capa procesa completamente el caso de time de espera. De acuerdo con esta documentation , intenta el command varias veces después de haber reiniciado la unidad, luego el bus, luego el host, etc. Si nada de esto funciona, la capa SCSI desconectará el dispositivo. En este punto, creo que la capa de md simplemente "descubre" que una unidad se ha ido, y la marca como faltante (fallido). ¿Es esto correcto?

Drive informó error

Algunas unidades se pueden configurar para informar un error de lectura después de que se alcanza un cierto time de espera, por lo que se cancelan los bashs de recuperación interna. Esto se llama ERC (o TLER, CCTL). El time de espera del disco generalmente se configura para activarse antes del time de espera del sistema operativo (o controller RAID hw), para que este último sepa lo que realmente sucedió en lugar de simplemente "esperar y abortar".

Mi pregunta es: ¿cómo maneja Linux (y md) los errores de lectura informados por el disco?

¿Intentará de nuevo, hará algo inteligente o simplemente desconectará la unidad sin pasar por todos los bashs descritos en "Tiempo de espera del kernel" más arriba? ¿Md siquiera está enterado cuando ocurre algo así?

Algunas personas sugieren que ERC es peligroso en Linux, ya que no dará suficiente time para que el disco intente recuperarse. También dicen que ZFS-raid es bueno porque si se produce un error de lectura, calculará los datos del sector que no se pueden leer gracias a la networkingundancia RAID, y lo sobrescribirá en la unidad. Este último debería entonces dejar de tratar de leer el sector desagradable, marcarlo automáticamente como malo (para no ser usado más) y reasignarlo en un buen sector.

¿Es md también capaz de hacer esto?

Esto se describe con cierto detalle en la página man de md (4), sección RECOVERY .

[…] un error de lectura hará que md intente una recuperación sobrescribiendo el bloque incorrecto. es decir, encontrará los datos correctos de otro lugar, escríbalos en el bloque que falló y luego intente leerlos nuevamente. Si falla la escritura o la relectura, md tratará el error de la misma manera que se trata un error de escritura, y fallará todo el dispositivo.

En cuanto a los times de espera, aunque hay informes de que se expulsaron las unidades si estaban en modo de espera, en realidad nunca me sucedió. Tengo 7 discos duros que generalmente giran hacia abajo (ya que el sistema principal funciona con SSD y puede funcionar sin acceso a HDD durante largos períodos de time) y funciona sin problemas (excepto que md despierta una unidad tras otra en lugar de todas) -una vez).

Supongo que depende de lo que las otras capas reporten a md .

En cuanto a que TLER sea peligroso, creo que no. De hecho, todavía no puedo creer que esta característica haya sido siquiera necesaria; ninguna unidad debería llevar tanto time reintentando. Incluso solo 7 segundos son suficientes para que incluso una unidad lenta de 5400 rpm vuelva a intentar cientos de veces. Si no puede hacerlo bien después de varios, y mucho más de varios cientos de bashs, entonces nunca lo hará.