在 Linux 中,有没有办法找出哪个 PCI 卡插入哪个 PCI 插槽?
/sys/bus/pci/devices/ 包含许多不是卡的设备(网桥、CPU 通道等),我无法在设备目录中找到有关插槽卡映射的任何信息。
你可以使用
dmidecode –t slot
找到所有可用的 pci 插槽 比你能跑
lspci -s <slot number>
命令列出连接到指定插槽的设备。您必须从第一个命令中获取总线地址,并将此地址用作第二个命令中的参数。
Nebojsa 的回答很好,但这里有更多信息和对 magmabyte 评论的回答。
dmidecode
给你插槽的数量,但是,这些插槽并不是唯一使用 PCI 桥的东西,这就是为什么你看到的设备比插槽多得多。
其次,您可能会看到每个插槽有多个“设备”,但它们很可能只是同一张卡上的多个端口。举个使用网络接口卡 (NIC) 的例子:
megaman@someserver $ lspci | grep 10Gb
07:00.0 Ethernet controller: Emulex Corporation OneConnect 10Gb NIC (rev 02)
07:00.1 Ethernet controller: Emulex Corporation OneConnect 10Gb NIC (rev 02)
dmidecode
表示该服务器具有三个插槽(确实如此)。插槽 1 有上面的 10Gb 网卡(你可以看到它有 2 个端口),插槽 2 有一个光纤通道卡(也恰好有 2 个端口),最后插槽 3 是空的。
服务器中有三个物理插槽,一个是空的,两个是多端口卡(一个HBA和一个NIC)。
要在评论中回答您的问题,您拥有的 3 个插槽是由
dmidecode
指示的,它们可能装有多端口接口卡。
在我的 kickstart 中,我使用以下内容来确定用于操作系统的 NIC。例如,我们的某些服务器使用 HPE 562SFP+ 2 端口 10Gb NIC。它将是:
NICPROD=562
USENIC=''
for NIC in /sys/class/net/e*; do
NIC=$(basename ${NIC})
FOUNDNIC=$(lspci -s $(ethtool -i ${NIC} | awk '/bus-info/ { print $2 }' | cut -d: -f2-) -vv | grep -E 'Product Name:')
if [[ "${FOUNDNIC}" == *${NICPROD}* && "${FOUNDNIC}" != *"FLR"* ]]; then
USENIC=${NIC}
break
fi
done
希望这有帮助吗?