我有一个基于 md 的 RAID5 阵列,它已经运行了大约 2 年没有问题。昨天我在一个磁盘上发生了自发磁盘和/或 PHY 重置(但不是实际的读取错误)。md 将磁盘标记为故障,剩余的阵列状态为“干净,已降级”,因此我尝试删除并重新添加它。md 开始以良好的速度 (140M/s) 重新同步阵列,但在大约 0.6% 时重新同步速度开始下降,并且在大约 10 秒内 mdadm 退出并显示消息“md: md0: recovery interrupted”而没有任何 SCSI 或其他可见错误在 dmesg 输出中(我当前的 SCSI 日志记录级别设置为 0x10012DD)。这发生在几次尝试中。smartctl -a
,smartctl -t short
并且扫描所有磁盘的前 1%badblocks
没有出现任何错误。只读xfs_repair -n
正如预期的那样,在降级的阵列上显示了一堆 I/O 错误和错误的校验和,但是在所有这些练习之后,重新同步已经超过了它早些时候退出的点。我现在badblocks
在其余磁盘上运行,并希望阵列最终会完成重新同步,这样我就可以添加新磁盘并最终升级到 RAID6,但自然不能保证这会发生,这就引出了一个问题:
是否有可能使 md resync 克服错误并丢弃坏块?我宁愿最终得到一个 0.01% 损坏的数组,也不愿什么都没有。我在阵列中的数据并不重要,我可以在更高级别重新检查它是否有错误,但是从头开始恢复它需要很长时间。
查看 raid5.c 中的驱动程序代码,似乎无法强制 md 在重新同步期间忽略错误。但是,如果没有其他帮助,作为最后的手段,可以通过重新创建阵列来重新组装阵列而无需强制重新同步
--assume-clean
,请参见例如RAID Wiki和这个答案。预计不会:一个故障/丢失的磁盘不会导致其他良好的 RAID5 阵列中的数据损坏。您可能在一个或另一个磁盘上有多个不可读的数据扇区。
mdadm
虽然可以强制最近的版本继续恢复,但内部坏块列表非常小,并且当它已满时重建中止。我建议您仔细检查所有磁盘的运行状况。