iproute2:ネットワークデバイスの種類を表示するには?

iproute2:ネットワークデバイスの種類を表示するには?

そしてIP ルート 2ユーザースペースツールは、次のコマンドを使用してネットワークデバイスを表示できます。アイピーコマンド動詞link show(時には省略されますl sh)。

生成された出力にはリンク/インタフェースデバイスタイプは表示されません。

root@box:/# ip link show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
2: eno3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether bc:97:e1:58:10:18 brd ff:ff:ff:ff:ff:ff 
3: eno1np0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether bc:97:e1:58:10:1a brd ff:ff:ff:ff:ff:ff
4: eno2np1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether bc:97:e1:58:10:1b brd ff:ff:ff:ff:ff:ff

各リンクは重複した方法で/ダブルmtu2回のようなコンテンツを教えてくれますが、それがどのようなタイプであるかについて明確な表示はありません。私も指示が見つかりませんUPDOWNマンページお見せしたら嬉しいですTYPE。しかし、次のようなものがたくさんあります。

TYPE := [ bridge | bridge_slave | bond | bond_slave | 
          can | dummy | hsr | ifb | ipoib | macvlan | 
          macvtap | vcan | veth | vlan | vxlan | ip6tnl | 
          ipip | sit | gre | gretap | erspan | ip6gre | 
          ip6gretap | ip6erspan | vti | vrf | nlmon |
          ipvlan | lowpan | geneve | macsec ]  

ip2routeツールにはリストの種類を出力する組み込みの方法はありますか?

答え1

インタフェースタイプ情報はほとんど使用されず、一般に見せるためにただ追加してください-detailsオプションip:

-d-details

    より詳細な情報を出力します。

したがって、この情報は、ip -details link show次のその他の追加情報とともに、すべてのインターフェイスに対して表示されます。

$ ip -d link show lxcbr0
7: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 00:16:3e:00:00:00 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535 
    bridge forward_delay 1500 hello_time 200 max_age 2000 ageing_time 30000 stp_state 0 priority 32768 vlan_filtering 0 vlan_protocol 802.1Q bridge_id 8000.0:16:3e:0:0:0 designated_root 8000.0:16:3e:0:0:0 root_port 0 root_path_cost 0 topology_change 0 topology_change_detected 0 hello_timer    0.00 tcn_timer    0.00 topology_change_timer    0.00 gc_timer   34.76 vlan_default_pvid 1 vlan_stats_enabled 0 vlan_stats_per_port 0 group_fwd_mask 0 group_address 01:80:c2:00:00:00 mcast_snooping 1 mcast_router 1 mcast_query_use_ifaddr 0 mcast_querier 0 mcast_hash_elasticity 16 mcast_hash_max 4096 mcast_last_member_count 2 mcast_startup_query_count 2 mcast_last_member_interval 100 mcast_membership_interval 26000 mcast_querier_interval 25500 mcast_query_interval 12500 mcast_query_response_interval 1000 mcast_startup_query_interval 3124 mcast_stats_enabled 0 mcast_igmp_version 2 mcast_mld_version 1 nf_call_iptables 0 nf_call_ip6tables 0 nf_call_arptables 0 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 

bridge3行目の先頭にあります。


JSON出力の使用jqコマンド(シェルがJSONを処理するために必須)を使用すると、インターフェース名に基づいてこの情報を取得したい場合は、タイプを事前に知らなくてもコマンド出力を確実に解析できます。

$ ip -details -json link show | jq --join-output '.[] | .ifname," ",.linkinfo.info_kind,"\n"'
lo null
dummy0 dummy
dummy2 dummy
lxcbr0 bridge
wlan0 null
eth0 null
virbr0 bridge
virbr0-nic tun
tap0 tun
veth0 veth
test veth
wireguard0 wireguard
vethZ0ZQFJ veth

実際のインタフェース(またlo)には型がなく(つまり.[].linkinfo.info_kind存在しません)ジャック戻ってくる無効存在しないフィールドについて。これを使用してフィルタリングできます。

