是否可以明确地识别给定的网络接口,例如eth1
,实际上是一个类型的veth
网络接口?请注意,在容器中,它们的网络接口名称通常以eth*
代替开头,veth*
并且无法确定eth
集合中没有实数。这可以通过 检测/sys/class/net
吗?
我的印象是iflink
in 元素/sys/class/net/...
并没有明确地标识veth
网络接口,而是在其他情况下也使用。如果无法使用/sys/class/net/...
文件系统解决我的问题,是否有一个套接字调用可以为我提供此信息,最好在 Python 中使用?
经过更多研究后,我得出结论,使用幸运的是,这是可以实现的。/sys/class/net/...
.安装正确的命名空间
/sys/class/net
感谢Danila Kiver 对“切换到网络命名空间不会改变 /sys/class/net?”的回答。我需要做的就是安装
sysfs
在某个地方,以便获得正确的(网络)命名空间视图sysfs
及其class/net/
分支。以下 Python 示例扫描网络命名空间,然后列出特定网络命名空间中的所有网络接口,用 . 标记每个物理网络接口
[PHY]
。请注意,此脚本需要 root/admin 上限,尤其是由于挂载。解决方法
/sys/class/net
但是,Linux 内核的 NETLINK 接口提供了所需的信息,否则该
ip link
命令将无法判断接口的类型。这里的关键是
IFLA_LINKINFO
向内核询问网络链接(即网络接口)列表时返回的属性。在它里面是另一个属性IFLA_INFO_KIND
,它是veth
在veth
网络接口bridge
的情况下,或者在 Linux 内核网桥的情况下。请注意,这
IFLA_LINKINFO
是一个可选属性;例如,环回、以太网和 wifi 网络接口不提供IFLA_LINKINFO
.可以使用著名的pyroute2 netlink 库在 Python 中轻松获取此信息。
pyroute2
处理所有讨厌的 NETLINK 东西,通过pip3
. 此示例简单地遍历当前网络命名空间中可见的所有网络接口,给出它们的名称、接口索引和IFLA_LINKINFO
值(如果存在)。