在 Linux 上仅使用 RTNETLINK 检测网络接口是“物理”还是“虚拟”?

在 Linux 上仅使用 RTNETLINK 检测网络接口是“物理”还是“虚拟”?

我想检测网络接口是“物理”还是“虚拟”,其中“物理”意味着该接口连接有硬件,即使该“硬件”是由虚拟机管理程序虚拟化的。 “虚拟”意味着它是 Linux 内核元素之一,例如网桥、veth、macvlan 等。

我知道,通过使用,/sys/class/net/[nif]/...我可以跟踪设备链接,从而根据是否包含“虚拟”子目录的设备路径来区分(虚拟)物理和“真实”(原文如此!)虚拟网络接口。但是,在处理网络命名空间时,需要正确重新安装sysfs才能看到正确的/sys/class/net/...条目。因此,仅依赖 RTNETLINK 数据的更简单的方法可能更合适。

当使用 RTNETLINK 发现可用的网络接口时,是否有一些属性/属性可以让我无需检查即可区分/sys/class/net/[nif]

答案1

唯一的方法似乎是查看IFLA_INFO_KIND从 a 返回的属性RTM_GETLINK。这是物理设备以及lo环回设备缺少的可选属性。

当它存在时,它包含一个字符串,例如vethbridge等。将其与众所周知的虚拟链路类型列表(请参阅 参考资料ip link help)进行比较,然后识别虚拟网络接口,将所有其他网络接口保留在“物理网络接口”范围内。

并不完美,但无需咨询即可工作/sys/class/net/[IFNAME],这并不总是正确存在并且需要sysfs(重新)安装,另请参阅确定网络接口是否正在veth使用/sys/class/net

相关内容