当收到一条磁盘告警时,我们应该怎么快速定位磁盘插槽和分区?这时可以使用MegaCli工具,具体使用方式参考《“五分钟学命令系列”之三十四《MegaCli命令》》。
0x01 背景
机器上有两块硬盘,当设备ID为16的磁盘状态为faild时
0x02 查询故障盘对应的插槽
通过MegaCli命令查询出磁盘的Enclosure Device ID,Raw Size,Slot Number,Device Id,Firmware state,DiskGroup
$ /opt/MegaRAID/MegaCli/MegaCli64 -LdPdInfo -aALL |egrep 'Enclosure Device ID|Raw Size|Slot Number|Device Id|Firmware state|DiskGroup' | awk 'BEGIN{FS="\n";ORS=" ; "} {if($0~"Enclosure Device ID"&&NR>1){print "\n"$0} else {print $0}}' |awk '{print}' | sed -r 's/\[.*\]//;s/\s+/ /g' | sed -r 's/ Span: 0,/ /g' Enclosure Device ID: 252 ; Slot Number: 0 ; Drive's position: DiskGroup: 0, Arm: 0 ; Device Id: 17; Raw Size: 447.130 GB ; Firmware state: Online, Spun Up ; Enclosure Device ID: 252 ; Slot Number: 1 ; Drive's position: DiskGroup: 1, Arm: 0 ; Device Id: 16 ; Raw Size: 931.512 GB ; Firmware state: Faild ;
通过上述命令可以得出设备ID为16的故障磁盘位于插槽1(Slot Number: 1)
0x03 查询故障盘对应的分区
通过udevadm查询出分区的真实路径
$ udevadm info -q path -n /dev/sda /devices/pci0000:00/0000:00:02.0/0000:03:00.0/host0/target0:2:0/0:2:0:0/block/sda $ udevadm info -q path -n /dev/sdb /devices/pci0000:00/0000:00:02.0/0000:03:00.0/host0/target0:2:1/0:2:1:0/block/sdb
通过上述命令可以得到两个数据,0:2:0:0和0:2:1:0。这两个数据的第三位和第二步得到的Drive's position: DiskGroup做匹配得到,DiskGroup: 0对应0:2:0:0,DiskGroup: 1对应0:2:1:0
最后,我们得出结果Device ID为16的故障盘对应的插槽为1,对应的分区为sdb
PS:转发一个脚本,直接复制到机器运行,可以得到硬盘的所有信息,以表格的方式打印出来,简单明了。《megaclisas-status》

聂扬帆博客
一个分享IT运维相关工作经验和实战技巧的个人博客
2018年4月20日 上午9:56 沙发
不错,默默收藏起来
2018年5月7日 下午8:57 板凳
期待楼主的更新
2021年1月15日 下午4:55 地板
个人操作了下,感觉“DiskGroup: 0对应0:2:0:0”这个有点问题,可能是楼主测试机器盘数太少形成的巧合。MegaCli -CfgDsply -aALL 显示的VD信息 Virtual Drive: xx (Target Id: xx) 应该对应第三位数字。PD-DG-VD,操作系统能看到的设备层面就是VD
2021年1月19日 下午1:58 1层
@fastbiubiubiu 感谢指正,我这边测试的大部分是DELL机型,不能代表全部