我可以使用以下命令列出所有 megaraid 适配器上的物理驱动器:
megacli -PDList -aALL
这将显示每个适配器的适配器号,然后列出连接到它们的物理驱动器。
PDList 输出中的各个设备也有一个设备 ID,用于 smartctl 命令,例如设备 ID 3:
smartctl -a -d sat+megaraid,3 /dev/sda
两个命令都使用相同的设备 ID,因此没有问题。但是我们如何才能正确地将适配器编号映射到设备节点?
在 CentOS 6 上运行 smartmontools-5.43-1.el6。查看源代码似乎需要从 ioctlSG_GET_SCSI_ID
或SCSI_IOCTL_GET_BUS_NUMBER
命名设备节点获取的总线号/host_no。这是与 MegaCLI 输出中的“适配器号”相同的数字吗?
实际上,就我而言,我可能可以通过将其硬编码到 /dev/sda 来解决,但我想知道是否有更好的方法。
答案1
这是我以前做过的方法。也许还有更好的方法。
从 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、主机 1 和目标值 1:2:0,它映射到 /dev/sdb。
答案2
运行smartctl --scan
以打印所有连接的设备,包括设备 ID 和 RAID 类型:
# smartctl --scan
/dev/sda -d scsi # /dev/sda, SCSI device
/dev/bus/0 -d megaraid,0 # /dev/bus/0 [megaraid_disk_00], SCSI device
/dev/bus/0 -d megaraid,1 # /dev/bus/0 [megaraid_disk_01], SCSI device
/dev/bus/0 -d megaraid,2 # /dev/bus/0 [megaraid_disk_02], SCSI device
另一个输出:
# smartctl --scan
/dev/sda -d scsi # /dev/sda, SCSI device
/dev/bus/0 -d megaraid,5 # /dev/bus/0 [megaraid_disk_05], SCSI device
/dev/bus/0 -d megaraid,7 # /dev/bus/0 [megaraid_disk_07], SCSI device
这里,megaraid
是 RAID 类型,5,7
是设备 ID
答案3
可以通过这种方式找到节点:
# megacli -pdlist -a0| grep 'Device Id'
Device Id: 11
Device Id: 12
# smartctl -a -d megaraid,11 /dev/sda