我们的情况是:
- 首先我们有一个内核线程(比如KS),当内核开始运行时,它开始运行; 然后,当系统准备好时,我们创建另一个名称空间(例如NS1),它与LXC具有不同的名称空间。
我们的要求是KS需要在一个只能被NS1看到的路径上写一些东西。所以我在想我能把KS移动到NS1名称空间(至少改变挂载名称空间)吗?如果是,怎么做?我已经检查了setns()
系统调用及其内核源代码,但仍然不知道如何做到这一点(无论是在用户空间还是更改KS源代码),甚至不确定这是否是解决问题的正确方法。
我的另一个问题是:我的理解是,一个内核任务(例如,内核线程)知道"名称空间",如果它是在进程上下文中,但我的朋友认为"名称空间"是一个用户空间的概念,所有内核人员只知道根名称空间。哪一个是正确的?
不,这不是解决问题的正确方法。从内核线程向任何名称空间写入的整个想法都是不好的,这里有详细解释:http://www.linuxjournal.com/article/8110。在使用setns(2)系统调用输入所需的挂载名称空间之后,应该从用户空间执行此操作。settings(2)手册页有一个示例代码。
另一个问题的答案是你的朋友错了;名称空间的设置和相关处理是由内核在内核内部完成的,因此内核必须知道所有名称空间的所有信息。每个任务的struct_task都包含nsproxy结构成员,其中包含指向各自名称空间数据结构的所有相关指针——这些都是仅内核的数据结构。用户空间实际上对此一无所知(除了在clone()中请求它之外)。对于挂载名称空间,用户进程将获得一个挂载表:要么是与父进程相同的挂载表,要么是克隆请求新的挂载名称空间时的私有副本(flags=CLONE_NEWNS)。无论哪种方式,用户进程都只是使用它所提供的任何挂载表(结构),内核在用户不知道的情况下管理名称空间的细节。