Linuxネットワークデバイスの論理タイプを確認する方法

Linuxネットワークデバイスの論理タイプを確認する方法

論理とは、コマンドで合法的なすべてを意味します ip link。たとえば、次のようになります。

ip link add link dum0 name dum0.200 type vlan protocol 802.1Q id 200

論理タイプは「vlan」です。マニュアルページを引用すると、すべての有効なタイプは次のとおりです。

vlan|vis|vcan|dummy|ifb|macvlan|macvtap|can|bridge|ipoib|ip6tnl|ipip|sit| vxlan|gre|gretap|ip6gre|ip6gretap|ip6gretap|watt

これは明らかに必要な物理デバイスタイプではありません(イーサネット、Wi-Fi、pppなど)。この問題、実際にはリファレンスジュエリー私がテストした物理学の種類は次のとおりです。

find /sys/class/net ! -type d | xargs --max-args=1 realpath | 
  while read d; do 
    b=$(basename $d) ; n=$(find $d -name type) ; echo -n $b' ' ; cat $n;
 done
dum0.200 1
dum0.201 1
dum1.300 1
dum1.301 1
dummy0 1
ens36 1
ens33 1
lo 772
dum0 1
dum1 1
wlan0 1

ただし、仮想、VLAN、およびWlanデバイスはすべてARPHRD_ETHERタイプであることがわかりました。

もっと知っている人はいますか?よろしくお願いします。

====

2023年に改定予定

これは、2つの物理イーサネットインターフェイス、Wi-Fi、インストールされているが無効になっているドッカー、2つのネットワーク、2つの仮想マシン、およびWirguard接続を持つlibvirtを搭載したシステムに由来します。 jqはstedolan.github.io/jqで提供されており、通常は良いパッケージマネージャと一緒にインストールされます。

$ ip -details -j l | jq -r '.[]|"\(.ifname), \(.link_type), \(.linkinfo.info_data.type), \(.linkinfo.info_kind), \(.linkinfo.info_slave_kind)"' | column -t -s ','
lo                loopback   null   null        null
enp43s0           ether      null   null        null
enx00e04c680049   ether      null   null        null
wlp0s20f3         ether      null   null        null
virbr2            ether      null   bridge      null
virbr1            ether      null   bridge      null
docker0           ether      null   bridge      null
vnet0             ether      tap    tun         bridge
vnet1             ether      tap    tun         bridge
vnet2             ether      tap    tun         bridge
vnet3             ether      tap    tun         bridge
wg0               none       null   wireguard   null
$

答え1

より簡単な解決策:

ip -details link show

仮想デバイスの場合、デバイスタイプは3行目に表示されます。

答え2

利用可能なすべてのタイプを繰り返し、ip link show type <type>各タイプのすべてのインターフェイス(使用済み)を表示する方法があります。これにより、あらゆる種類のインターフェイスを収集し、知りたいインターフェイスを解析できます。エレガントではありませんが、動作します。

バッシュ使用:

#!/bin/bash

# Arguments: $1: Interface ('grep'-regexp).

# Static list of types (from `ip link help`). NOTE: On my machine, not all types are listed there, e.g. the type `tun`. And the list of types may change over time. So do not ultimately rely on this list here!:
TYPES=(bareudp bond bond_slave bridge can dummy erspan geneve gre gretap hsr ifb ip6erspan ip6gre ip6gretap ip6tnl ipip ipoib ipvlan ipvtap lowpan macsec macvlan macvtap netdevsim nlmon rmnet sit tap tun vcan veth vlan vrf vti vxcan vxlan xfrm)

iface="$1"

for type in "${TYPES[@]}"; do
  ip link show type "${type}" | grep -E '^[0-9]+:' | cut -d ':' -f 2 | sed 's|^[[:space:]]*||' | while read _if; do
    echo "${_if}:${type}"
  done | grep "^${iface}"
done

ファイルに保存して実行可能にし、学習したいインターフェースを引数として使用して実行します。

(を使用して生成された)リンクのミツバチタイプの例の場合、出力はであり、そのdum0.200タイプがあることを示します。必要に応じてそれを解析できます。vlaneth0ip link add link eth0 name dum0.200 type vlan protocol 802.1Q id 200dum0.200@eth0:vlanvlan@eth0ip link show

このスクリプトの引数は -regexp として解釈されるため、grep何も指定しないとip link show type <type>すべての出力がリストされます。

メモ: (2021年5月12日追加):「一般」イーサネットデバイスとループバックデバイスの種類はないようです。だからスクリプトはいいえリストを作成してください。タイプなしでデバイスを一覧表示する必要がある場合は、それを拡張または再構築する必要があります。

関連情報