0

我们的情况是:

  1. 首先,我们有一个内核线程(比如 KS)在内核开始运行时开始运行;
  2. 然后当系统准备好时,我们创建另一个命名空间(比如 NS1),它与 LXC 具有不同的 mntns。

我们的要求是 KS 需要在只有 NS1 才能看到的路径中写一些东西。所以我在想我可以将 KS 移动到 NS1 命名空间(至少更改挂载命名空间)吗?如果是,如何?我检查了setns()系统调用及其内核源代码,但仍然不知道该怎么做(在用户空间或更改 KS 源代码),甚至不确定这是否是解决问题的正确方法。

我的另一个问题是:我的理解是,如果内核任务(例如内核线程)在进程上下文中,它会感知“命名空间”,但我的朋友认为“命名空间”是一个用户空间概念,所有内核工作人员只知道关于根命名空间。哪一个是正确的?

4

1 回答 1

-1

不,这不是解决问题的正确方法。从内核线程写入任何命名空间的整个想法都是不好的,如下详细解释:http ://www.linuxjournal.com/article/8110 。在使用 setns(2) 系统调用输入所需的挂载名称空间后,您应该从用户空间执行此操作。setns(2) 手册页有一个示例代码可以做到这一点。

您的另一个问题的答案是您的朋友错了;命名空间设置和相关处理在内核内部由内核完成,因此内核必须了解所有命名空间的所有信息。每个任务的 struct_task 包含 nsproxy struct 成员,其中包含指向相应名称空间数据结构的所有相关指针——这些是仅限内核的数据结构。用户空间实际上对此一无所知(除了在 clone() 中请求它)。在挂载命名空间的情况下,用户进程将获得一个挂载表:与父进程相同的表,或者如果克隆(flags=CLONE_NEWNS)请求了新的挂载命名空间,则为私有副本。无论哪种方式,用户进程都只使用它所传递的任何挂载表(结构),

于 2017-04-01T03:26:54.437 回答