2016-10-05 81 views
0

我們的情況是:我可以將內核線程從一個名稱空間移動到另一個名稱空間嗎?

  1. 首先我們有一個內核線程(說KS)啓動時,內核開始運行運行;
  2. 然後,當系統準備就緒時,我們創建另一個命名空間(比如NS1),它與LXC有不同的mntns。

我們的要求是KS需要寫一些只能被NS1看到的路徑。所以我想我可以將KS移動到NS1名稱空間(至少更改掛載名稱空間)?如果是,如何?我已經檢查了setns()系統調用及其內核源代碼,但仍然不知道如何做(無論是在用戶空間還是更改KS源代碼),甚至不知道這是否是解決問題的正確方法。我的另一個問題是:我的理解是,如果一個內核任務(如內核線程)在進程上下文中知道「命名空間」,但我的朋友認爲「命名空間」是一個用戶空間概念,所有內核員工只知道根名稱空間。哪一個是正確的?

回答

-1

不,這不是解決您的問題的正確方法。從內核線程寫入任何命名空間的整個想法都很糟糕,如下所述:http://www.linuxjournal.com/article/8110。在使用setns(2)系統調用輸入所需的裝入名稱空間後,應該從用戶空間執行此操作。 setns(2)手冊頁提供了一個示例代碼。

你的其他問題的答案是你的朋友是錯的;名稱空間設置和相關處理在內核中由內核完成,因此內核必須知道所有名稱空間的所有內容。每個任務的struct_task都包含nsproxy結構成員,其中包含指向各個名稱空間數據結構的所有相關指針 - 這些指針僅用於內核數據結構。用戶空間實際上並不知道這件事(除了在clone()中請求它之外)。在裝載名稱空間的情況下,用戶進程將傳遞一個裝載表:與父進程相同,或者如果clone(flags = CLONE_NEWNS)請求了新的裝入名稱空間,則爲私有副本。無論哪種方式,用戶進程只是使用它交給的任何掛載表(結構體),並且內核管理名稱空間細節而用戶不知道它。

+0

非常感謝! –

相關問題