Як знайти PCI адресу інтерфейсу Ethernet?


11

чи є спосіб дізнатися номер шини PCI інтерфейсу Ethernet або навпаки. Я хочу написати сценарій Bash / Python, який дає щось подібне

pci_address = some_function(eth0)

де pci_address sys:bus:slot:function. Як ці два елементи можуть бути пов’язані між собою?


Пробували 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 можна було б використовувати передбачуване ім'я інтерфейсу, щоб просто подивитися на ім'я інтерфейсу, щоб дізнатися інформацію про 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, де немає пристрою symlink
Сем Ліддікотт

1
Можливо, тому, що паравіртуалізований мережевий пристрій VMware не базується на Ethernet?
Володимир Пантелеев

Дякую. Ви здебільшого праві, я незабаром виявив, але не зміг знайти коментар, щоб його видалити. Сталося те, що пристрій було повторно пов'язане з igb_uio для DPDK, і тому оригінальні вузли пристрою більше не були доступні.
Сем Ліддікотт

3

Здається, ви можете зв'язати їх між собою IRQ.

ifconfig -a 

буде друкувати пристрої Ethernet, включаючи Interrupt.

напр.

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


Дякую за добру відповідь. lshw запропонував мені краще рішення :)
Waqas

0

Ще одне рішення, використовуючи udevadm

udevadm info -a -p /sys/class/net/eth{0..10} | awk '/device.*eth/'

{0..10}- перевіряє інтерфейси від eth0eth10

Тому ви можете використовувати цю команду

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
Сергій Колодяжний

@Serg мені потрібне було інше рішення;)
AB

Підхід @AB lshwі вище дає мені два різні результати. Не повинні обидва надати однакову адресу ПКІ? ура
Waqas

@Waqas Я не розумію.
AB
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.