问题标签 [linux-namespaces]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 为什么 unshare(CLONE_NEWNET) 需要 CAP_SYS_ADMIN?
我正在使用 linux 命名空间,我注意到如果用户想要在新的网络命名空间(不使用用户命名空间)中执行一个进程,他需要是 root 或有CAP_SYS_ADMIN
能力。
unshare(2)联机帮助页说:
CLONE_NEWNET(自 Linux 2.6.24 起)
此标志与 clone(2) CLONE_NEWNET 标志具有相同的效果。取消共享网络命名空间,以便将调用进程移动到一个新的网络命名空间,该命名空间不与任何先前存在的进程共享。使用 CLONE_NEWNET 需要 CAP_SYS_ADMIN 功能。
因此,如果我想在网络沙箱中执行 pdf 阅读器,我必须使用 user-net-namespaces 或一些特权包装器。
为什么?新进程将被放置在没有接口的新网络命名空间中,因此它将与真实网络隔离,对吧?无特权的非用户网络命名空间会引发哪些类型的问题/安全威胁?
c - 使用 CLONE_NEWNS 设置效果父级的 clone() 之后 mount()
我对这里发生的事情有点困惑。我正在遵循一个指南,其中在设置了 CLONE_NEWNS 标志的情况下调用克隆后添加了一个新的挂载点。挂载点应该只存在于子进程中。我正在尝试更改新的文件系统名称空间,它似乎会影响父名称空间。
我的 c 程序非常简单。Main 将调用 clone
args 是一个聊天数组,其中包含要执行的命令。
如果传递给 execvp 的命令是mount
我希望输出包含 /mytmp 挂载点,并mount
在程序退出后再次运行命令以看不到 /mytmp 出现。那没有发生。当调用 execvp 以及运行 mount 之后,我在外面看到它。
我尝试使用 MS_PRIVATE 标志安装并使用unshare(CLONE_FS);
我也遇到了类似的问题,我试图从子进程中卸载 /proc 并且 get resource is busy 错误。我认为新命名空间不应该发生这种情况。
linux - 我可以将内核线程从一个命名空间移动到另一个命名空间吗?
我们的情况是:
- 首先,我们有一个内核线程(比如 KS)在内核开始运行时开始运行;
- 然后当系统准备好时,我们创建另一个命名空间(比如 NS1),它与 LXC 具有不同的 mntns。
我们的要求是 KS 需要在只有 NS1 才能看到的路径中写一些东西。所以我在想我可以将 KS 移动到 NS1 命名空间(至少更改挂载命名空间)吗?如果是,如何?我检查了setns()
系统调用及其内核源代码,但仍然不知道该怎么做(在用户空间或更改 KS 源代码),甚至不确定这是否是解决问题的正确方法。
我的另一个问题是:我的理解是,如果内核任务(例如内核线程)在进程上下文中,它会感知“命名空间”,但我的朋友认为“命名空间”是一个用户空间概念,所有内核工作人员只知道关于根命名空间。哪一个是正确的?
c - clone 和 fork+unshare 的区别
不知何故,它更容易调用fork
,然后unshare
因为许多参数是通过复制fork
的,否则会被手动包装到clone
. clone
我的问题是,(1)调用在单独的命名空间中分叉一个新进程和(2)fork+unshare
分叉一个新进程然后离开父命名空间有什么区别。假设传递给clone
和的所有命名空间标志unshare
都是相同的。
因此,使用 fork,孩子很容易重用从父母那里继承的数据。
对于克隆,我们有时必须将数据包装到另一个结构中并将其传递void*
给clone
系统调用。
在我看来,在上面的例子中,唯一的区别是性能下降,而 fork 可能会更贵一些。但是,fork
两者都可以在新的命名空间中创建进程的方式为我节省了很多精力。
linux - 对 mount 系统调用中的 source 和 target 关键字感到困惑
我正在实现一个容器,该容器使用新的命名空间进行克隆,包括挂载、pid、用户命名空间等。孩子要做的第一步是挂载几个重要点,例如/proc
,/sys
和/tmp
使用mount
系统调用。
但是,我对source
传递给的参数列表中的字段有点困惑mount
。
来源的确切含义是什么?例如,挂载/tmp
似乎与源字符字符串无关。即使/tmp
使用::mount(nullptr, "/tmp", "tmpfs", 0, NULL)
. 我错过了什么吗?
c - 使用 CLONE_NEWNS 标志克隆后挂载文件系统
我正在尝试实现以下场景:
clone()
CLONE_NEWNS
带有标志的主进程(这意味着新的挂载命名空间)mount()
子进程中的新文件系统- 子进程已完成并且在此进程中创建的所有文件系统都已卸载
但它并没有像我预期的那样工作,我仍然在主进程中看到挂载的文件系统。我究竟做错了什么?
来源在这里https://github.com/dmitrievanthony/sprat/blob/master/src/container.c#L47
系统是默认的 AWS Ubuntu,
c - Failing example with LWN's "Namespaces in operation, part 4: more on PID namespaces"
The final example from this article fails to work as intended. This is the code:
My environment is Fedora 24, and this is the output I should receive:
- /li>
- /li>
However, this is the output I receive:
- /li>
- /li>
It's as if orphan
's child does nothing, and is never re-parented. However, running orphan
via simple_init
's shell (without ns_run
) works as expected.
linux - `/etc/sub{u,g}id`中用户的意义是什么?(帮助我了解用户命名空间)
我想确保我的 docker 容器中的任何用户始终映射到我的 docker 主机上的特定用户。我试过使用这个参考https://stackoverflow.com/a/35854547/1020678
中的用户名/etc/subuid
似乎被严格用作映射到值的键:<start id>:<range>
,但除此之外它似乎没有任何用途..
真正让我困惑的是用户的需求/etc/subuid
,当这个用户在 docker 容器中安装卷时似乎没有写入文件系统的权限。
遵循链接中的示例后,我以用户身份执行以下操作ns1
:
$ mkdir test && docker run -ti -v $(pwd)/test:/tmp alpine touch /tmp/foobar
返回:touch: /tmp/foobar: Permission denied
似乎用户ns1
没有任何好处--userns-remap=ns1
,那么为什么在为ns1-root
and启用用户命名空间时需要这个用户ns1-user1
?当权限设置正确时,这些用户可以写入 docker 卷,但为什么不ns1
呢?
/etc/subuid
是否有可能实现我的目标,或者我是否必须使用起始 ID 的偏移量(在我链接到的示例中为 500000)明确定义容器内外的所有用户/组?
linux - 从用户命名空间内部加入网络命名空间
Root 创建一个网络命名空间,并使用标志testns
克隆以将子节点放入用户命名空间。CLONE_NEWUSER
然后孩子尝试testns
通过调用加入setns
,这表明权限被拒绝。是否有任何替代方法可以让用户命名空间内的孩子加入网络命名空间?
刚刚写了以下测试:(在运行之前,我testns
通过调用创建sudo ip netns add testns
)
linux - 在网络命名空间中运行多个命令
我想一步在网络命名空间中运行一系列连接的 bash 命令,但似乎ip netns exec mynetns
只需要一个 bash 命令作为参数。例如:
...按预期工作。
...返回exec of "ip a" failed: No such file or directory
。
清楚地,
... 将返回网络命名空间和主机上的接口。
有没有办法让它工作?
手册只讲了一个命令,这不是一个很好的迹象......