如何确定Linux网络设备的逻辑类型

如何确定Linux网络设备的逻辑类型

逻辑上我的意思是命令中所有合法的内容 ip link,例如:

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

其中逻辑类型为“vlan”。引用手册页,所有有效类型都是:

VLAN |维思 | vcan |假人 |如果b | macvlan | macvtap |可以|桥梁| ipoib | ip6tnl | ipip |坐| vxlan |gre |格雷塔普 | ip6gre | ip6gretap | ip6gretap |瓦特

请注意,这显然不是所要求的物理设备类型(如以太网、wifi、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 年对此进行修改

它来自一个具有两个真实以太网接口、一个 wifi、已安装但不活动的 docker、具有两个网络、两个虚拟机和一个 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>)。由此,我们可以收集所有类型的接口,然后解析出我们想要了解的接口。它并不优雅,但有效:

使用bash:

#!/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.200bee 类型的示例(使用 创建),输出将为,表明它的类型为。请注意,如果愿意,可以将其从其中解析出来。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日添加):“普通”以太网设备和环回设备似乎没有任何类型。所以脚本将不是列出它们。如果还需要列出没有类型的设备,则需要对其进行扩展或重写。

相关内容