我想以编程方式检查 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
。这更简单,并且不需要超级用户权限。
可能的值(可以用逗号分隔)描述如下:
答案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]
问候