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?
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.
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
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
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
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 eth0
… eth10
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