web-dev-qa-db-fra.com

Comment trouver l'adresse PCI d'une interface Ethernet?

existe-t-il un moyen de connaître le numéro de bus PCI d’une interface Ethernet ou inversement? Je cherche à écrire un script Bash/Python qui donne quelque chose comme

pci_address = some_function(eth0)

où adresse_pci est sys:bus:slot:function. Comment ces deux éléments peuvent-ils être liés?

8
Waqas

lshw et lspci sont tous deux capables de montrer cette information. Comme vous l'avez déjà découvert, vous pouvez faire lshw -class network -businfo. Par exemple, voici ma sortie:

$ 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

Vous pouvez également utiliser lspci -D et le diriger vers grep pour filtrer spécifiquement le contrôleur Ethernet. Voici mon exemple:

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

Notez qu'avec le passage à systemd , vous pouvez utiliser nommer une interface prévisible pour regarder simplement le nom de l'interface afin de trouver des informations PCI.

11
Sergiy Kolodyazhnyy

ethtool vous montrera également pci pour une interface (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
7
riotejas

On dirait que vous pouvez les lier ensemble par l’IRQ.

ifconfig -a 

imprimera les périphériques Ethernet, y compris Interrupt.

par exemple.

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

tandis que

lspci -v

donne les informations PCI avec IRQ

par exemple.

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

comme je vois les deux avoir 43 ans, je peux en déduire que eth2 correspond à 04:00.0

3
WillShackleford

Ces informations sont disponibles dans sysfs. Aucune aide telle que lshw/lspci/ethtool/udevadm n’est nécessaire:

$ 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
2
Vladimir Panteleev

Une autre solution, en utilisant udevadm

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

{0..10} - vérifie les initerfaces de eth0eth10

Par conséquent, vous pouvez utiliser cette commande

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

Exemple de sortie

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

Donc l'adresse est

0000:00:03.0

Ou dans votre cas avec une seule commande

% 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

ou dans un script

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

Appeler le script avec

script_name eth0

La sortie est

0000:00:03.0
0
A.B.