インターフェース名＆PCIe BDF名を調べる（Ubuntu 16.04）

インターフェース名(ex: enp1s0)とPCIe BDF名(ex: 02:00.1)を一度に調べる簡単な方法をメモ。
( PCIe BDF = Bus:Device.Function )

これまでは新しいNICを追加する度に、 `lspci | grep -i <vendor_name>` で追加したインターフェースのPCIe番号を探し、`$ip a` で表示されるインターフェース名から目的のものらしきものを探しては `ethtools -i <interface_name>` で PCIe BDF を調べて確認していました。

メンドクサイな～ と思っていたら、 `$udevadm info /sys/class/net/<dev>` に必要な情報が全部載っており、以下１行で表示できる事を発見。

```
$ for DEV in $(ls /sys/class/net/); do udevadm info /sys/class/net/$DEV | grep -e INTERFACE -e "ID_PATH=pci" -e ID_MODEL_FROM_DATABASE; echo "---"; done
```

見やすく書くとこんな感じ

```bash
#!/bin/bash

for DEV in $(ls /sys/class/net/)
do
        udevadm info /sys/class/net/$DEV | grep -e INTERFACE -e "ID_PATH=pci" -e ID_MODEL_FROM_DATABAS
        echo "---"
done
```

> --> 追記：実は `lshw -class network` という便利なコマンドがあったという罠。

```
ebiken@supermicro:~$ sudo lshw -class network
  *-network DISABLED
       description: Ethernet interface
       product: FastLinQ QL45000 Series 100GbE Controller
       vendor: QLogic Corp.
       physical id: 0
       bus info: pci@0000:02:00.0
       logical name: enp2s0
       version: 10
       serial: 00:0e:1e:c6:40:92
       width: 64 bits
       clock: 33MHz
       capabilities: pm vpd msi msix pciexpress bus_master cap_list rom ethernet physical fibre autonegotiation
       configuration: autonegotiation=on broadcast=yes driver=qede driverversion=8.4.0.0 firmware=mfw 8.9.2.0 storm 8.4.2.0 latency=0 link=no multicast=yes
       resources: irq:26 memory:b8080000-b80bffff memory:b8000000-b807ffff memory:b80c0000-b80cffff memory:d6500000-d653ffff
  *-network:0
       description: Ethernet interface
       product: MT27700 Family [ConnectX-4]
       vendor: Mellanox Technologies
       physical id: 0
...
```

> <-- 追記

２日に１回は `ethtool -i` してるので、これからは楽できそうです。

# output memo

* ip a / ethtool 利用：
    * インターフェース名（enpXsY）とlspci BDF（X:Y.0）が一致していない場合、 ethtool -i を延々と繰り返すことになりツライ。

```
ebiken@supermicro:~$ lspci | grep FastLinQ
02:00.0 Ethernet controller: QLogic Corp. FastLinQ QL45000 Series 100GbE Controller (rev 10)

ebiken@supermicro:~$ ip a | grep ^[0-9]
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
3: enp6s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
4: enp2s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
5: ens1f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br-ens1f0 state UP group default qlen 1000
6: ens1f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br-ens1f1 state UP group default qlen 1000
7: ens3f0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
8: ens3f1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000

ebiken@supermicro:~$ ethtool -i enp2s0
driver: qede
version: 8.4.0.0
firmware-version: mfw 8.9.2.0 storm 8.4.2.0
expansion-rom-version:
bus-info: 0000:02:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no
```

* １行コマンドで一覧表示
    * ConnectX-4 Lx はインターフェース名（enpXsY）とlspci BDF（X:Y.0）が一致していない 

```
ebiken@supermicro:~$ for DEV in $(ls /sys/class/net/); do udevadm info /sys/class/net/$DEV | grep -e INTERFACE -e "ID_PATH=pci" -e ID_MODEL_FROM_DATABASE; echo "---"; done
E: INTERFACE=br0
---
E: INTERFACE=br-ens1f0
---
E: INTERFACE=br-ens1f1
---
E: ID_MODEL_FROM_DATABASE=FastLinQ QL45000 Series 100GbE Controller (FastLinQ QL45611H 100GbE Adapter)
E: ID_PATH=pci-0000:02:00.0
E: INTERFACE=enp2s0
---
E: ID_MODEL_FROM_DATABASE=I210 Gigabit Network Connection
E: ID_PATH=pci-0000:05:00.0
E: INTERFACE=enp5s0
---
E: ID_MODEL_FROM_DATABASE=I210 Gigabit Network Connection
E: ID_PATH=pci-0000:06:00.0
E: INTERFACE=enp6s0
---
E: ID_MODEL_FROM_DATABASE=MT27700 Family [ConnectX-4]
E: ID_PATH=pci-0000:03:00.0
E: INTERFACE=ens1f0
---
E: ID_MODEL_FROM_DATABASE=MT27700 Family [ConnectX-4]
E: ID_PATH=pci-0000:03:00.1
E: INTERFACE=ens1f1
---
E: ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx]
E: ID_PATH=pci-0000:81:00.0
E: INTERFACE=ens3f0
---
E: ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx]
E: ID_PATH=pci-0000:81:00.1
E: INTERFACE=ens3f1
---
```