首页 > 其他分享 >Megacli 批量磁盘巡检

Megacli 批量磁盘巡检

时间:2024-09-12 09:51:56浏览次数:10  
标签:Count 巡检 Megacli value echo key Error 磁盘

情况基本介绍

原理:根据megacli -ldpdinfo -aALL -Nolog命令输出的Count错误计数来判断磁盘预错误信息,以实现故障提前处置,避免磁盘连续非预期离线,导致存储集群服务故障。

背景:

现网生产环境,不允许安装额外的软件。
smartctl版本较老且不允许升级,部分smart参数不能识别。
python版本2.7和熟悉的python3差别也挺大,所以选择用shell编写脚本。

步骤:

定义输出目标文件,和结果计数对象。
从host文件里读取server列表,并遍历执行megacli命令。
对megacli的输出进行格式化和计数,并在屏幕中反馈故障信息。

环境要求:

脚本执行主机需要有免密登录目标主机的权限。
目标主机需要有megacli工具,如果有storcli,可以对脚本的计数、匹配语句稍作修改,且storcli功能更强。

目前脚本的不足,和下一步的改进方向:

目前未统计故障硬盘数量,后续可根据磁盘ID等信息统计故障数量并输出。
未对故障信息进行转存记录。
未联动告警功能。

megacli命令过滤后的原始输出:

Virtual Drive: 0 (Target Id: 0)
RAID Level          : Primary-1, Secondary-0, RAID Level Qualifier-0
Size                : 446.625 GB
State               : Optimal
Enclosure Device ID: 8
Slot Number: 38
Device Id: 24
Media Error Count: 0
Other Error Count: 0
Predictive Failure Count: 0
Firmware state: Online, Spun Up
Drive Temperature :31C (87.80 F)
Enclosure Device ID: 8
Slot Number: 39
Device Id: 34
Media Error Count: 0
Other Error Count: 0
Predictive Failure Count: 0
Firmware state: Online, Spun Up
Drive Temperature :33C (91.40 F)

shell脚本内容:

#!/bin/bash
# 定义一个空数组failHost,用于存储执行失败的主机
failHost=()

# 判断当前目录下是否有名为“年月日-时分秒-OsdDiskCheck.csv”的文件,如果没有,就新建一个:
ResultFile="$(date +%Y%m%d-%H%M%S)-OsdDiskCheck.csv"
if [ ! -f "$ResultFile" ]; then
    touch "$ResultFile"
else
    echo "$ResultFile 巡检结果文件已存在,请检查是否需要删除!"
fi

# 读取主机列表文件内容到数组
mapfile -t hosts < "osdServerList.txt"
hostsLen="${#hosts[@]}"
hostsSuc=0

# 遍历数组中的每一行主机名
for line in "${hosts[@]}"; do
    echo "----------ssh $line----------"
    # 尝试在远端主机$line 上执行命令:
    if ! diskOutPut=`ssh $line 'megacli -ldpdinfo -aALL -Nolog | egrep -i "Virtual Drive|RAID Level|^Size|^State|Enclosure Device|Slot Number|Device Id|media error|other error|^Predictive|Firmware stat|Temperature"' && sleep 5`
    then
        echo "$line 巡检失败,请检查"
        failHost+=(" $line")
    else
    hostsSuc=$((hostsSuc+1))
    # 1. 分割outPut对象,:做为分隔符,之前的字符定义为key,之后的字符为value
    while IFS=: read -r key value; do
        key=`echo $key | awk -F'  ' '{print $1}'`
        value="${value#"${value%%[![:space:]]*}"}"
        # 对命令输出里的Count(错误计数)进行信息组合,加上raid ID和eid、sid
        if [[ $key =~ "Virtual Drive" ]]; then
            keyVirt="RaidID_`echo $value|awk '{print $1}'`"
        elif [[ $key =~ "Enclosure Device ID" ]]; then
            keyEID="E_$value"
        elif [[ $key =~ "Slot Number" ]]; then
            keySID="S_$value"
        elif [[ $key =~ "Count" ]]; then
            key="Host: $line, $keyVirt, $keyEID~$keySID, $key"
            # 如果value不为0,就输出:“发现错误:$key---$value”
            if [[ $value != 0 ]]; then
                echo "发现磁盘错误:$key---$value"
                if [[ $key =~ "Firmware state" ]] && [[ $value =~ "Online" ]]; then
                    echo "该告警磁盘仍然在线,请密切关注,确认是否手动踢盘!"
                else
                    echo "该告警磁盘已处于故障状态!"
                fi
            fi
        else
            key="$key"
        fi
        echo "$key---$value" >> "$ResultFile"
    done <<<"$diskOutPut"
    fi
done

