2016-10-05 112 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

非常感谢! –

相关问题