Linux md-RAID 如何处理磁盘读取错误?

Tot*_*tor 5 software-raid error-handling linux-kernel disk md

有2种情况:

  • read 命令在内核级别超时(默认为 30 秒),
  • 在内核失去耐心之前,驱动器报告它无法读取给定扇区(我感兴趣的情况)。

内核超时

由于驱动器访问通常通过 Linux SCSI 层,我认为超时情况完全由该层处理。根据此文档,它会在重置驱动器、总线、主机等后多次尝试该命令。如果这些都不起作用,SCSI 层将使设备脱机。在这一点上,我认为 md 层只是“发现”一个驱动器不见了,并将其标记为丢失(失败)。这样对吗?

驱动器报告错误

某些驱动器可以配置为在达到特定超时后报告读取错误,从而中止内部恢复尝试。这称为ERC(或 TLER、CCTL)。磁盘超时通常配置为操作系统超时(或硬件 RAID 控制器)之前触发,以便后者知道真正发生了什么,而不仅仅是“等待和中止”。

我的问题是:Linux(和 md)如何处理驱动器报告的读取错误?

它会再试一次,做一些聪明的事情,还是只是让驱动器脱机而不通过上面“内核超时”中描述的所有尝试?当这种事情发生时,md 甚至知道吗?

有些人认为ERC 在 Linux 上很危险,因为它不会给驱动器足够的时间来尝试恢复。他们还说 ZFS-raid 很好,因为如果发生读取错误,由于 RAID 冗余,它会计算丢失的不可读扇区数据,并将其覆盖回驱动器。然后后者应该停止尝试读取讨厌的扇区,自动将其标记为坏的(不再使用),并将其重新映射到一个良好的扇区。

md 也能做到这一点吗?

fro*_*utz 1

md(4) 手册页的 部分对此进行了详细描述RECOVERY

[...] 读取错误将导致 md 尝试通过覆盖坏块来恢复。即它会从其他地方找到正确的数据,将其写入失败的块,然后尝试再次读回。如果写入或重新读取失败,md 将以与写入错误相同的方式处理错误,并使整个设备失败。

至于超时,虽然有报告称驱动器在待机状态下会被踢出,但我从未真正发生过这种情况。我有 7 个 HDD,它们通常会停止运转(因为主系统使用 SSD 运行,并且可以在很长一段时间没有 HDD 访问的情况下运行)并且它可以正常工作(除了唤醒md一个驱动器一个接一个地驱动器,而不是全部唤醒)一次)。

我想这取决于其他层向什么报告md