Bagaimana menemukan alamat PCI dari antarmuka ethernet?

11

apakah ada cara untuk mengetahui nomor bus PCI dari antarmuka Ethernet atau sebaliknya. Saya mencari untuk menulis skrip Bash / Python yang memberikan beberapa hal seperti

pci_address = some_function(eth0)

dimana pci_address berada sys:bus:slot:function. Bagaimana kedua elemen ini saling terkait?

Waqas
sumber
Sudah mencoba lspciatau lshw?
Sergiy Kolodyazhnyy
Saya telah menggunakan lspcitetapi tidak mencoba lshw. Perintah berikut bekerja untuk saya lshw -class network -businfo. Terima kasih @erg
Waqas
Senang bisa membantu. Saya akan memposting ini sebagai jawaban, kemudian
Sergiy Kolodyazhnyy

Jawaban:

15

lshwdan lspcikeduanya mampu menunjukkan informasi itu. Seperti yang sudah Anda ketahui, Anda bisa melakukannya lshw -class network -businfo. Sebagai contoh, inilah hasil saya:

$ 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

Apa yang juga bisa Anda gunakan adalah lspci -Ddan pipa itu grepuntuk menyaring pengontrol ethernet secara khusus. Inilah contoh saya:

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

Perhatikan bahwa dengan transisi ke systemd , orang dapat menggunakan Penamaan Antarmuka yang Dapat Diprediksi untuk hanya melihat nama antarmuka untuk mengetahui informasi PCI.

Sergiy Kolodyazhnyy
sumber
Itu lspcitidak memberikan nama perangkat sehingga dalam kasus 2 perangkat yang identik tidak mungkin membedakan alamat pci dan nama perangkat yang cocok
SomeWittyUsername
8

ethtool juga akan menampilkan pci untuk antarmuka (info bus :)

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

Informasi ini tersedia di sysfs, tidak ada pembantu seperti lshw/ lspci/ ethtool/ udevadmyang dibutuhkan:

$ 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
sumber
Tidak di bawah vmware di mana tidak ada symlink perangkat
Sam Liddicott
1
Mungkin karena perangkat jaringan paravirtualized VMware tidak didasarkan pada Ethernet?
Vladimir Panteleev
Terima kasih. Anda sebagian besar benar, saya segera menemukan, tetapi saya tidak dapat menemukan komentar saya untuk menghapusnya. Apa yang terjadi adalah perangkat terikat kembali ke igb_uio untuk DPDK, sehingga node perangkat asli tidak lagi tersedia.
Sam Liddicott
3

Sepertinya Anda bisa mengikat mereka bersama oleh IRQ.

ifconfig -a 

akan mencetak perangkat ethernet termasuk Interrupt.

misalnya.

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

sementara

lspci -v

memberikan info PCI dengan IRQ

misalnya.

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

karena saya melihat keduanya adalah 43 saya dapat menyimpulkan bahwa eth2pertandingan04:00.0

WillShackleford
sumber
Terima kasih atas tanggapan baik Anda. lshw memberi saya solusi yang lebih baik :)
Waqas
0

Solusi lain, menggunakan udevadm

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

{0..10}- Periksa initerfaces dari eth0...eth10

Karena itu Anda dapat menggunakan perintah ini

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

Contoh output

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

Karena itu alamatnya

0000:00:03.0

Atau dalam kasus Anda dengan satu perintah

% 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

atau dalam naskah

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

Panggil skripnya dengan

script_name eth0

Output adalah

0000:00:03.0
AB
sumber
Program rapi, udevadm! belajar sesuatu yang baru. +1
Sergiy Kolodyazhnyy
@Erg aku butuh solusi yang berbeda;)
AB
@ AB lshwdan pendekatan di atas memberi saya dua hasil yang berbeda. Bukankah keduanya harus memberikan alamat pci yang sama? Cheers
Waqas
@ Waqas saya tidak mengerti.
AB