列出 vlan 的父接口

Rah*_*hul 3 networking linux ubuntu vlan linux-networking

我在物理接口上设置了一堆 VLAN 接口。

Physical interface: eth1
VLANS on top of this: vlan1, vlan2, vlan3
Run Code Online (Sandbox Code Playgroud)

现在,我想知道我的vlan的父接口是哪个(例如,这里eth1是这些vlan的父接口)。

我可以通过运行“ip addr show vlan-name”来获取此信息,然后在输出中,我将得到 vlan1@eth1,但我需要解析此命令的输出或通过查看我的网络配置文件,解析它并解释它。

有没有其他方法可以让我无需任何解析逻辑即可获取此信息?例如,对于绑定接口,信息存在于 /sys/class/net/ 目录中,并且可以简单地读取那里的文件。

# cat /sys/class/net/bond0/bonding/slaves
eth0 eth1
Run Code Online (Sandbox Code Playgroud)

是否有类似的路径/文件可用于 VLAN 标记的接口?我无法弄清楚是否有一些文件我可以直接读取而无需任何解析并提取此信息或任何仅提供父接口名称的命令/实用程序。

请告诉我是否还有其他替代方案。

谢谢。

A.B*_*A.B 8

我没有找到一种无需任何解析即可获取底层接口的方法,因此我给出了 5 种(有时只是稍微)不同的方法来获取此信息。最后添加的方法 5 应该是首选:它使用ip命令的 JSON 输出。

\n
\n

有一个具有物理接口名称的符号链接:

\n

$ ls -l /sys/class/net/vlan2
\n[...]
\n lrwxrwxrwx. 1 root root 0 nov. 10 02:12 lower_eth1 -> ../eth1
\n[...]
\n-rw-r--r--. 1 root root 4096 nov. 10 01:49 uevent

\n

方法一

\n
$ echo $(basename $(readlink /sys/class/net/vlan2/lower_*))\neth1\n
Run Code Online (Sandbox Code Playgroud)\n
\n

还有一个uevent也很方便:

\n
$ cat /sys/class/net/vlan2/uevent \nDEVTYPE=vlan\nINTERFACE=vlan2\nIFINDEX=24\n$ cat /sys/class/net/vlan2/lower_*/uevent\nINTERFACE=eth1\nIFINDEX=22\n
Run Code Online (Sandbox Code Playgroud)\n

方法2

\n
$ cat /sys/class/net/vlan2/lower_*/uevent|sed -n \'s/^INTERFACE=//p\'\neth1\n
Run Code Online (Sandbox Code Playgroud)\n
\n

作为 root,有以下条目/proc/net/vlan

\n
# ls /proc/net/vlan/\nconfig  vlan1  vlan2  vlan3  vlan4  vlan5\n# cat /proc/net/vlan/config\nVLAN Dev name    | VLAN ID\nName-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD\nvlan1          | 1  | eth1\nvlan3          | 3  | eth1\nvlan4          | 4  | eth1\nvlan2          | 2  | eth1\nvlan5          | 5  | eth2\n
Run Code Online (Sandbox Code Playgroud)\n

# cat /proc/net/vlan/vlan2
\n[...]
\n Device: eth1
\n[...]

\n

方法三

\n
# awk -F \' *\\\\| *\' \'$1 == "vlan2" { print $3 }\' /proc/net/vlan/config\neth1\n
Run Code Online (Sandbox Code Playgroud)\n

方法4

\n
# sed -n \'s/^Device: //p\' /proc/net/vlan/vlan2\neth1\n
Run Code Online (Sandbox Code Playgroud)\n
\n

请注意,在 /sys 中,也可以使用其他方向upper_*

\n
$ ls -l /sys/class/net/eth1\n
Run Code Online (Sandbox Code Playgroud)\n

[...]

\n
-rw-r--r--. 1 root root 4096 nov.  10 01:46 uevent\nlrwxrwxrwx. 1 root root    0 nov.  10 02:23 upper_vlan1 -> ../vlan1\nlrwxrwxrwx. 1 root root    0 nov.  10 02:18 upper_vlan2 -> ../vlan2\nlrwxrwxrwx. 1 root root    0 nov.  10 02:23 upper_vlan3 -> ../vlan3\nlrwxrwxrwx. 1 root root    0 nov.  10 02:23 upper_vlan4 -> ../vlan4\n\n$ sed -n \'s/^INTERFACE=//p\' /sys/class/net/eth1/upper_*/uevent\nvlan1\nvlan2\nvlan3\nvlan4\n
Run Code Online (Sandbox Code Playgroud)\n
\n

自 2017 年以来ip(使用(rt)netlink套接字接口与内核进行通信),其许多子命令都获得了 JSON 输出,以简化其脚本编写能力。jq命令一起使用,这可能是最好的选择:

\n

方法5

\n
$ ip -json link show vlan1 | jq -r \'.[]|.link\'\neth1\n\n$ ip -json link show type vlan | jq -j \'\n    .[] | (.ifname," \xe2\x88\x88 ",.link,"\\n")\n\'\nvlan1 \xe2\x88\x88 eth1\nvlan2 \xe2\x88\x88 eth1\nvlan3 \xe2\x88\x88 eth1\n
Run Code Online (Sandbox Code Playgroud)\n