smartctl&megaraid:如何为适配器find正确的设备节点#

我可以使用以下命令列出所有megaraid适配器上的物理驱动器:

megacli -PDList -aALL 

这将显示每个适配器的适配器号,然后列出附加到它们的物理驱动器。

PDList输出中的各个设备也具有用于例如设备ID为3的smartctl命令的设备ID:

 smartctl -a -d sat+megaraid,3 /dev/sda 

这两个命令使用相同的设备ID,所以没有问题。 但是,我们如何正确地将适配器映射到设备节点呢?

在CentOS 6上运行smartmontools-5.43-1.el6。看看源代码,它似乎需要从命名设备节点上的ioctl SG_GET_SCSI_IDSCSI_IOCTL_GET_BUS_NUMBER获得的总线号/ host_no。 这与MegaCLI输出中的“适配器#”相同吗?

其实在我的情况下,我可能会硬编码到/ dev / sda,但我想知道是否有更好的方法。

这是我以前做过的。 可能有更好的方法。

从MegaCLI获取适配器的PCI总线ID:

 /opt/MegaRAID/MegaCli/MegaCli64 -adpgetpciinfo -a0 | grep Bus Bus Number : 2 

在这种情况下,BUS = 2。 然后通过PCI表查找该BUS上的设备,并查找“hostX”条目:

 ls /sys/bus/pci/devices/0000\:0${BUS}\:00.0/ | grep host host0 

所以,HOST = host0。
现在查找该主机目录中的目标

 ls /sys/bus/pci/devices/0000\:0${BUS}\:00.0/${HOST}/ | grep target target0:2:0 

我们的SCSI目标ID是0:2:0(主机0:通道2:目标0)。

将SCSI目标与lsscsi的输出进行匹配

 # lsscsi [0:2:0:0] disk LSI MR9271-8i 3.24 /dev/sda [1:2:0:0] disk LSI MR9271-8i 3.24 /dev/sdb [2:0:0:0] disk ATA INTEL SSDSC2BA80 5DV1 /dev/sdc 

MegaCLI适配器a0对应于/ dev / sda(在这种情况下,0:2:0是〜= 0:2:0:0,最后的0是LUN ID)

如果我遵循相同的方法适配器a1我得到一个总线号3,host1,目标值1:2:0,映射到/ dev / sdb。

节点可以这样find:

 # megacli -pdlist -a0| grep 'Device Id' Device Id: 11 Device Id: 12 # smartctl -a -d megaraid,11 /dev/sda