我们的情况是:
我们的要求是KS需要在只能由NS1看到的路径中写东西。所以我想我可以将KS移动到NS1名称空间(至少更改mount命名空间)吗?如果有,怎么样?我检查了setns()
系统调用及其内核源代码,但仍然不知道如何操作(在用户空间或更改KS源代码),甚至不确定这是否正确解决问题。
我的另一个问题是:我的理解是内核任务(例如,内核线程)在进程上下文中意识到“命名空间”,但我的朋友认为“命名空间”是用户空间概念,所有内核员工只知道根命名空间。哪一个是正确的?
答案 0 :(得分:-1)
不,这不是解决问题的正确方法。从内核线程写入任何命名空间的整个想法都很糟糕,详见此处:http://www.linuxjournal.com/article/8110。在使用setns(2)系统调用输入所需的安装名称空间后,应该从用户空间执行此操作。 setns(2)手册页有一个示例代码。
你的另一个问题的答案是你的朋友错了;名称空间设置和相关处理由内核在内核中完成,因此内核必须知道所有名称空间的所有内容。每个任务的struct_task包含nsproxy struct成员,其中包含指向相应名称空间数据结构的所有相关指针 - 这些是仅内核数据结构。用户空间实际上对此没有任何了解(除了在clone()中请求它)。如果是安装名称空间,则会向用户进程发送挂载表:与父表的挂载表相同;如果克隆请求新的挂载名称空间(flags = CLONE_NEWNS),则为私有副本。无论哪种方式,用户进程只使用它所传递的任何挂载表(结构),并且内核管理名称空间细节而用户不知道它。