Iproute

iproute2:如何顯示網路設備的類型?

  • October 24, 2020

使用iproute2使用者空間工具,可以使用ip命令動詞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

每個連結都以冗餘的方式告訴資訊mtu,例如UP/DOWN兩次,但是我沒有明顯的跡象表明它的類型。此外,我在熱的聯機幫助頁中找不到任何指示來顯示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 工具是否有內置方式來輸出列表中的類型?

介面類型資訊,很少使用,一般只有在添加選項後才會顯示-detailsip

-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 

bridge第 3 行的開頭。


在命令中使用 JSON 輸出jq(這是從 shell 處理 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不存在)並且jq將為不存在的欄位返回null。它可以用這個過濾掉:

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種類從種類組合為type,詳細輸出會在第 3 行顯示一個,在第 4 行顯示另一個。在 JSON 輸出中,這是兩個不同的欄位:.[].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是一個tun(實際上是tuntap,因為它是tuntap在一個子欄位中)設備以及一個從設備,而vethZ0ZQFJ是一個veth設備以及一個從設備。

上面相同的jqip ... link show ... type ...slave過濾器也可以處理查詢從介面時的過濾輸出,這顯然會通過忽略沒有介面名稱的(空)條目來為不匹配的介面返回額外的空對象。因此,以開頭的行將ip -details -json link show type bridge_slave |僅返回:

virbr0-nic tun bridge
vethZ0ZQFJ veth bridge

引用自:https://unix.stackexchange.com/questions/616157