Как найти PCI-адрес интерфейса Ethernet?

11

Есть ли способ узнать номер шины PCI интерфейса Ethernet или наоборот. Я ищу написать сценарий Bash / Python, который дает что-то вроде

pci_address = some_function(eth0)

где адрес pci_address sys:bus:slot:function. Как эти два элемента могут быть связаны друг с другом?

Waqas
источник
Пробовал lspciили lshw?
Сергей Колодяжный
Я использовал, lspciно не пытался lshw. Следующая команда работала для меня lshw -class network -businfo. Благодаря @Serg
Waqas
Рад, что смог помочь. Я выложу это как ответ, тогда
Сергей Колодяжный,

Ответы:

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для специальной фильтрации контроллера Ethernet. Вот мой пример:

$ 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.

Сергей Колодяжный
источник
Он lspciне предоставляет имя устройства, поэтому в случае двух идентичных устройств невозможно различить, какой адрес 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
riotejas
источник
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, где нет символьной ссылки на устройство
Сэм Лиддикотт
1
Может быть, потому что паравиртуализированное сетевое устройство VMware не основано на Ethernet?
Владимир Пантелеев
Спасибо. В основном вы правы, я скоро обнаружил, но я не смог найти свой комментарий, чтобы удалить его. Произошло то, что устройство было повторно привязано к igb_uio для DPDK, поэтому исходные узлы устройства больше не были доступны.
Сэм Лиддикотт
3

Похоже, вы можете связать их вместе с помощью IRQ.

ifconfig -a 

будет печатать устройства Ethernet, включая прерывание.

например.

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

дает информацию о PCI с IRQ

например.

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

WillShackleford
источник
Спасибо за ваш добрый ответ. 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
AB
источник
Аккуратная программа udevadm,! узнал что-то новое. +1
Сергей Колодяжный
@ Серг Мне нужно другое решение;)
AB
@AB lshwи выше подход дают мне два разных результата. Не должны ли оба предоставить один и тот же адрес pci? ура
Waqas
@ Вакас, я не понимаю.
AB