问题

问题

问题

在组件设备遭遇意外的位翻转后,并且repair在 raid 设备上成功执行 raid6 后,如何强制 mdadm 将缓冲区中的更改同步回组件设备?

以及如何监控此类修复的发生?

设置

为了测试目的,我做了以下设置(在 debian jessie 上使用 bash):

sudo -i
mkdir testbed
cd testbed
for i in 1 2 3 4; do
    dd if=/dev/zero of=disk$i bs=1M count=4
    losetup loop$i disk$i
done
mdadm --create /dev/md/test --level=6 --raid-devices=4 /dev/loop{1,2,3,4}
mkfs.vfat /dev/md/test # Note: has easier hexdump than ext
mkdir mounted
mount /dev/md/test mounted
echo "Hello World!" > mounted/message

意外的位翻转

测试场景假设当 RAID 设备未运行时,其中一个组件设备上的某些位会发生变化。

umount mounted
mdadm --stop /dev/md/test
# Note: does show 'H' from 'Hello World!' at position 0x00107a00
hexdump -C /dev/loop1
# manipulate some bits in first component device at 0x00107a00
dd if=/dev/zero bs=1 count=1 seek=1079808 of=/dev/loop1
# Note: now changed to ".ello World!" at position 0x00107a00
hexdump -C /dev/loop1

修复

现在重新启动 raid 设备,并尝试说服 mdadm 检测并修复组件设备上的故障位。

组装和安装

mdadm --assemble /dev/md/test /dev/loop{1,2,3,4}
mount /dev/md/test mounted
# dmesg does not show error
# hexdump still shows faulty bits

这是预料之中的。

读取错误扇区

cat mounted/message # always reads the non-faulty message
# nothing in dmesg
# no raid6 related message in /var/log/syslog
# /sys/block/md127/md/mismatch_cnt == 0
# hexdump still shows faulty bits

到目前为止,mdadm 应该已经检测到不匹配的校验和,并通过多数表决确定 /dev/loop1 有故障。但是任何地方都没有关于此问题的警告或错误计数。

启动修复

echo repair > /sys/block/md127/md/sync_action
sync # should be completely unrelated for this question
# dmesg reports successful resync
# /var/log/syslog replicates the dmesg messages
# hexdump -C /dev/loop1 still shows faulty bits as 0x00107a00

mdadm 现在肯定已经注意到了错误位,但由于某种原因,没有将修复后的块写回磁盘。

需要停止 raid 设备

似乎有必要停止 raid 设备(从而使文件系统暂时不可用!)以强制同步已修复的块。

umount mounted
mdadm --stop /dev/md/test

最后,hexdump 终于再次显示正确的“H”。但是 dmesg 或 syslog 或 mismatch_cnt 中没有显示任何有故障块的迹象。

相关内容