How to find PCI address of an ethernet interface?
Solution 1
lshw
and lspci
are both capable of showing that information. As you have found out already, you can do lshw -class network -businfo
. For instance, here's my output:
$ 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
What you also could use is lspci -D
and pipe it to grep
to filter out the ethernet controller specifically. Here's my example:
$ 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)
Note that with the transition to systemd, one could use of Predictable Interface Naming to just look at the interface name to find out PCI information.
Solution 2
This information is available in sysfs, no helpers like lshw
/ lspci
/ ethtool
/ udevadm
are needed:
$ 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
Solution 3
ethtool will also show you pci for an interface (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
Solution 4
It looks you can tie them together by the IRQ.
ifconfig -a
will print the ethernet devices including Interrupt.
eg.
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
while
lspci -v
gives the PCI info with IRQ
eg.
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
since I see both are 43 I can infer that eth2
matches 04:00.0
Waqas
Updated on September 18, 2022Comments
-
Waqas almost 2 years
is there a way to find out the PCI bus number of an Ethernet interface or vice versa. I am looking to write a Bash/Python script which gives some thing like
pci_address = some_function(eth0)
where pci_address is
sys:bus:slot:function
. How can these two elements be related to each other?-
Sergiy Kolodyazhnyy almost 9 yearsTried
lspci
orlshw
? -
Waqas almost 9 yearsI had used
lspci
but didn't triedlshw
. Following command worked for melshw -class network -businfo
. Thanks @Serg -
Sergiy Kolodyazhnyy almost 9 yearsGlad I could help. I'll post this as an answer, then
-
-
Waqas almost 9 yearsThanks for your kind response. lshw provided me a better solution :)
-
Sergiy Kolodyazhnyy almost 9 yearsNeat program,
udevadm
! learned something new. +1 -
A.B. almost 9 years@Serg I needed a different solution ;)
-
Waqas almost 9 years@A.B.
lshw
and above approach are giving me two different results. Shouldn't both provide same pci address? cheers -
A.B. almost 9 years@Waqas I don't understand.
-
Sam Liddicott over 6 yearsNot under vmware where there is no device symlink
-
Vladimir Panteleev over 6 yearsMaybe because VMware's paravirtualized network device is not based on Ethernet?
-
Sam Liddicott over 6 yearsThanks. You are mostly right I soon discovered, but I couldn't find my comment to remove it. What had happened was the device was re-bound to igb_uio for DPDK, and so the original device nodes were no longer available.
-
SomeWittyUsername almost 5 yearsThe
lspci
doesn't provide the device name so in case of 2 identical devices it's not possible to distinguish which pci address and device name match -
eichin over 3 yearsEven more directly,
$ ls -l /sys/class/net/eth0/device
lrwxrwxrwx 1 root root 0 Nov 16 16:30 /sys/class/net/eth0/device -> ../../../0000:07:00.0
thoughdevice/uevent
has a bunch of other useful stuff you might also need. -
Hi-Angel over 2 years
lshw
works though, so still ⁺¹. But I agree, the information aboutlspci
can probably be removed from the answer, it doesn't work for reasons mentioned in prev. comment.