Làm thế nào để tìm địa chỉ PCI của giao diện ethernet?


10

có cách nào để tìm ra số bus PCI của giao diện Ethernet hay ngược lại. Tôi đang tìm cách viết một kịch bản Bash / Python mang lại một số thứ như

pci_address = some_function(eth0)

trong đó pci_address sys:bus:slot:function. Làm thế nào hai yếu tố này có thể liên quan với nhau?


Đã thử lspcihay lshwchưa?
Sergiy Kolodyazhnyy

Tôi đã sử dụng lspcinhưng không thử lshw. Theo lệnh đã làm việc cho tôi lshw -class network -businfo. Cảm ơn @Serg
Waqas

Rất vui vì tôi có thể giúp. Sau đó, tôi sẽ đăng bài này như một câu trả lời
Sergiy Kolodyazhnyy

Câu trả lời:


14

lshwlspcicả hai đều có khả năng hiển thị thông tin đó. Như bạn đã tìm ra rồi, bạn có thể làm được lshw -class network -businfo. Ví dụ, đây là đầu ra của tôi:

$ 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

Những gì bạn cũng có thể sử dụng là lspci -Dvà đặt nó grepđể lọc bộ điều khiển ethernet một cách cụ thể. Đây là ví dụ của tôi:

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

Lưu ý rằng với việc chuyển đổi sang systemd , người ta có thể sử dụng Đặt tên giao diện dự đoán để chỉ nhìn vào tên giao diện để tìm hiểu thông tin PCI.


Các lspcikhông cung cấp tên thiết bị như vậy trong trường hợp của 2 thiết bị giống hệt nó không thể phân biệt được địa chỉ pci và tên thiết bị phù hợp
SomeWittyUsername

8

ethtool cũng sẽ hiển thị cho bạn pci cho một giao diện (bus-information :)

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

Thông tin này có sẵn trong sysfs, không cần người trợ giúp như lshw/ lspci/ ethtool/ udevadmlà cần thiết:

$ 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

Không thuộc vmware khi không có liên kết tượng trưng cho thiết bị
Sam Liddicott

1
Có lẽ bởi vì thiết bị mạng ảo hóa của VMware không dựa trên Ethernet?
Vladimir Panteleev

Cảm ơn. Bạn gần như đúng tôi sớm phát hiện ra, nhưng tôi không thể tìm thấy bình luận của mình để xóa nó. Điều đã xảy ra là thiết bị được liên kết lại với igb_uio cho DPDK, và do đó các nút thiết bị ban đầu không còn khả dụng.
Sam Liddicott

3

Có vẻ như bạn có thể buộc chúng lại với nhau bằng IRQ.

ifconfig -a 

sẽ in các thiết bị ethernet bao gồm Ngắt.

ví dụ.

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

trong khi

lspci -v

cung cấp thông tin PCI với IRQ

ví dụ.

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

vì tôi thấy cả hai đều 43 nên tôi có thể suy ra eth2trận đấu đó04:00.0


Cảm ơn phản hồi của bạn. lshw cung cấp cho tôi một giải pháp tốt hơn :)
Waqas

0

Một giải pháp khác, sử dụng udevadm

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

{0..10}- kiểm tra các initerfaces từ eth0...eth10

Do đó bạn có thể sử dụng lệnh này

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

Ví dụ đầu ra

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

Do đó, địa chỉ là

0000:00:03.0

Hoặc trong trường hợp của bạn với một lệnh duy nhất

% 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

hoặc trong một kịch bản

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

Gọi kịch bản với

script_name eth0

Đầu ra là

0000:00:03.0

Chương trình gọn gàng , udevadm! học được một cái gì đó mới. +1
Sergiy Kolodyazhnyy

@Serg Tôi cần một giải pháp khác;)
AB

@AB lshwvà cách tiếp cận trên đang cho tôi hai kết quả khác nhau. Cả hai không nên cung cấp cùng một địa chỉ pci? chúc mừng
Waqas

@Waqas tôi không hiểu.
AB
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.