Wie finde ich die PCI-Adresse einer Ethernet-Schnittstelle?

10

Gibt es eine Möglichkeit, die PCI-Busnummer einer Ethernet-Schnittstelle herauszufinden oder umgekehrt? Ich möchte ein Bash / Python-Skript schreiben, das so etwas wie gibt

pci_address = some_function(eth0)

wo pci_address ist sys:bus:slot:function. Wie können diese beiden Elemente miteinander in Beziehung gesetzt werden?

Waqas
quelle
Versucht lspcioder lshw?
Sergiy Kolodyazhnyy
Ich hatte benutzt lspci, aber nicht versucht lshw. Der folgende Befehl hat bei mir funktioniert lshw -class network -businfo. Danke @Serg
Waqas
Froh, dass ich helfen konnte. Ich werde dies als Antwort
posten

Antworten:

14

lshwund lspcisind beide in der Lage, diese Informationen anzuzeigen. Wie Sie bereits herausgefunden haben, können Sie dies tun lshw -class network -businfo. Hier ist zum Beispiel meine Ausgabe:

$ 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

Sie können es auch verwenden lspci -Dund weiterleiten, grepum den Ethernet-Controller gezielt herauszufiltern. Hier ist mein Beispiel:

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

Beachten Sie, dass mit dem Übergang zu systemd , von verwenden könnte Vorhersehbare Schnittstelle Naming nur Blick auf die Schnittstellennamen PCI Informationen zu erfahren.

Sergiy Kolodyazhnyy
quelle
Das lspcigibt den Gerätenamen nicht an, so dass bei 2 identischen Geräten nicht unterschieden werden kann, welche PCI-Adresse und welcher Gerätename übereinstimmen
SomeWittyUsername
8

ethtool zeigt dir auch pci für eine Schnittstelle (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
quelle
8

Diese Informationen sind in sysfs verfügbar. Es werden keine Helfer wie lshw/ lspci/ ethtool/ udevadmbenötigt:

$ 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
Vladimir Panteleev
quelle
Nicht unter VMware, wo es keinen Gerätesymlink gibt
Sam Liddicott
1
Vielleicht, weil das paravirtualisierte Netzwerkgerät von VMware nicht auf Ethernet basiert?
Vladimir Panteleev
Vielen Dank. Sie haben größtenteils Recht, das habe ich bald entdeckt, aber ich konnte meinen Kommentar nicht finden, um ihn zu entfernen. Was passiert war, war, dass das Gerät für DPDK erneut an igb_uio gebunden wurde und daher die ursprünglichen Geräteknoten nicht mehr verfügbar waren.
Sam Liddicott
3

Es sieht so aus, als könnten Sie sie vom IRQ zusammenbinden.

ifconfig -a 

druckt die Ethernet-Geräte einschließlich Interrupt.

z.B.

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

während

lspci -v

gibt die PCI-Informationen mit IRQ an

z.B.

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

da ich sehe, dass beide 43 sind, kann ich daraus schließen, dass sie eth2übereinstimmen04:00.0

WillShackleford
quelle
Vielen Dank für Ihre freundliche Antwort. lshw bot mir eine bessere Lösung :)
Waqas
0

Eine andere Lösung mit udevadm

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

{0..10}- prüft die Initerfaces von eth0eth10

Daher können Sie diesen Befehl verwenden

pci_address=$(udevadm info -a -p /sys/class/net/eth{0..10} | awk -F/ '/device.*eth/ {print $4}')

Beispielausgabe

looking at device '/devices/pci0000:00/0000:00:03.0/net/eth0':

Daher lautet die Adresse

0000:00:03.0

Oder in Ihrem Fall mit einem einzigen Befehl

% 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

oder in einem Skript

#!/bin/bash
udevadm info -a -p /sys/class/net/"$1" | awk -F/ '/device.*eth/ {print $4}'

Rufen Sie das Skript mit auf

script_name eth0

Ausgabe ist

0000:00:03.0
AB
quelle
Ordentliches Programm udevadm! etwas Neues gelernt. +1
Sergiy Kolodyazhnyy
@Serg Ich brauchte eine andere Lösung;)
AB
Der lshwAnsatz von @AB und höher gibt mir zwei unterschiedliche Ergebnisse. Sollten nicht beide dieselbe PCI-Adresse angeben? Prost
Waqas
@ Waqas verstehe ich nicht.
AB