如何查找以太网接口的PCI地址?
有没有办法找出以太网接口的PCI总线编号,反之亦然。 我正在寻找一个Bash / Python脚本,它提供了一些类似的东西
pci_address = some_function(eth0)
其中pci_address是sys:bus:slot:function
。 这两个元素如何相互关联?
lshw
和lspci
都能够显示该信息。 正如您已经发现的那样,您可以使用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,所以我可以推断eth2
与04: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}
– 检查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