以编程方式检查 Linux RAID 阵列(MD)

以编程方式检查 Linux RAID 阵列(MD)

我想以编程方式检查 Linux RAID 阵列是否损坏。

对于 RAID-1(镜像)阵列,我使用这个简单的方法,该方法已经运行了好几年,并取得了良好的效果:

cat /proc/mdstat | grep "_" > /dev/null
EC=$?

这背后的想法是/proc/mdstat显示[UU]两个硬盘是否正常,[U_]如果其中一个出现故障,[__]或者两个都出现故障等。通常,/proc/mdstat 的输出里面没有“_”,所以它是正常工作的。

现在我们又有一个 RAID-0(条带)阵列。在/proc/mdstat它看起来像这样:

md2 : active linear sde1[0] sdf1[1]
      3906699440 blocks super 1.2 0k rounding

我的问题是,我如何检测这个 RAID 阵列是否损坏?mdstat 是什么样子的?(注意:我知道当其中一个磁盘发生故障时 /dev/md2 将被破坏,但我想以编程方式检查 RAID 阵列,而不是检查虚拟驱动器 md2 的功能)

操作系统是 Debian 9。

答案1

虽然解析/proc/mdstat是可行的,但是如果您想专门研究某个阵列或者想要覆盖不同的 RAID 级别和故障模式,就会变得混乱。

mdadm --detail /dev/md0 | grep -e '^\s*State : ' | awk '{ print $NF; }'

对于好的数组,将输出“clean”或“active”。您也可以循环/dev/md/*获取所有数组。

答案2

另一个解决方案是查询磁盘状态cat /sys/block/md*/md/dev-*/state。这更简单,并且不需要超级用户权限。

可能的值(可以用逗号分隔)描述如下:

https://www.kernel.org/doc/html/v4.15/admin-guide/md.html

答案3

最近有这个,

dev="";sed 's/\(recovery\|finish\|speed\)/\n#     \0/g;s/^ /#/g' /proc/mdstat |grep -v -e "^# *$" -e "unused devices" -e ^Personalities |while read a ; do if [[ "$a" =~ ^#.*  ]]; then echo "$a"|sed 's/^# \+/'$dev" : "'/g'; else dev=$(echo "$a"|cut -d" " -f1);echo "$a";fi;done

输出每行前面带有设备索引。例如:

md2 :活动 raid1 sda5[2] sdb5[0]
md2 : 1948683456 块超级 1.2 [2/1] [U_]
md2:[========>............]
md2:恢复率 = 41.7% (813027392/1948683456)
md2:完成=128.9分钟
md2:速度=146824K/秒
md1 :活动 raid1 sda2[1] sdb2[0]
md1:2097088 块[2/2] [UU]
md0 :活动 raid1 sda1[1] sdb1[0]
md0 : 2490176 块 [2/2] [UU]

问候

相关内容