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

有没有办法找出以太网接口的PCI总线编号,反之亦然。 我正在寻找一个Bash / Python脚本,它提供了一些类似的东西

pci_address = some_function(eth0)

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

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后 ,可以使用Predictable Interface Naming查看接口名称以查找PCI信息。

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 

它看起来你可以通过IRQ将它们绑在一起。

 ifconfig -a 

将打印包括中断在内的以太网设备。

例如。

 eth2 Link encap:Ethernet HWaddr 00:25:11:19:8b:77 inet addr:192.168.1.3 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::225:11ff:fe19:8b77/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:39958 errors:0 dropped:0 overruns:0 frame:0 TX packets:34512 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:21410099 (21.4 MB) TX bytes:4802798 (4.8 MB) Interrupt:43 Base address:0xa000 

 lspci -v 

通过IRQ提供PCI信息

例如。

 04:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8101E/RTL8102E PCI Express Fast Ethernet controller (rev 01) Subsystem: Acer Incorporated [ALI] Device 0245 Flags: bus master, fast devsel, latency 0, IRQ 43 I/O ports at e800 [size=256] Memory at febff000 (64-bit, non-prefetchable) [size=4K] Expansion ROM at febc0000 [disabled] [size=128K] Capabilities:  Kernel driver in use: r8169 Kernel modules: r8169 

因为我看到两者都是43,所以我可以推断eth204:00.0匹配

这些信息在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 

另一种解决方案,使用udevadm

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

{0..10} – 检查eth0eth10

因此,您可以使用此命令

 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