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

각 링크는 중복된 방식으로 / mtu두 번 두 번과 같은 내용을 알려주지 만 그것이 어떤 유형인지에 대한 명확한 표시는 없습니다. 나도 지침을 찾을 수 없습니다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 

bridge세 번째 줄의 시작 부분 에 있습니다 .


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행에 하나, 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가 되다투엔(진짜탭해봐사실은 그렇지투엔또는수도꼭지하위 필드에 있음) 장비뿐만 아니라다리노예, 그리고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'

관련 정보