¿Cómo encontrar la dirección PCI de una interfaz ethernet?

11

¿Hay alguna manera de averiguar el número de bus PCI de una interfaz Ethernet o viceversa? Estoy buscando escribir un script Bash / Python que dé algo como

pci_address = some_function(eth0)

donde está pci_address sys:bus:slot:function. ¿Cómo se pueden relacionar estos dos elementos entre sí?

Waqas
fuente
Probado lspcio lshw?
Sergiy Kolodyazhnyy
Lo había usado lspcipero no lo intenté lshw. El siguiente comando funcionó para mí lshw -class network -businfo. Gracias @Serg
Waqas
Me alegro de poder ayudar. Publicaré esto como respuesta, entonces
Sergiy Kolodyazhnyy

Respuestas:

15

lshwy lspciambos son capaces de mostrar esa información. Como ya has descubierto, puedes hacerlo lshw -class network -businfo. Por ejemplo, aquí está mi salida:

$ 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

Lo que también podría usar es lspci -Dy canalizarlo greppara filtrar específicamente el controlador de Ethernet. Aquí está mi ejemplo:

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

Tenga en cuenta que con la transición a systemd , se podría usar el nombre de interfaz predecible para simplemente mirar el nombre de la interfaz para encontrar información de PCI.

Sergiy Kolodyazhnyy
fuente
El lspcino proporciona el nombre del dispositivo por lo que en caso de 2 dispositivos idénticos que no es posible distinguir qué dirección PCI y combinar el nombre del dispositivo
SomeWittyUsername
8

ethtool también le mostrará pci para una interfaz (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
fuente
8

Esta información está disponible en sysfs, no se necesitan ayudantes como 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
Vladimir Panteleev
fuente
No bajo vmware donde no hay enlace simbólico del dispositivo
Sam Liddicott
1
¿Quizás porque el dispositivo de red paravirtualizado de VMware no está basado en Ethernet?
Vladimir Panteleev
Gracias. En su mayoría tiene razón, descubrí pronto, pero no pude encontrar mi comentario para eliminarlo. Lo que sucedió fue que el dispositivo se volvió a vincular a igb_uio para DPDK, por lo que los nodos del dispositivo original ya no estaban disponibles.
Sam Liddicott
3

Parece que puedes unirlos mediante el IRQ.

ifconfig -a 

imprimirá los dispositivos de Ethernet, incluida la interrupción.

p.ej.

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

mientras

lspci -v

da la información PCI con IRQ

p.ej.

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

ya que veo que ambos son 43, puedo inferir que eth2coincide04:00.0

WillShackleford
fuente
Gracias por tu amable respuesta. lshw me proporcionó una mejor solución :)
Waqas
0

Otra solución, usando udevadm

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

{0..10}- comprueba las caras iniciales de eth0...eth10

Por lo tanto, podría usar este comando

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

Salida de ejemplo

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

Por lo tanto, la dirección es

0000:00:03.0

O en tu caso con un solo 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 en un guión

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

Llame al guión con

script_name eth0

La salida es

0000:00:03.0
AB
fuente
Programa aseado, udevadm ! Aprendí algo nuevo. +1
Sergiy Kolodyazhnyy
@Serg necesitaba una solución diferente;)
AB
@AB lshwy el enfoque anterior me están dando dos resultados diferentes. ¿No deberían ambos proporcionar la misma dirección pci? aclamaciones
Waqas
@Waqas no entiendo.
AB