Come trovare l'indirizzo PCI di un'interfaccia Ethernet?


11

c'è un modo per scoprire il numero del bus PCI di un'interfaccia Ethernet o viceversa. Sto cercando di scrivere uno script Bash / Python che dia qualcosa di simile

pci_address = some_function(eth0)

dove pci_address è sys:bus:slot:function. In che modo questi due elementi possono essere collegati tra loro?


Provato lspcio lshw?
Sergiy Kolodyazhnyy,

Ci avevo usato lspcima non ci avevo provato lshw. Il seguente comando ha funzionato per me lshw -class network -businfo. Grazie @Serg
Waqas,

Sono contento di poterti aiutare.
Invierò

Risposte:


15

lshwe lspcisono entrambi in grado di mostrare tali informazioni. Come hai già scoperto, puoi farlo lshw -class network -businfo. Ad esempio, ecco il mio 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

Ciò che è possibile utilizzare è anche lspci -De instradarlo grepper filtrare in modo specifico il controller Ethernet. Ecco il mio esempio:

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

Si noti che con il passaggio a systemd , si potrebbe usare Predictable Interface Naming per guardare semplicemente il nome dell'interfaccia per scoprire le informazioni PCI.


Il lspcinon fornisce il nome del dispositivo quindi in caso di 2 dispositivi identici non è possibile distinguere quale indirizzo pci e il nome del dispositivo partita
SomeWittyUsername

8

ethtool ti mostrerà anche pci per un'interfaccia (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

Queste informazioni sono disponibili in sysfs, non sono necessari helper come 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

Non in vmware in cui non è presente alcun
collegamento

1
Forse perché il dispositivo di rete paravirtualizzato di VMware non è basato su Ethernet?
Vladimir Panteleev,

Grazie. Per lo più hai ragione, l'ho scoperto presto, ma non sono riuscito a trovare il mio commento per rimuoverlo. Quello che era successo era che il dispositivo era stato re-associato a igb_uio per DPDK, e quindi i nodi del dispositivo originale non erano più disponibili.
Sam Liddicott,

3

Sembra che tu possa collegarli insieme all'IRQ.

ifconfig -a 

stamperà i dispositivi Ethernet incluso Interrupt.

per esempio.

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

mentre

lspci -v

fornisce le informazioni PCI con IRQ

per esempio.

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

dal momento che vedo entrambi sono 43 posso dedurre che eth2corrisponde04:00.0


Grazie per la cortese risposta. Mi ha fornito una soluzione migliore :)
Waqas,

0

Un'altra soluzione, utilizzando udevadm

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

{0..10}- controlla le interfacce da eth0...eth10

Pertanto è possibile utilizzare questo comando

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

Esempio di output

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

Pertanto l'indirizzo è

0000:00:03.0

O nel tuo caso con un singolo comando

% 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

o in una sceneggiatura

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

Chiama lo script con

script_name eth0

L'output è

0000:00:03.0

Programma pulito, udevadm! imparato qualcosa di nuovo. +1
Sergiy Kolodyazhnyy

@Serg Avevo bisogno di una soluzione diversa;)
AB

@AB lshwe l'approccio precedente mi stanno dando due risultati diversi. Entrambi non dovrebbero fornire lo stesso indirizzo PCI? salute
Waqas,

@Waqas non capisco.
AB
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.