有没有办法找出以太网接口的 PCI 总线号,反之亦然。我想写一个 Bash/Python 脚本,它能给出类似
pci_address = some_function(eth0)
其中 pci_address 是sys:bus:slot:function
。这两个元素如何相互关联?
答案1
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)
答案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