匹配 SATA 控制器的 PCI 地址和连接磁盘的 SCSI 地址

匹配 SATA 控制器的 PCI 地址和连接磁盘的 SCSI 地址

我有一个 PCI 连接的 SATA 控制器,连接到具有 Linux 2.6.39 内核的计算机上的(可变)数量的磁盘。我试图找到磁盘的物理位置,知道控制器的 PCI 地址。

在本例中,控制器位于地址 0000:01:00.0,并且有两个磁盘,SCSI 地址为 6:0.0.0.0 和 8:0.0.0(尽管最后两个不一定是固定的,但这正是它们的含义)就是现在)。

lshw -c storage显示控制器和 SCSI 设备(系统磁盘和控制器已修剪):

*-storage               
   description: SATA controller
   product: Marvell Technology Group Ltd.
   vendor: Marvell Technology Group Ltd.
   physical id: 0
   bus info: pci@0000:01:00.0
   version: 10
   width: 32 bits
   clock: 33MHz
   capabilities: storage pm msi pciexpress ahci_1.0 bus_master cap_list rom
   configuration: driver=ahci latency=0
   resources: irq:51 ioport:e050(size=8) ioport:e040(size=4) ioport:e030(size=8) ioport:e020(size=4) ioport:e000(size=32) memory:f7b10000-f7b107ff memory:f7b00000-f7b0ffff
*-scsi:1
   physical id: 2
   logical name: scsi6
   capabilities: emulated
*-scsi:2
   physical id: 3
   logical name: scsi8
   capabilities: emulated

lshw -c disk显示磁盘:

*-disk
   description: ATA Disk
   product: TOSHIBA THNSNF25
   vendor: Toshiba
   physical id: 0.0.0
   bus info: scsi@6:0.0.0
   logical name: /dev/sdb
   version: FSXA
   serial: 824S105DT15Y
   size: 238GiB (256GB)
   capabilities: gpt-1.00 partitioned partitioned:gpt
   configuration: ansiversion=5 guid=79a679b1-3c04-4306-a498-9a959e2df371 sectorsize=4096
*-disk
   description: ATA Disk
   product: TOSHIBA THNSNF25
   vendor: Toshiba
   physical id: 0.0.0
   bus info: scsi@8:0.0.0
   logical name: /dev/sdc
   version: FSXA
   serial: 824S1055T15Y
   size: 238GiB (256GB)
   capabilities: gpt-1.00 partitioned partitioned:gpt
   configuration: ansiversion=5 guid=79a679b1-3c04-4306-a498-9a959e2df371 sectorsize=4096

然而,似乎没有办法从 PCI 地址转到 SCSI 地址。我还查看了 PCI 和 SCSI 设备的 sysfs 条目,但没有找到建立连接的条目。当磁盘插入控制器上的不同物理端口时,SCSI 地址不一定会改变,因此不能与偏移一起使用来正确确定磁盘的位置。

按 ID 列出磁盘也不起作用 -ls -lah /dev/disks/by-path显示 的条目指向pci-0000:01:00.0-scsi-0:0:0:0/dev/sdc或者通常是最后连接的磁盘),并且没有其他路径开始,pci-0000:01:00.0而不仅仅是指向该驱动器分区的链接。

是否有其他方法可以将控制器地址映射到可用于定位磁盘的地址?

答案1

lshw -c disk我认为您可以通过交叉引用此命令的输出来获得您想要的结果udevadm info -q all -n <device>

例如

我的/dev/sda设备显示以下输出lshw

$ sudo lshw -c disk
  *-disk                  
       description: ATA Disk
       product: ST9500420AS
       vendor: Seagate
       physical id: 0
       bus info: scsi@0:0.0.0
       logical name: /dev/sda
       version: 0003
       serial: 5XA1A2CZ
       size: 465GiB (500GB)
       capabilities: partitioned partitioned:dos
       configuration: ansiversion=5 signature=ebc57757

如果我使用以下命令询问同一设备,udevadm我可以找出它是什么DEVPATH

$ sudo udevadm info -q all -n /dev/sda | grep DEVPATH
E: DEVPATH=/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda

该字符串包含您正在查找的有关该设备的所有信息。 PCI 地址"0000:00:1f.2"以及 SCSI 地址"0:0:0:0"。如果您用正斜杠(“/”)将该数据分开,则 SCSI 地址是第 6 个位置的数据。

答案2

您可以-q path直接使用:

SD=`ls /dev | grep -E "^sd[a-z]+$"`
for sd in $SD; do
   sys_path=`udevadm info -q path -p /sys/block/$sd 2>/dev/null`
   echo "$sd: $sys_path"
done

示例输出:

sda: /devices/pci0000:00/0000:00:01.0/0000:01:01.0/ata1/host0/target0:0:0/0:0:0:0/block/sda
sdaa: /devices/pci0000:04/0000:04:04.0/0000:06:01.0/ata29/host28/target28:0:0/28:0:0:0/block/sdaa
sdab: /devices/pci0000:04/0000:04:04.0/0000:06:01.0/ata31/host30/target30:0:0/30:0:0:0/block/sdab
sdac: /devices/pci0000:04/0000:04:04.0/0000:06:01.0/ata32/host31/target31:0:0/31:0:0:0/block/sdac
sdad: /devices/pci0000:04/0000:04:04.0/0000:06:01.0/ata33/host32/target32:0:0/32:0:0:0/block/sdad
sdae: /devices/pci0000:04/0000:04:04.0/0000:06:01.0/ata34/host33/target33:0:0/33:0:0:0/block/sdae
sdaf: /devices/pci0000:09/0000:09:07.0/0000:0a:01.0/ata35/host34/target34:0:0/34:0:0:0/block/sdaf

相关内容