Linux
在 Linux 上僅使用 RTNETLINK 檢測網路介面是“物理”還是“虛擬”?
我想檢測網路介面是“物理”還是“虛擬”,其中“物理”表示介面連接了硬體,即使該“硬體”是由管理程序虛擬化的。“虛擬”則意味著它是 Linux 核心元素之一,例如橋接器、veths、macvlans 等等。
我知道,通過使用
/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
?