Como encontrar o endereço PCI de uma interface Ethernet?

11

existe uma maneira de descobrir o número do barramento PCI de uma interface Ethernet ou vice-versa. Eu estou olhando para escrever um script Bash / Python que fornece algo como

pci_address = some_function(eth0)

onde pci_address é sys:bus:slot:function. Como esses dois elementos podem ser relacionados entre si?

Waqas
fonte
Tentei lspciou lshw?
Sergiy Kolodyazhnyy 30/07/2015
Eu tinha usado, lspcimas não tentei lshw. O comando a seguir funcionou para mim lshw -class network -businfo. Obrigado @Serg
Waqas
Ainda bem que pude ajudar. Vou postar isso como resposta, então #
Sergiy Kolodyazhnyy

Respostas:

15

lshwe lspcisão capazes de mostrar essas informações. Como você já descobriu, você pode fazer lshw -class network -businfo. Por exemplo, aqui está minha saída:

$ 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

O que você também pode usar é lspci -Dcanalizá-lo greppara filtrar o controlador ethernet especificamente. Aqui está o meu exemplo:

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

Observe que, com a transição para systemd , pode-se usar a Nomenclatura de interface previsível para apenas olhar o nome da interface e descobrir informações sobre PCI.

Sergiy Kolodyazhnyy
fonte
A lspcinão fornece o nome do dispositivo para que no caso de 2 dispositivos idênticos não é possível distinguir qual endereço pci e combinar o nome do dispositivo
SomeWittyUsername
8

O ethtool também mostrará o pci para uma interface (informações do barramento :)

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
fonte
8

Esta informação está disponível no sysfs, nenhum auxiliar como lshw/ lspci/ ethtool/ udevadmé necessário:

$ 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
fonte
Não sob vmware onde não há ligação simbólica dispositivo
Sam Liddicott
1
Talvez porque o dispositivo de rede paravirtualizado da VMware não seja baseado em Ethernet?
Vladimir Panteleev
Obrigado. Você está quase certo que logo descobri, mas não consegui encontrar meu comentário para removê-lo. O que aconteceu foi que o dispositivo foi vinculado novamente ao igb_uio para DPDK e, portanto, os nós do dispositivo original não estavam mais disponíveis.
Sam Liddicott 12/0318
3

Parece que você pode amarrá-los pelo IRQ.

ifconfig -a 

imprimirá os dispositivos Ethernet, incluindo interrupção.

por exemplo.

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

enquanto

lspci -v

fornece as informações PCI com IRQ

por exemplo.

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

desde que eu vejo ambos são 43 eu posso inferir que eth2combina04:00.0

WillShackleford
fonte
Obrigado pela sua resposta amável. O lshw me forneceu uma solução melhor :) #
Waqas
0

Outra solução, usando udevadm

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

{0..10}- verifica os initerfaces de eth0eth10

Portanto, você pode usar este comando

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

Saída de exemplo

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

Portanto, o endereço é

0000:00:03.0

Ou no seu caso com um único 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

ou em um script

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

Chame o script com

script_name eth0

Saída é

0000:00:03.0
AB
fonte
Programa puro udevadm,! aprendi algo novo. +1
Sergiy Kolodyazhnyy 31/07/2015
@Serg eu precisava de uma solução diferente;)
AB
A @AB lshwe a abordagem acima estão me dando dois resultados diferentes. Ambos não deveriam fornecer o mesmo endereço pci? Cheers
Waqas
@Waqas eu não entendo.
AB