# 判断failHost数组是否为空,如果为空,就打印“所有主机巡检执行成功”,否则打印出“执行失败的主机:${failHost[@]}”:
echo "主机列表共 $hostsLen 台主机,巡检执行成功 $hostsSuc 台!"
if [ ${#failHost[@]} -ne 0 ]; then
    echo "执行失败的主机有:${failHost[@]}。"
fi

执行输出:

……
----------ssh z***3----------
Warning: Permanently added 'z***3' (ECDSA) to the list of known hosts.
发现磁盘错误:Host: z***3, RaidID_1, E_8~S_0, Other Error Count---6
该告警磁盘已处于故障状态!
发现磁盘错误:Host: z***3, RaidID_6, E_8~S_5, Other Error Count---3
该告警磁盘已处于故障状态!
发现磁盘错误:Host: z***3, RaidID_9, E_8~S_8, Other Error Count---7
该告警磁盘已处于故障状态!
----------ssh z***4----------
Warning: Permanently added 'z***4' (ECDSA) to the list of known hosts.
----------ssh z***7----------
Warning: Permanently added 'z***7' (ECDSA) to the list of known hosts.
发现磁盘错误:Host: z***7, RaidID_2, E_8~S_2, Media Error Count---20
该告警磁盘已处于故障状态!
主机列表共 15 台主机,巡检执行成功 15 台!

标签:Count,巡检,Megacli,value,echo,key,Error,磁盘
From: https://www.cnblogs.com/feifei6779/p/18409597

相关文章

  • linux 操作系统下的用户磁盘配额场景介绍
    linux操作系统下的用户磁盘配额场景介绍安装部署qutoaroot@meng:~#aptinstallquotaReadingpackagelists...DoneBuildingdependencytree...DoneReadingstateinformation...DoneSuggestedpackages:libnet-ldap-perlrpcbinddefault-mta|mail-transport-a......
  • MySQL学习笔记(二)InnoDB内存模型与磁盘同步机制
    InnoDB存储引擎ACID是我们在数据库设计的时候,尽可能的去满足的设计原则。A原子性、C一致性I隔离性D持久性,其中InnoDB存储引擎就是满足了我们ACID设计原则的。内存缓存结构(BufferPool)如果每次获取数据都去磁盘获取,这样效率明显比较慢。所以innoDB为了性......
  • x-cmd pkg | duf - `df` 命令的现代化替代品, 用于查看磁盘空间使用情况和磁盘文件系统
    目录简介用户首次快速实验指南技术特点竞品和相关项目进一步探索简介Duf(DiskUsage/FreeUtility)是一个磁盘分析工具。其直观的输出和多样化的自定义选项,帮助用户更好地管理和优化存储资源。用户首次快速实验指南对于首次使用Duf的用户,可以参考下面的链接,快速......
  • 挂载已有数据的LVM磁盘
    客户的centos虚拟机无法进入系统,但里面的数据很重要,所以新建一个centos虚拟机来挂载故障虚拟机的lvm磁盘1.新建虚拟机后先开机进系统,然后再挂载旧磁盘2.用fdisk-l查看磁盘情况,能识别到旧磁盘sdb[root@localhost~]#fdisk-lDisk/dev/sda:536.9GB,536870912000bytes,......
  • C语言中的磁盘映射与共享内存详解
    文章目录C语言中的磁盘映射与共享内存1.磁盘映射(MemoryMapping)1.1磁盘映射的深入概念1.2`mmap`函数的详细参数解析1.3磁盘映射的高级应用场景1.3.1大文件处理1.3.2内存共享1.3.3文件与内存同步1.3.4内存映射数据库1.4完整的磁盘映射代码示例1.5注意事项2.......
  • 磁盘映射(C语言)
            目录一、背景介绍二、磁盘映射技术概述  1.磁盘映射原理  2.磁盘映射的优势三、C语言实现磁盘映射        磁盘映射技术在C语言中的应用能够极大地提高文件操作的效率。本文将详细介绍磁盘映射的概念、如何在C语言中实现磁盘映射,并通过......
  • 如何查看服务器的磁盘存储容量?
    查看服务器的磁盘存储容量可以通过多种命令行工具来完成,以下是几种常见的方法,适用于大多数基于Linux和Unix的服务器:1.df命令df命令用于显示文件系统的磁盘空间使用情况。显示所有挂载点的磁盘使用情况:df-h这里-h选项表示以可读的格式(例如MB和GB)显示大小。显示特定文件系统的......
  • linux中磁盘大小和文件系统大小
    在Linux系统中,磁盘大小和文件系统大小是两个不同的概念,它们之间存在明显的区别。以下是对这两个概念的详细解析:磁盘大小定义:磁盘大小指的是物理存储设备的总容量,即硬盘或固态硬盘(SSD)等存储介质上能够存储数据的总空间。这个大小是固定的,由磁盘的制造工艺和规格决定。特点:固......
  • 磁盘调度算法
    磁盘调度算法先来先服务FCFS根据进程请求访问磁盘的先后顺序进行调度。最短寻道时间优先SSTF其要求访问的磁道与当前磁头所在的磁道距离最近。电梯调度算法SCAN首先自里向外访问,下一个对象是其欲访问的磁道既在当前磁道之外,又是距离最近的;直至无更外的磁道需要访问时,才......
  • linux磁盘分区和开机自动挂
    备份一下万一设置错误  开机都打不开分区位置都要三思不要输入错了df-h看看设备硬盘分区显示lsblk看看硬盘fdisk/dev/vdb输入 m 获取帮助,p 查看分区表当前分区里面没有任何信息,继续操作,输入 n 创建一个新的分区选择默认 p 选择主分区  e 扩展分区......