Sysfs 標籤¶
(幾乎逐字摘自 Eric Biederman 的 netns 標籤補丁提交訊息)
問題: 網路裝置出現在 sysfs 中,並且在網路名稱空間啟用後,多個具有相同名稱的裝置可能出現在同一目錄中,糟糕!
為了避免這個問題,並允許網路名稱空間中的現有應用程式看到當前在 sysfs 中呈現的相同介面,sysfs 現在具有標籤目錄支援。
透過使用網路名稱空間指標作為標籤來分隔 sysfs 目錄條目,我們可以確保目錄中沒有衝突,並且應用程式只能看到有限的網路裝置集。
每個 sysfs 目錄條目都可以透過其 kernfs_node 的 void *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()