ip -details -json link show | jq --join-output '.[] | .ifname," ", if .linkinfo.info_kind != null then .linkinfo.info_kind else empty end, "\n"'

実際に検索機能ip link showタイプそして奴隷ランク〜のようにタイプ、詳細出力は3行に1つ、4行にもう1つを表示します。 JSON出力には2つの異なるフィールドが含まれているため、従属型にはこれら2つのフィールドが表示され.[].linkinfo.info_kind.[].linkinfo.info_slave_kind追加のコマンドが必要です。以下は両方の例です。

ip -details -json link show | jq --join-output '
.[] |
    if .ifname != null then
        .ifname,
        " ",
        if .linkinfo.info_kind != null then
            .linkinfo.info_kind
        else
            empty
        end,
        " ",
        if .linkinfo.info_slave_kind != null then
            .linkinfo.info_slave_kind
        else
            empty
        end,
        "\n"
    else
        empty
    end
'

次のように出力されます。

lo  
dummy0 dummy 
dummy2 dummy 
lxcbr0 bridge 
wlan0  
eth0  
virbr0 bridge 
virbr0-nic tun bridge
tap0 tun 
veth0 veth 
test veth 
wireguard0 wireguard 
vethZ0ZQFJ veth bridge

そしてここに見せてくださいvirbr0-nicになるトゥエン(本物タップしてみて実はそうですトゥエンまたは蛇口サブフィールドにある)機器だけでなく奴隷、そしてvethZ0ZQFJワイズ機器と奴隷。

すべて同じです。ジャック上記のフィルタは、スレーブインタフェースを照会するときにフィルタリングされた出力も処理しますip ... link show ... type ...slave。これは明らかにインターフェイス名のない(空の)エントリを無視し、一致しないインターフェイスの追加の空のオブジェクトを返します。したがって:で始まる行は、次の内容ip -details -json link show type bridge_slave |のみを返します。

virbr0-nic tun bridge
vethZ0ZQFJ veth bridge

答え2

これは情報を取得するために使用するスクリプトです。

#!/bin/bash

TYPES="bridge bridge_slave bond bond_slave can dummy hsr ifb ipoib macvlan macvtap vcan veth vlan vxlan ip6tnl ipip sit gre gretap erspan ip6gre ip6gretap ip6erspan vti vrf nlmon ipvlan lowpan geneve macsec"


for TYPE in $TYPES
do

        echo "TYPE $TYPE"
        ip link show type "$TYPE"
done

これにより、出力に情報が挿入されます。ip link show

#!/bin/bash

TYPES="bridge bridge_slave bond bond_slave can dummy hsr ifb ipoib macvlan macvtap vcan veth vlan vxlan ip6tnl ipip sit gre gretap erspan ip6gre ip6gretap ip6erspan vti vrf nlmon ipvlan lowpan geneve macsec"
 
# intially query all links
# (since output is 2 lines per link, squash into single line, and sort,
#  so we can use `comm`)
LINK_ALL="$(ip link show | paste - - | sort)"
# initial empty
LINK_RESULT=""

# populate $LINK_RESULT
for TYPE in $TYPES
do

  # using specific `ip link show type`
  # ( again use `paste` and sort
  #  -> each link info being 2 lines is put in one
  #  -> sorting required for `comm` )
  LINK_TYPE="$(ip link show type "$TYPE" | paste - - | sort)"

  # where there any links of this type ?
  test -n "$LINK_TYPE" && {
    # then remove from the initial set
    LINK_ALL="$(comm -3 <(echo "$LINK_ALL") <(echo "$LINK_TYPE"))"
    # add to result set (and insert link TYPE information)
    LINK_RESULT="$(echo "$LINK_RESULT"; echo "$LINK_TYPE" | sed 's/>/>'" type=$TYPE"'/g')"
  }

done

# Since ordnary NICs and lo have no type they have not been found before
# join them
LINK_RESULT="$LINK_ALL $(echo "$LINK_RESULT")"

# Output result undoing the paste
echo "$LINK_RESULT" | sed 's:link/:\n    link/:g'

関連情報