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.