Jak znaleźć adres PCI interfejsu Ethernet?

11

jest sposób na sprawdzenie numeru magistrali PCI interfejsu Ethernet i odwrotnie. Chcę napisać skrypt Bash / Python, który daje coś takiego

pci_address = some_function(eth0)

gdzie jest adres pci sys:bus:slot:function. Jak te dwa elementy mogą być ze sobą powiązane?

Waqas
źródło
Próbowałeś lspciczy lshw?
Sergiy Kolodyazhnyy
Użyłem, lspciale nie próbowałem lshw. Następujące polecenie działało dla mnie lshw -class network -businfo. Dzięki @Serg
Waqas
Cieszę się, że mogłem pomóc. Prześlę to jako odpowiedź, a następnie
Sergiy Kolodyazhnyy

Odpowiedzi:

15

lshwi lspcioba są w stanie pokazać te informacje. Jak już się dowiedziałeś, możesz to zrobić lshw -class network -businfo. Na przykład oto mój wynik:

$ 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

Można także użyć lspci -Di potokować go, grepaby odfiltrować konkretnie kontroler Ethernet. Oto mój przykład:

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

Zauważ, że wraz z przejściem na systemd można było przewidzieć nazewnictwo interfejsów, aby po prostu spojrzeć na nazwę interfejsu i znaleźć informacje o PCI.

Sergiy Kolodyazhnyy
źródło
lspciNie podać nazwę urządzenia, więc w przypadku 2 identycznych urządzeń nie jest możliwe odróżnienie który adres i nazwę urządzenia PCI mecz
SomeWittyUsername
8

ethtool pokaże ci także interfejs pci (informacje o autobusie :)

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
źródło
8

Te informacje są dostępne w sysfs, nie są potrzebne żadne pomocniki takie jak 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
źródło
Nie w vmware, gdzie nie ma dowiązania symbolicznego urządzenia
Sam Liddicott,
1
Może dlatego, że parawirtualizowane urządzenie sieciowe VMware nie jest oparte na sieci Ethernet?
Vladimir Panteleev
Dzięki. W większości masz rację, którą wkrótce odkryłem, ale nie mogłem znaleźć komentarza, aby go usunąć. Stało się to, że urządzenie zostało ponownie powiązane z igb_uio dla DPDK, więc oryginalne węzły urządzenia nie były już dostępne.
Sam Liddicott,
3

Wygląda na to, że możesz powiązać je za pomocą IRQ.

ifconfig -a 

wypisze urządzenia Ethernet, w tym Przerwanie.

na przykład.

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

podczas

lspci -v

podaje informacje o PCI z IRQ

na przykład.

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

ponieważ widzę, że oba mają 43 lata, mogę wywnioskować, że eth2pasują04:00.0

WillShackleford
źródło
Dziękuję za miłą odpowiedź. lshw zapewnił mi lepsze rozwiązanie :)
Waqas
0

Inne rozwiązanie, przy użyciu udevadm

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

{0..10}- sprawdza initerfaces z eth0eth10

Dlatego możesz użyć tego polecenia

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

Przykładowe dane wyjściowe

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

Dlatego adres to

0000:00:03.0

Lub w twoim przypadku za pomocą jednego polecenia

% 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

lub w skrypcie

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

Wywołaj skrypt za pomocą

script_name eth0

Dane wyjściowe to

0000:00:03.0
AB
źródło
Zgrabny program udevadm! nauczyłem się czegoś nowego. +1
Sergiy Kolodyazhnyy
@Serg Potrzebowałem innego rozwiązania;)
AB
@AB lshwi powyższe podejście dają mi dwa różne wyniki. Czy oba nie powinny podawać tego samego adresu pci? na zdrowie
Waqas,
@Waqas Nie rozumiem.
AB