이더넷 인터페이스의 PCI 주소를 찾는 방법은 무엇입니까?


11

이더넷 인터페이스의 PCI 버스 번호를 찾는 방법이 있습니까? 나는 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 정보를 찾을 수 있습니다.


lspci2 개와 동일한 소자의 경우는 구별하는 것은 불가능하므로 장치 이름을 제공하지 않는 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

장치 symlink가없는 vmware 아래에 없음
Sam Liddicott

1
VMware의 반 가상화 된 네트워크 장치가 이더넷을 기반으로하지 않기 때문일 수 있습니다.
블라디미르 판 텔레 예프

감사. 당신은 내가 곧 발견 한 것이 맞지만, 그것을 제거 할 의견을 찾을 수 없었습니다. DPDK를 위해 장치가 igb_uio로 리 바인드되어 원래 장치 노드를 더 이상 사용할 수 없었습니다.
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

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}– 초기 화면을 확인합니다 eth0eth10

따라서이 명령을 사용할 수 있습니다

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

@ Serg 나는 다른 해결책을 필요로했다;)
AB

@AB lshw및 위의 접근법은 두 가지 다른 결과를 제공합니다. 둘 다 동일한 pci 주소를 제공하지 않아야합니까? 건배
Waqas

@Waqas 이해가되지 않습니다.
AB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.