我想检测网络接口是“物理”还是“虚拟”,其中“物理”意味着该接口连接有硬件,即使该“硬件”是由虚拟机管理程序虚拟化的。 “虚拟”意味着它是 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
环回设备缺少的可选属性。
当它存在时,它包含一个字符串,例如veth
、bridge
等。将其与众所周知的虚拟链路类型列表(请参阅 参考资料ip link help
)进行比较,然后识别虚拟网络接口,将所有其他网络接口保留在“物理网络接口”范围内。
并不完美,但无需咨询即可工作/sys/class/net/[IFNAME]
,这并不总是正确存在并且需要sysfs
(重新)安装,另请参阅确定网络接口是否正在veth
使用/sys/class/net
?