我在物理接口上设置了一堆 vlan 接口。
Physical interface: eth1
VLANS on top of this: vlan1, vlan2, vlan3
现在,我想知道哪个是我的 vlan 的父接口(例如,这里 eth1 是这些 vlan 的父接口)。
我可以通过运行“ip addr show vlan-name”来获取此信息,然后在输出中,我将得到 vlan1@eth1,但我需要解析此命令的输出或查看我的网络配置文件,对其进行解析和解释。
有没有其他方法可以让我获取这些信息而无需任何解析逻辑?例如,对于绑定接口,信息存在于 /sys/class/net/ 目录中,人们可以简单地读取那里的文件。
# cat /sys/class/net/bond0/bonding/slaves
eth0 eth1
是否有类似的路径/文件可用于 VLAN 标记接口?我搞不清楚是否有一些文件可以不经过任何解析直接读取并提取此信息,或者是否有任何命令/实用程序仅提供父接口名称。
如果有其他替代方案,请告诉我。
谢谢。
答案1
我没有找到办法任何解析以获取底层接口,因此我给出了 5 种(有时只是略有不同)不同的方法来获取此信息。最后添加的方法 5 应该是首选:它使用命令的 JSON 输出ip
。
有一个具有物理接口名称的符号链接:
$ ls -l /sys/class/net/vlan2
[...]
lrwxrwxrwx. 1 root root 0 nov. 10 02:12 lower_eth1 -> ../eth1
[...]
-rw-r--r--. 1 root root 4096 nov. 10 01:49 uevent
方法 1
$ echo $(basename $(readlink /sys/class/net/vlan2/lower_*))
eth1
还有uevent
很方便的:
$ cat /sys/class/net/vlan2/uevent
DEVTYPE=vlan
INTERFACE=vlan2
IFINDEX=24
$ cat /sys/class/net/vlan2/lower_*/uevent
INTERFACE=eth1
IFINDEX=22
方法 2
$ cat /sys/class/net/vlan2/lower_*/uevent|sed -n 's/^INTERFACE=//p'
eth1
作为 root,有以下条目/proc/net/vlan
:
# ls /proc/net/vlan/
config vlan1 vlan2 vlan3 vlan4 vlan5
# cat /proc/net/vlan/config
VLAN Dev name | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
vlan1 | 1 | eth1
vlan3 | 3 | eth1
vlan4 | 4 | eth1
vlan2 | 2 | eth1
vlan5 | 5 | eth2
# cat /proc/net/vlan/vlan2
[...]
Device: eth1
[...]
方法 3
# awk -F ' *\\| *' '$1 == "vlan2" { print $3 }' /proc/net/vlan/config
eth1
方法 4
# sed -n 's/^Device: //p' /proc/net/vlan/vlan2
eth1
请注意,在 /sys 中另一个方向也是可能的upper_*
:
$ ls -l /sys/class/net/eth1
[...]
-rw-r--r--. 1 root root 4096 nov. 10 01:46 uevent
lrwxrwxrwx. 1 root root 0 nov. 10 02:23 upper_vlan1 -> ../vlan1
lrwxrwxrwx. 1 root root 0 nov. 10 02:18 upper_vlan2 -> ../vlan2
lrwxrwxrwx. 1 root root 0 nov. 10 02:23 upper_vlan3 -> ../vlan3
lrwxrwxrwx. 1 root root 0 nov. 10 02:23 upper_vlan4 -> ../vlan4
$ sed -n 's/^INTERFACE=//p' /sys/class/net/eth1/upper_*/uevent
vlan1
vlan2
vlan3
vlan4
自 2017 年起ip
(使用(rt)网络链接socket接口与内核通信)得到 JSON 输出以便简化其脚本编写。jq
命令这可能是最好的选择:
方法 5
$ ip -json link show vlan1 | jq -r '.[]|.link'
eth1
$ ip -json link show type vlan | jq -j '
.[] | (.ifname," ∈ ",.link,"\n")
'
vlan1 ∈ eth1
vlan2 ∈ eth1
vlan3 ∈ eth1