我最近收到一封自动电子邮件,内容是“警告:/dev/md3 上的mismatch_cnt 不为0”。
我正在 CentOS 6.6 上使用 mdadm 运行软件 RAID5 阵列
当谷歌搜索这条消息时,我发现了这个:-
检查操作会扫描驱动器是否有坏扇区并自动修复它们。如果它发现好扇区包含坏数据(一个扇区中的数据与另一个磁盘中的数据表明的不一致,例如奇偶校验块+其他数据块会让我们认为这个数据块不正确),则不会采取任何操作,但会记录该事件。这种“不执行任何操作”允许管理员检查扇区中的数据以及通过从冗余信息重建扇区而产生的数据,并选择要保留的正确数据。
我的问题是,如何检查数据并选择要保留的正确数据?似乎没有提到如何在任何地方执行此操作,我不知道这些扇区正在影响哪些文件
答案1
愚蠢且耗时的方法:
对于每个磁盘,组装缺少该磁盘的 RAID,然后安装它。比较这些挂载的所有文件;如果您发现任何文件有任何差异,那就是您的不匹配。
在 RAID 未运行的救援系统中执行此操作。为了确保 RAID 成员本身不会发生任何更改,请为它们创建只读循环设备。
# losetup --find --show --read-only /dev/diska
/dev/loop0
# losetup --find --show --read-only /dev/diskb
/dev/loop1
# losetup --find --show --read-only /dev/diskc
/dev/loop2
缺少一张磁盘的情况下进行组装:
# mdadm --assemble --run --readonly /dev/md42 /dev/loop0 /dev/loop1
mdadm: /dev/md42 has been started with 2 drives (out of 3).
# mount -o ro /dev/md42 loop/
# md5sum loop/file
95e3afde4229e266cb49f1d6e3fba705 file
组装另一个丢失的磁盘:(依次对每个磁盘执行此操作,因此每个磁盘都曾经是丢失的磁盘)
# mdadm --stop /dev/md42
# mdadm --assemble --run --readonly /dev/md42 /dev/loop0 /dev/loop2
mdadm: /dev/md42 has been started with 2 drives (out of 3).
# mount -o ro /dev/md42 loop/
# md5sum loop/file
679c261d076f268a880c0fe847739e64 file
所以你有一个不同的文件。无论其中任何一个是正确的,您都必须自己决定。
直接定位到不匹配的地址肯定会更聪明;不过,我不知道是否md
可以强迫将这些地址提供给您。然后,您仍然需要找到该地址可能与您的文件系统中的哪个文件相关。完成此操作的容易程度取决于文件系统。
答案2
在raid5的情况下,没有备用数据;它只是意味着校验和不匹配。写入repair
以/sys/block/md0/md/sync_action
扫描数组并重新计算任何不匹配的校验和。