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?


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.


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

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

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


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.