イーサネットインターフェイスのPCIアドレスを見つける方法


11

イーサネットインターフェイスのPCIバス番号、またはその逆を確認する方法はありますか。私はいくつかのようなものを与えるBash / Pythonスクリプトを書くことを探しています

pci_address = some_function(eth0)

ここで、pci_addressはsys:bus:slot:functionです。これら2つの要素をどのように相互に関連付けることができますか?


試しましたlspcilshw
Sergiy Kolodyazhnyy 2015

使ってみましlspciたが試しませんでしたlshw。次のコマンドは私のために働きましたlshw -class network -businfo。ありがとう@Serg
Waqas

お役に立てて嬉しいです。これを回答として投稿します
Sergiy Kolodyazhnyy、2015

回答:


15

lshwlspciその情報を表示することができます。あなたがすでに知っているように、あなたはすることができます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への移行により、予測可能なインターフェイスの命名を使用して、インターフェイス名を調べてPCI情報を見つけることができます。


lspciそれがどのPCIアドレスとデバイス名の一致を区別することはできません2つの同一のデバイスの場合にように、デバイス名を提供していません
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の下ではない
Sam Liddicott

1
おそらく、VMwareの準仮想化ネットワークデバイスがイーサネットに基づいていないためでしょうか。
Vladimir Panteleev

ありがとう。私はすぐに発見しましたが、それを削除するためのコメントが見つかりませんでした。起こったのは、デバイスがDPDKのigb_uioに再バインドされたため、元のデバイスノードが利用できなくなったということです。
Sam Liddicott、2018年

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

IRQでPCI情報を与える

例えば。

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
セルギーコロディアズニー

@セルグ私は別のソリューションが必要でした;)
AB

@AB lshw以上のアプローチでは、2つの異なる結果が得られます。両方が同じPCIアドレスを提供すべきではありませんか?歓声
Waqas

わからないわ
AB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.