smartctl 和 megaraid:如何为适配器找到正确的设备节点 #

lmz*_*lmz 6 smart megaraid smartctl megacli

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

megacli -PDList -aALL 
Run Code Online (Sandbox Code Playgroud)

这将为每个适配器显示一个适配器 #,然后列出连接到它们的物理驱动器。

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

smartctl -a -d sat+megaraid,3 /dev/sda
Run Code Online (Sandbox Code Playgroud)

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

在 CentOS 6 上运行 smartmontools-5.43-1.el6。查看源代码似乎需要从 ioctlSG_GET_SCSI_IDSCSI_IOCTL_GET_BUS_NUMBER在命名设备节点上获取的总线编号 / host_no 。这是否与 MegaCLI 输出中使用的“适配器编号”相同?

实际上,就我而言,我可能可以将其硬编码到 /dev/sda,但我想知道是否有更好的方法。

小智 8

运行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
Run Code Online (Sandbox Code Playgroud)

另一个输出:

# 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
Run Code Online (Sandbox Code Playgroud)

这里,megaraid是 RAID 类型,5,7是设备 ID


Dan*_*son 5

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

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

/opt/MegaRAID/MegaCli/MegaCli64 -adpgetpciinfo -a0 | grep Bus
Bus Number      : 2
Run Code Online (Sandbox Code Playgroud)

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

ls /sys/bus/pci/devices/0000\:0${BUS}\:00.0/ | grep host
host0
Run Code Online (Sandbox Code Playgroud)

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

ls /sys/bus/pci/devices/0000\:0${BUS}\:00.0/${HOST}/ | grep target
target0:2:0
Run Code Online (Sandbox Code Playgroud)

我们的 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
Run Code Online (Sandbox Code Playgroud)

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

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