这是一个转发我在 ServerFault 上问的问题并因缺乏活动而被自动删除。希望它在这里能有更好的运气。
在 Linux 上对具有冗余功能的 md 软件 RAID 阵列执行“检查”(通过写入)后check
,子系统将使用不匹配的块中包含的扇区数更新虚拟文件。/sys/class/block/md0/md/sync_action
md
/sys/class/block/md0/md/mismatch_cnt
不幸的是,它没有告诉它们是哪个块或扇区。
在具有 2 个驱动器的 RAID 1 阵列上(例如 sda 和 sdb 上的 md0),可以执行以下操作:
blockdev --flushbufs /dev/md0 /dev/sda /dev/sdb
cmp -l /dev/sda /dev/sdb > sda-sdb.diff
找出哪些字节不同,然后导出扇区和附加信息(例如,如果存在文件系统,哪个文件会受到影响)。
但有没有办法获得其他 RAID 级别的相同信息?例如,对于此 RAID10 阵列:
$ cat /sys/class/block/md0/md/mismatch_cnt
4608
$ cat /proc/mdstat
[...]
md0 : active raid10 sdd1[4] sdc1[3] sdb1[1] sda1[0]
3906763776 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
我怎么知道哪里不匹配/dev/md0
?
在这个特定的例子中,算法并不太复杂:我们可以用来mdadm -E
找出数据在设备中的起始位置,然后 sda1 与 sdb1 相同,sdc1 与 sdd1 相同,/dev 的第一个块/md0 在 sda1 和 sda2 的第一个块中找到,第二个在 sdc1 和 sdd1 的第一个块中找到,因此给定一对设备中字节差异的偏移量,找出相应的偏移量并不困难在 md 设备中,但我希望有一种方法可以避免手动运行算法