จะหาที่อยู่ PCI ของอินเตอร์เฟสอีเธอร์เน็ตได้อย่างไร


11

มีวิธีหาหมายเลขบัส PCI ของอินเตอร์เฟส Ethernet หรือในทางกลับกัน ฉันต้องการเขียนสคริปต์ Bash / Python ซึ่งให้บางอย่างเช่น

pci_address = some_function(eth0)

ที่ pci_address sys:bus:slot:functionคือ องค์ประกอบทั้งสองนี้จะเกี่ยวข้องกันอย่างไร


พยายามlspciหรือlshw?
Sergiy Kolodyazhnyy

ผมเคยใช้แต่ไม่ได้พยายามlspci คำสั่งต่อไปทำงานให้ฉันlshw lshw -class network -businfoขอบคุณ @Serg
Waqas

ดีใจที่ฉันสามารถช่วย ฉันจะโพสต์สิ่งนี้เป็นคำตอบแล้ว
Sergiy Kolodyazhnyy

คำตอบ:


15

lshwและlspciทั้งคู่สามารถแสดงข้อมูลนั้นได้ lshw -class network -businfoในขณะที่คุณได้พบแล้วที่คุณสามารถทำได้ ตัวอย่างเช่นนี่คือผลลัพธ์ของฉัน:

$ 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

สิ่งที่คุณสามารถใช้คือlspci -Dและไปป์grepเพื่อกรองตัวควบคุมอีเธอร์เน็ตโดยเฉพาะ นี่คือตัวอย่างของฉัน:

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

โปรดทราบว่าด้วยการเปลี่ยนเป็นsystemdเราสามารถใช้Predictable Interface Namingเพื่อดูชื่ออินเตอร์เฟสเพื่อค้นหาข้อมูล PCI


The lspciไม่ได้ให้ชื่ออุปกรณ์ดังนั้นในกรณีที่มี 2 อุปกรณ์ที่เหมือนกันมันเป็นไปไม่ได้ที่จะแยกแยะว่าที่อยู่ pci และชื่ออุปกรณ์ตรงกัน
SomeWittyUsername

8

ethtool จะแสดง pci ให้คุณสำหรับส่วนต่อประสาน (bus-info :)

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

ข้อมูลนี้มีอยู่ใน sysfs ไม่ต้องการผู้ช่วยเหลือเช่น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

ไม่อยู่ภายใต้ vmware ที่ไม่มีอุปกรณ์ symlink
Sam Liddicott

1
อาจเป็นเพราะอุปกรณ์เครือข่ายแบบเสมือนของ VMware ไม่ได้ใช้อีเทอร์เน็ต
Vladimir Panteleev

ขอบคุณ ส่วนใหญ่คุณจะถูกค้นพบในไม่ช้า แต่ฉันไม่พบความคิดเห็นของฉันที่จะลบ สิ่งที่เกิดขึ้นคืออุปกรณ์ถูกผูกไว้กับ igb_uio สำหรับ DPDK อีกครั้งและดังนั้นจึงไม่มีโหนดอุปกรณ์ดั้งเดิมอีกต่อไป
Sam Liddicott

3

ดูเหมือนว่าคุณสามารถผูกพวกเขาเข้าด้วยกันโดย IRQ

ifconfig -a 

จะพิมพ์อุปกรณ์อีเธอร์เน็ตรวมถึงอินเตอร์รัปต์

เช่น.

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

ในขณะที่

lspci -v

ให้ข้อมูล PCI กับ IRQ

เช่น.

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

เนื่องจากฉันเห็นทั้งคู่เป็น 43 ฉันสามารถอนุมานได้ว่าการeth2แข่งขัน04:00.0


ขอบคุณสำหรับการตอบรับของคุณ lshw ให้ฉันเป็นทางออกที่ดี :)
Waqas

0

ทางออกอื่นโดยใช้ udevadm

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

{0..10}- ตรวจสอบ initerfaces จากeth0...eth10

ดังนั้นคุณสามารถใช้คำสั่งนี้

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

ตัวอย่างผลลัพธ์

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

ดังนั้นที่อยู่คือ

0000:00:03.0

หรือในกรณีของคุณด้วยคำสั่งเดียว

% 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

หรือในสคริปต์

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

โทรหาสคริปต์ด้วย

script_name eth0

ผลผลิตคือ

0000:00:03.0

โปรแกรมเรียบร้อยudevadm! เรียนรู้สิ่งใหม่ +1
Sergiy Kolodyazhnyy

@ เซอร์ฉันต้องการโซลูชันที่แตกต่าง;)
AB

@AB lshwและวิธีการข้างต้นให้ผลลัพธ์ที่แตกต่างกันสองอย่าง ทั้งสองไม่ควรให้ที่อยู่ pci เดียวกันหรือไม่ ไชโย
Waqas

@ Waqas ฉันไม่เข้าใจ
AB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.