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년에 개정될 예정.

이는 두 개의 실제 이더넷 인터페이스, Wi-Fi, 설치되었지만 비활성화된 도커, 두 개의 네트워크, 두 개의 가상 머신 및 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

가상 장치의 경우 장치 유형이 세 번째 줄에 표시됩니다.

답변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일 추가): "일반" 이더넷 장치 및 루프백 장치에 대한 유형은 없는 것 같습니다. 그래서 스크립트는아니요목록을 작성하세요. 유형 없이 장치를 나열해야 하는 경우 이를 확장하거나 다시 작성해야 합니다.

관련 정보