【问题标题】:Can I move a kernel thread from one namespace to another?我可以将内核线程从一个命名空间移动到另一个命名空间吗?
【发布时间】:2017-02-13 15:18:07
【问题描述】:

我们的情况是:

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

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

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

【问题讨论】:

    标签: linux kernel linux-namespaces


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 2012-08-06
      • 2012-05-27
      相关资源
      最近更新 更多