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


11

有没有一种方法可以找出以太网接口的PCI总线号,反之亦然。我正在寻找写一个Bash / Python脚本,它提供了一些类似的功能

pci_address = some_function(eth0)

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


试过lspci还是lshw
Sergiy Kolodyazhnyy 2015年

我曾经用过lspci但没有尝试过lshw。遵循命令对我有用lshw -class network -businfo。感谢@Serg
Waqas

很高兴我能帮上忙。我将其发布为答案,然后
Sergiy Kolodyazhnyy 2015年

Answers:


15

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之后,可以使用可预测接口命名来仅查看接口名称以找出PCI信息。


lspci不提供设备的名称,以便在2个相同的器件情况下,它无法区分哪个PCI地址和设备名称匹配
SomeWittyUsername

8

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

8

此信息在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

不在没有设备符号链接的vmware下
Sam Liddicott

1
也许是因为VMware的半虚拟化网络设备不基于以太网?
弗拉基米尔·潘捷列夫

谢谢。您很快就发现了,但您基本上是对的,但是找不到我要删除的评论。发生的事情是该设备已重新绑定到igb_uio for DPDK,因此原始设备节点不再可用。
山姆·利迪科特

3

看来您可以通过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: <access denied>
    Kernel driver in use: r8169
    Kernel modules: r8169

因为我看到的都是43,我可以推断eth2匹配04:00.0


多谢您的回覆。lshw为我提供了更好的解决方案:)
Waqas,

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

整洁的程序,udevadm!学到了新东西。+1
Sergiy Kolodyazhnyy 2015年

@ Serg我需要一个不同的解决方案;)
AB

@AB lshw和以上方法给我两个不同的结果。都不应该提供相同的pci地址吗?欢呼声
Waqas 2015年

@Waqas,我听不懂。
AB
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.