Sysfs 標籤

(幾乎逐字摘自 Eric Biederman 的 netns 標籤補丁提交訊息)

問題: 網路裝置出現在 sysfs 中,並且在網路名稱空間啟用後,多個具有相同名稱的裝置可能出現在同一目錄中,糟糕!

為了避免這個問題,並允許網路名稱空間中的現有應用程式看到當前在 sysfs 中呈現的相同介面,sysfs 現在具有標籤目錄支援。

透過使用網路名稱空間指標作為標籤來分隔 sysfs 目錄條目,我們可以確保目錄中沒有衝突,並且應用程式只能看到有限的網路裝置集。

每個 sysfs 目錄條目都可以透過其 kernfs_nodevoid *ns member 成員使用名稱空間進行標記。如果目錄條目被標記,則 kernfs_node->flags 將具有 KOBJ_NS_TYPE_NONE 和 KOBJ_NS_TYPES 之間的標誌,並且 ns 將指向它所屬的名稱空間。

每個 sysfs 超級塊的 kernfs_super_info 包含一個數組 void *ns[KOBJ_NS_TYPES]。當標記名稱空間 kobj_nstype 中的任務首次掛載 sysfs 時,將建立一個新的超級塊。它將透過將其 s_fs_info->ns[kobj_nstype] 設定為新名稱空間來與其他 sysfs 掛載區分開。 請注意,透過繫結掛載和掛載傳播,任務可以輕鬆檢視其他名稱空間的 sysfs 掛載的內容。因此,當名稱空間退出時,它將呼叫 kobj_ns_exit() 以使指向它的任何 kernfs_node->ns 指標無效。

此介面的使用者

  • kobj_ns_type 列舉中定義一個型別。

  • 使用其 kobj_ns_type_operations 呼叫 kobj_ns_type_register(),它具有

    • current_ns(),它返回當前的名稱空間

    • netlink_ns(),它返回套接字的名稱空間

    • initial_ns(),它返回初始名稱空間

  • 當單個標籤不再有效時,呼叫 kobj_ns_exit()