从/dev/sdX设备文件可靠、自动地确定HDD物理位置的连接路径

从/dev/sdX设备文件可靠、自动地确定HDD物理位置的连接路径

这有点像常见问题解答,但到目前为止我找到的所有答案都不适合完全自动化,而这正是我所需要的。所以这里再说一遍。

在 Linux 中:

是否有一种可靠的方法将 HDD 的 udev 设备名称(例如“/dev/sdg”)解析为其数据路径,以识别该设备所连接的物理真实电缆(例如“PCIe 插槽 2 中的控制器、SAS 通道 0、复制器端口 3”?

我运行的服务器在热插拔背板上装有十几个 SATA 磁盘。这些磁盘使用 dmraid (Linux) 组装成软件 Raid6。出于超出此问题范围的原因,我希望并且需要运行软件 raid,而不是通过专用控制器运行硬件 raid。

软件 RAID 的缺点之一是,当阵列中的驱动器发生故障时,驱动器托架上的故障 LED 不会亮起,因为机箱无法轮询 mdadm 以获取驱动器状态。您必须手动找到故障驱动器的位置。

我知道您只需发出一个dd if=/dev/sdg of=/dev/null并查看哪个活动 LED 亮起,但我在这里追求的是漂亮的解决方案。

为了解决这个问题,我拼凑了一个小型 PCB,它可以通过 i2c 与背板通信来打开/关闭托架的故障 LED,并且我有一个小脚本,可以通过 RS232 与该电路板通信。

mdadm 可以在发生故障事件时运行命令,因此我可以告诉 mdadm 运行我的脚本并在驱动器从阵列中掉线时打开 LED。唯一的问题是:

mdadm 告诉我“驱动器 /dev/sdg1 出现故障”.但我需要的是“控制器 1、通道 2、端口 3 上的驱动器发生故障”,这样我就能识别要打开哪个 LED。

是否有人知道一种可靠的方法可以将像 /dev/sdg 这样的设备名称解析回路径?

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

ls -lah /dev/disk/by-path | grep /dev/sdX我的第一个想法是针对适当的目标名称进行操作,但是这被证明是不可靠的,因为当前安装的磁盘中甚至没有一半出现在该目录中。

仅仅说“您的第一个控制器将具有 sda-​​sdh,您的第二个控制器将具有 sdi-p”也是不可靠的,因为在启动时存在竞争条件,有时一个控制器先初始化,有时另一个控制器先初始化。无论哪个控制器先初始化,都会获得 /dev/sda... 此外,在热插拔后或并非所有托架都已填充时,事情会变得复杂。

lshw -short -c disk似乎生成了与我所寻找的类似的输出,但我无法将那里显示的路径编号链接到物理电缆。这些分配是否稳定?确切的模式是什么?(即使并非所有驱动器托架都已填充,scsi 路径中的编号也是连续的,这让我认为这些 scsi 路径节点是动态分配的,并不直接代表控制器上的物理端口)

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

答案1

正如前面的评论所提到的,请查看 /sys/block/sdX。如果您 cd 到其中一个目录,然后执行 ls -l,您将看到设备的符号链接,它应该指向设备的路径。例如,在我的系统上,我看到 /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/

这为我提供了支持块设备的设备的准确路径,从 PCI 路径到主机控制器再到 LUN。根据您拥有的设备类型,这可能看起来略有不同 - 例如,我的是光纤通道控制器,因此它有 rport 部分。

相关内容