如何找到以太网接口的 PCI 地址?

如何找到以太网接口的 PCI 地址?

有没有办法找出以太网接口的 PCI 总线号,反之亦然。我想写一个 Bash/Python 脚本,它能给出类似

pci_address = some_function(eth0)

其中 pci_address 是sys:bus:slot:function。这两个元素如何相互关联?

答案1

lshwlspci都能够显示该信息。正如您已经发现的那样,您可以执行lshw -class network -businfo。例如,这是我的输出:

$ sudo lshw -c network -businfo                                                                                                                    
Bus info          Device      Class       Description
=====================================================
pci@0000:0e:00.0  wlan0       network     RTL8187SE Wireless LAN Controller
pci@0000:14:00.0  eth0        network     RTL8101E/RTL8102E PCI Express Fast Ethernet controller

您还可以使用lspci -D管道将其grep过滤掉以太网控制器。这是我的示例:

$ lspci -D | grep 'Network\|Ethernet'                                                                                                              
    0000:0e:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8187SE Wireless LAN Controller (rev 22)
    0000:14:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8101E/RTL8102E PCI Express Fast Ethernet controller (rev 02)

请注意,随着过渡到systemd,可以使用可预测的接口命名只需查看接口名称即可了解 PCI 信息。

答案2

此信息在 sysfs 中可用,不需要像lshw/ lspci/ ethtool/这样的帮助程序udevadm

$ grep PCI_SLOT_NAME /sys/class/net/*/device/uevent
/sys/class/net/enp4s0/device/uevent:PCI_SLOT_NAME=0000:04:00.0
/sys/class/net/wlp2s0/device/uevent:PCI_SLOT_NAME=0000:02:00.0

答案3

ethtool 还将显示接口的 pci(bus-info:)

me@ubuntu:~$ ethtool -i eth0
driver: i40e
version: 1.5.16
firmware-version: 5.04 0x800024cd 0.0.0
bus-info: 0000:06:00.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes

答案4

另一种解决方案是使用udevadm

udevadm info -a -p /sys/class/net/eth{0..10} | awk '/device.*eth/'

{0..10}eth0– 检查来自…的接口eth10

因此你可以使用此命令

pci_address=$(udevadm info -a -p /sys/class/net/eth{0..10} | awk -F/ '/device.*eth/ {print $4}')

示例输出

looking at device '/devices/pci0000:00/0000:00:03.0/net/eth0':

因此地址是

0000:00:03.0

或者你的情况用一个命令

% pci_address=$(udevadm info -a -p /sys/class/net/eth{0..10} | awk -F/ '/device.*eth/ {print $4}')
% echo $pci_address
0000:00:03.0

或者在脚本中

#!/bin/bash
udevadm info -a -p /sys/class/net/"$1" | awk -F/ '/device.*eth/ {print $4}'

使用以下命令调用脚本

script_name eth0

输出为

0000:00:03.0

相关内容