如何让 Linux 软件 RAID1 检测磁盘损坏?

如何让 Linux 软件 RAID1 检测磁盘损坏?

这是噩梦般的一天:在 Linux SW-RAID1 上运行的虚拟化服务器运行的 VM 在看似随机的代码块中表现出随机段错误。

在调试时,我发现一个文件在每次运行时都会产生不同的 md5sum。深入挖掘后,我发现:组成 RAID1 镜像的原始磁盘分区包含 2 位差异,并且一个磁盘上有大约 9 个扇区完全是空的,而另一个磁盘上则充满了数据。

显然,Linux 会从镜像集中未确定选择的磁盘中返回一个扇区。因此,有时返回的是相同的扇区,有时返回的是损坏的扇区。

文档说:

RAID 无法也不应该防止介质上的数据损坏。因此,故意损坏磁盘上的数据(例如使用 dd)以查看 RAID 系统如何处理这些数据也是毫无意义的。除非您损坏了 RAID 超级块,否则 RAID 层很可能永远不会发现损坏,但 RAID 设备上的文件系统将被损坏。

谢谢。这会帮助我入睡。:-/

有没有办法让 Linux 至少通过使用扇区校验和或类似的东西来检测这种损坏?这会在 RAID5 设置中检测到吗?这是我希望使用 ZFS 或 btrfs 的时刻吗(一旦它在没有超级管理员功能的情况下变得可用)?

编辑:我并不孤单

答案1

你可以强制检查(例如)md0

echo "check" > /sys/block/md0/md/sync_action

您可以使用以下命令检查测试状态

cat /sys/block/md0/md/sync_action

当它返回check检查正在运行时,一旦它返回,idle你可以做一个

cat /sys/block/$dev/md/mismatch_cnt

看看不匹配计数是否为零。许多发行版都会自动执行此检查,例如每周为您运行一次,就像大多数工业硬件 RAID 在阵列处于空闲状态时在后台持续运行此检查(它们通常称为“RAID 清理”)。请注意,根据 fedora 自动检查文件中的注释,内核中的 RAID1 写入是无缓冲的,因此即使对于健康的阵列(如果阵列已安装),不匹配计数也可能为非零。

因此,如果可能的话,在虚拟机关闭时通过执行此检查来使阵列静止可能是个好主意。

我想补充一点,我同意文档中的说法

RAID 不能也不应该防止介质上的数据损坏

RAID 旨在防止设备完全失效;防止存储设备元素中出现增量随机故障是错误检查和块重新映射的工作,这最好在控制器本身中完成。我很高兴文档警告人们 RAID 的局限性,特别是如果它是在不稳定的设备上实现的。我发现频繁使用 smartctl 检查驱动器的运行状况有助于我随时了解开始显示导致镜像不同步的错误类型的驱动器。

答案2

相关内容