故障硬盘根据规律提前筛查脚本(二)

之前那个是用来根据smart属性值筛选出风险盘的执行脚本,是整个方案中的一部分。根据硬盘工作原理,在不断的读写中属性值才会趋于真实,因此完整筛选方案中还需要添加全盘读的操作。除了smart的筛选以外,还会阵列卡日志中筛选出media error报错的硬盘,做fio的盘也会根据fio输出重定向的文件的最后修改时间减去初始时间来计算fio时长,明显过长的肯定也是存在问题的。一套下来最重要的是标识,日志最后打包的时候要根据存在的盘的品牌以及是否有风险来命名日志,这样子便于判断这台服务器有没有存在风险盘。

整个方案其实是带内的,通过放在livecd中,批量下发给服务器,启动后自动执行,生成的日志需要外部访问收集,这个只需要外部的一个for循环scp拷贝即可。但是每台服务器的IP就需要提前设置了,可以提前给每台服务器规划好IP,比如本次每台服务器的IP都是和SN对应的,那么在脚本的最开始还需要设置网络,这里是做了一个bond,并根据提前放进去的ip信息文件对应设置,分享代码如下

modprobe bonding
sn=`dmidecode -t system | grep -i "serial number" | awk '{print $3}'`
ip=`cat fiocheck/IP.txt | grep -i "$sn" | awk -F ',' '{ print $2}'`
nm=`cat fiocheck/IP.txt | grep -i "$sn" | awk -F ',' '{ print $3}'`
GW=`cat fiocheck/IP.txt | grep -i "$sn" | awk -F ',' '{ print $4}'`
[ -f /etc/sysconfig/network-scripts/ifcfg-ens16f0 ] && rm -rf /etc/sysconfig/network-scripts/ifcfg-ens16f0
[ -f /etc/sysconfig/network-scripts/ifcfg-ens16f1 ] && rm -rf /etc/sysconfig/network-scripts/ifcfg-ens16f1
touch /etc/sysconfig/network-scripts/ifcfg-ens16f0
touch /etc/sysconfig/network-scripts/ifcfg-ens16f1
touch /etc/sysconfig/network-scripts/ifcfg-bond1
touch /etc/modprobe.d/bonding.conf
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-ens16f0
TYPE=Ethernet
NAME=ens16f0
BOOTPROTO=none
MASTER=bond1
SLAVE=yes
ONBOOT=yes
DEVICE=ens16f0
EOF

cat << EOF > /etc/sysconfig/network-scripts/ifcfg-ens16f1
TYPE=Ethernet
NAME=ens16f1
BOOTPROTO=none
MASTER=bond1
SLAVE=yes
ONBOOT=yes
DEVICE=ens16f1
EOF

cat << EOF > /etc/sysconfig/network-scripts/ifcfg-bond1
DEVICE=bond1
NAME=bond1
BOOTPROTO=static
BONDING_OPTS="mode=4 miimon=100 xmi_hash_policy=layer3+4"
BONDING_MASTER=yes
IPADDR=$ip
NETMASK=$nm
GATEWAY=$GW
ONBOOT=yes
TYPE=Bond
EOF

nmcli c reload
ifdown bond1
ifup bond1
chpasswd < fiocheck/userlist.txt
rpm -ivh fiocheck/libaio-*
rpm -ivh fiocheck/fio-*
rpm -ivh fiocheck/storcli-*
rpm -ivh fiocheck/sshpass*
sn=`dmidecode -t system | grep -i "serial number" | awk '{print $3}'`
[ -d Log ] && rm -rf Log
mkdir Log
mkdir Log/$sn
mkdir Log/$sn/fiolog
mkdir Log/$sn/smartlog
touch Log/$sn/fiotime.txt
touch Log/$sn/errorcheck.txt
currentimes=`date +%s`
name=`lsblk -nd | grep -v "rom\|loop\|nvme\|G" | awk '{print $1}'`
Checked_Model=ST8000NM017B
Checked_List=`/opt/MegaRAID/storcli/storcli64 /c0 show | grep -i $Checked_Model | awk '{print $2}'`
SE_NUM=`/opt/MegaRAID/storcli/storcli64 /c0 show | grep "PD LIST" -A 100 | grep ST8 | wc -l`
To_Checked_List=`/opt/MegaRAID/storcli/storcli64 /c0 show | grep -i -e $Checked_Model -e "HGST" | awk '{print $2}'`
function allfio(){
        for n in $name;do
                touch Log/$sn/fiolog/$n.txt
                        fio --filename=/dev/$n --direct=1 --rw=read --group_reporting --ioengine=libaio --bs=1M --iodepth=32 --name=mytest --runtime=30s  >> Log/$sn/fiolog/$n.txt &
        done
}


function getsmart(){
        for d in $To_Checked_List;do
                smartctl -a /dev/sda -d megaraid,$d >> Log/$sn/smartlog/$1.txt
        done
}


getsmart "before_fio"
sleep 30
allfio
sleep 30
getsmart "after_fio"
/opt/MegaRAID/storcli/storcli64 /call show alilog | grep -B 3 "Media Error" | egrep "Vendor|Media" | awk '/^Rev/{s=$NF}/^Media/{e1=$3;e2=$NF;if(e1!=0 || e2!=0)print s","e1","e2}' | tee -a Log/$sn/errorcheck.txt
errornum=`cat Log/$sn/errorcheck.txt | wc -l`
sleep 60
list=`ls Log/$sn/fiolog`
for d in $list;do
        lasttime=`stat -c %Y Log/$sn/fiolog/$d`
        time_diff=$(( lasttime - currentimes ))
        hours=$(expr $time_diff / 3600)
        echo "$d $hours $time_diff" | tee -a Log/$sn/fiotime.txt
done
sleep 10
if [[ $SE_NUM -gt 0 ]];then
        mv Log/$sn Log/st-$sn


        norisky_flag=1
        sh fiocheck/HDDSmartDiag_for_CmccSeagate.sh
        sleep 20s

        flag=`cat Log/st-$sn/CheckResult-$sn.txt | grep -i "norisky"`
        if [ -z "$flag" ];then
                :
        else
                norisky_flag=0
        fi
	if [[ $errornum -gt 0 ]];then
                norisky_flag=1
        fi


        if [[ $norisky_flag -gt 0 ]];then
                mv Log/st-$sn Log/risky-st-$sn
                cd Log
                tar -czvf risky-st-$sn.tar.gz risky-st-$sn
                rm -rf risky-st-$sn
        else
                cd Log
                tar -czvf st-$sn.tar.gz st-$sn
                rm -rf st-$sn
        fi

else
        norisky_f=0
        if [[ $errornum -gt 0 ]];then
                norisky_f=1
        fi
        if [[ $norisky -gt 0 ]];then
                mv Log/$sn Log/risky-wd-$sn
                cd Log
                tar -czvf risky-wd-$sn.tar.gz risky-wd-$sn
                rm -rf risky-wd-$sn
        else
                cd Log
                tar -czvf $sn.tar.gz $sn
                rm -rf $sn
        fi

fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值