从/ dev / sdX设备文件可靠,自动地确定硬盘物理位置的连接path

这是一个常见问题,但我迄今发现的所有答案都不适合完全自动化,这是我所需要的。 所以在这里再次。

在Linux中:

是否有一种可靠的方法来parsing硬盘的udev设备名称(例如“/ dev / sdg”)到其数据path中,以识别设备连接的物理真实电缆(EG“PCIe-Slot2,SAS通道0,复制器端口3“?

我在热插拔背板上运行了十几个SATA磁盘的服务器。 使用dmraid(Linux)将磁盘组装成软件Raid6。 由于这个问题的范围以外的原因,我想和需要运行软件RAID,而不是通过专用控制器硬件突袭。

软件RAID的缺点之一是当驱动器arrays中的驱动器发生故障时,驱动器托架上的故障指示灯不亮,因为该驱动器无法轮询mdadm以查找驱动器状态。 您必须手动find故障驱动器的位置。

我知道你可以只发出一个dd if=/dev/sdg of=/dev/null ,看看哪个活动指示灯亮了,但是我正在瞄准这个漂亮的解决scheme。

为了解决这个问题,我一起砍了一块PCB,通过i2c与背板对话,打开/closures托架的故障指示灯,我有一个脚本通过RS232与这块主板通信。

当发生故障事件时,mdadm可以运行命令,所以我可以告诉mdadm运行我的脚本,并在驱动器掉出arrays时打开LED。 唯一的问题是:

mdadm告诉我“驱动器/ dev / sdg1失败” 。 但是我需要的是“驱动控制器1,通道2,端口3失败” ,所以我可以识别哪个LED打开。

有没有人知道一个可靠的方式来解决设备名称像/ dev / sdg回到path?

我知道hdparm -I /dev/sdX将给我的驱动器的序列号和供应商,所以我可以通过查看标签手动识别磁盘,但重点是自动执行此操作。 可靠地识别所涉及的控制器/端口就足够了,因为在使用背板时布线通常不会改变,并且我知道什么控制器端口服务于什么驱动器托架。

我的第一个想法是做ls -lah /dev/disk/by-path | grep /dev/sdX ls -lah /dev/disk/by-path | grep /dev/sdX作为适当的目标名称,但是这certificate是不可靠的,因为目前安装的磁盘一半都没有出现在该目录中。

只是说“你的第一个控制器将有sda-sdh,你的第二个控制器将有sdi-p”也是不可靠的,因为在启动时有一个竞争状态,有时一个控制器被初始化,有时是另一个。 无论哪一个首先被初始化得到/ dev / sda …另外事情变得复杂在一个热的交换或者如果不是所有海湾被填充。

lshw -short -c disk似乎产生类似于我正在查找的输出,但是我无法将显示在那里的path编号链接到物理电缆。 这些任务是否稳定? 什么是确切的模式? (尽pipe不是所有的驱动器托架都被填充,但是scsipath中的编号是连续的,这导致我认为这些scsipath节点是dynamic分配的,并且不直接表示控制器上的物理端口)

有谁知道一个Linux命令,需要一个/ dev / sdX作为参数,并可靠地输出相关的PCIe插槽和控制器端口?

正如前面提到的注释,请查看/ sys / block / sdX。 如果你cd到这些目录中的一个,然后执行ls -l,你会看到设备的符号链接,它应该指向设备的path。 例如,在我的系统上,我看到/ sys / block / sdz中的设备链接如下:
device -> ../../devices/pci0000:00/0000:00:09.0/0000:08:00.0/host3/rport-3:0-5/target3:0:5/3:0:5:1/

这为我提供了支持块设备的设备的确切path,从PCIpath到主机控制器到LUN。 这可能看起来有点不同,具体取决于您的设备types – 例如,mine是光纤通道控制器,因此它是rport部分。