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

11

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

pci_address = some_function(eth0)

où est pci_address sys:bus:slot:function. Comment ces deux éléments peuvent-ils être liés l'un à l'autre?

Waqas
la source
Essayé lspciou lshw?
Sergiy Kolodyazhnyy
J'avais utilisé lspcimais je n'ai pas essayé lshw. La commande suivante a fonctionné pour moi lshw -class network -businfo. Merci @Serg
Waqas
Heureux d'avoir pu aider. Je
posterai

Réponses:

15

lshwet lspcisont tous deux capables de montrer cette information. Comme vous l'avez déjà découvert, vous pouvez le 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

Ce que vous pourriez également utiliser, c'est le lspci -Ddiriger greppour 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 la transition vers systemd , on pourrait utiliser la dénomination d'interface prévisible pour simplement regarder le nom de l'interface pour trouver les informations PCI.

Sergiy Kolodyazhnyy
la source
Le lspcine fournit pas le nom de l'appareil, donc dans le cas de 2 appareils identiques, il n'est pas possible de distinguer quelle adresse pci et
quel
8

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
riotejas
la source
8

Ces informations sont disponibles dans sysfs, aucun assistant comme lshw/ lspci/ ethtool/ udevadmn'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
Vladimir Panteleev
la source
Pas sous vmware où il n'y a pas de lien symbolique vers l'appareil
Sam Liddicott
1
Peut-être parce que le périphérique réseau paravirtualisé de VMware n'est pas basé sur Ethernet?
Vladimir Panteleev
Merci. Vous avez presque tout à fait raison, j'ai vite découvert, mais je n'ai pas trouvé mon commentaire pour le supprimer. Ce qui s'était passé était que le périphérique était à nouveau lié à igb_uio pour DPDK, et donc les nœuds de périphérique d'origine n'étaient plus disponibles.
Sam Liddicott
3

Il semble que vous pouvez les relier par l'IRQ.

ifconfig -a 

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

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

puisque je vois que les deux ont 43 ans, je peux déduire que cela eth2correspond04:00.0

WillShackleford
la source
Merci pour votre gentille réponse. lshw m'a fourni une meilleure solution :)
Waqas
0

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

Vous pouvez donc 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':

L'adresse est donc

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}'

Appelez le script avec

script_name eth0

La sortie est

0000:00:03.0
UN B
la source
Programme propre, udevadm! appris quelque chose de nouveau. +1
Sergiy Kolodyazhnyy
@Serg J'avais besoin d'une solution différente;)
AB
@AB lshwet l'approche ci-dessus me donnent deux résultats différents. Les deux ne devraient-ils pas fournir la même adresse pci? cheers
Waqas
@Waqas je ne comprends pas.
AB