Linux

在 Linux 上僅使用 RTNETLINK 檢測網路介面是“物理”還是“虛擬”?

  • July 20, 2018

我想檢測網路介面是“物理”還是“虛擬”,其中“物理”表示介面連接了硬體,即使該“硬體”是由管理程序虛擬化的。“虛擬”則意味著它是 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

引用自:https://unix.stackexchange.com/questions/452144