我想了解 Linux 认为驱动器确实有故障、将其从阵列中排除以及认为 RAID10 阵列已降级的一系列条件。
据我所知,无论是 SMART 自检报告,还是有关重定位扇区的任何 SMART 值,还是块奇偶校验问题(/sys/block/md0/md/mismatch_cnt > 0 甚至 >10.000)都不能被视为将磁盘从阵列中排除的原因。
这些原因是什么(当然除了驱动器物理上无法通信的情况)?
答案1
原则上,两者块读写错误可以使磁盘脱机。但是,具体行为取决于所使用的内核。
来自恢复部分md 手册页:
如果 md 驱动程序检测到 RAID1、RAID4、RAID5、RAID6 或 RAID10 阵列中的某个设备存在写入错误,它会立即禁用该设备(将其标记为故障)并继续在其余设备上运行。如果有备用驱动器,驱动程序将开始在其中一个备用驱动器上重新创建该故障驱动器上的数据,方法是复制 RAID1 配置中的工作驱动器,或者使用 RAID4、RAID5 或 RAID6 上的奇偶校验块进行计算,或者查找并复制 RAID10 的原始数据。
在 2.6.15 之前的内核中,读取错误会导致与写入错误相同的效果。在更高版本的内核中,读取错误将导致 md 尝试通过覆盖坏块进行恢复。即,它将从其他地方找到正确的数据,将其写入失败的块,然后尝试再次读取。如果写入或重新读取失败,md 将以与写入错误相同的方式处理该错误,并使整个设备失败。
请务必阅读坏块列表部分还:
从 Linux 3.5 开始,md 阵列中的每个设备都可以存储已知坏块的列表。此列表大小为 4K,通常位于超级块和数据之间的空间末尾。
当某个块无法读取,并且无法通过写入从其他设备恢复的数据来修复时,该块的地址将存储在坏块列表中。同样,如果尝试写入某个块失败,该地址将被记录为坏块。如果尝试记录坏块失败,整个设备将被标记为故障。
尝试从已知坏块读取将导致读取错误。如果设备报告了任何写入错误,则尝试写入已知坏块将被忽略。如果没有写入错误,则数据将写入已知坏块,如果成功,则该地址将从列表中删除。
这使得阵列能够更加优雅地发生故障 - 不同设备上的几个块可以出现故障,而不会导致整个阵列停止运行。