我想检测网络接口是“物理”还是“虚拟”,其中“物理”表示接口连接了硬件,即使该“硬件”是由管理程序虚拟化的。“虚拟”则意味着它是 Linux 内核元素之一,例如网桥、veth、macvlan 等。
我知道,通过使用/sys/class/net/[nif]/...
我可以跟踪设备链接,从而根据是否包含“虚拟”子目录的设备路径区分(虚拟)物理和“真实”(原文如此!)虚拟网络接口。但是,在处理网络名称空间时,这需要正确重新安装sysfs
才能看到正确的/sys/class/net/...
条目。因此,仅依靠 RTNETLINK 数据的更简单的方法可能更合适。
当使用 RTNETLINK 发现可用的网络接口时,是否有一些属性/属性可以让我区分而无需检查/sys/class/net/[nif]
?
唯一的方法似乎是查看
IFLA_INFO_KIND
从 a 返回的属性RTM_GETLINK
。这是物理设备和lo
环回设备都缺少的可选属性。当它存在时,它包含一个字符串,例如
veth
,bridge
等。将此与众所周知的虚拟链接类型列表(请参阅 参考资料ip link help
)进行比较,然后识别虚拟网络接口,将所有其他网络接口留在“物理网络接口”范围内。不完美,但无需咨询即可工作
/sys/class/net/[IFNAME]
,这并不总是正确存在并且需要sysfs
(重新)安装,另请参阅识别网络接口是否正在veth
使用/sys/class/net
?