Linux 中 Pid 和 Mnt 命名空间重用的问题

2018-08-28 09:05:28 +08:00
 miniliuke
1、我运行了一个进程使用了新的六个命名空间,然后把 /proc/进程号 /ns 下面的六个命名空间 Mount (防止进程关闭后这些文件被删)了,然后关闭,进程但是不知道为什么 Mount 没报错,但是 mnt (即 mount namespace )没有被 Mount......
2、我使用 Mount 上的命名空间新建进程,发现其他命名空间可以,但是使用 Pid 命名空间时,无法创建新进程,估计是因为,Pid 命名空间里没有 Pid 1 了,所以我想问怎么重用 Pid 命名空间(在创建这个空间的进程已经关闭的情况下)
3233 次点击
所在节点    Linux
27 条回复
zealot0630
2018-08-28 13:59:20 +08:00
是的,pid namespace 里面的 init 进程如果退出,这个 namespace 就用不了了。这点和其他 namespace 行为不一样,因为 init 进程在 pid namespace 里面有特殊作用
miniliuke
2018-08-28 14:00:33 +08:00
@zealot0630 那为什么 setns 无法设置 mnt namespace,这又是为什么......
henglinli
2018-08-28 16:51:04 +08:00
@miniliuke 最近折腾过 flatpak,你试试 unprivileged user namespaces kernel.unprivileged_userns_clone
miniliuke
2018-08-28 16:52:13 +08:00
@raysonx
@zealot0630 看了 docker 的实现,终于知道为什么加载不了 mnt ns 了,是 golang 的锅......但是 mount --bind /proc/22752/ns/mnt namespace/test/mnt 还是会报错,不知道为什么 mnt 不能被 mount,其他都可以,可能有什么奇奇怪怪的机制吧
miniliuke
2018-08-28 16:54:59 +08:00
@henglinli 发现全是 Golang 的锅,现在只有一个问题了,为什么 mount --bind /proc/22752/ns/mnt namespace/test/mnt 会报错.......报错:mount: wrong fs type, bad option, bad superblock on /proc/22752/ns/mnt,missing codepage or helper program, or other error
raysonx
2018-08-28 17:45:17 +08:00
@miniliuke 应该是 propagation flag 造成的问题。
建议你参考一下"man unshare" 给出的示例:
# mount --bind /root/namespaces /root/namespaces
# mount --make-private /root/namespaces
# touch /root/namespaces/mnt
# unshare --mount=/root/namespaces/mnt

换句话讲,你的 namespace/test/mnt 文件所属的 mounting point 的 propagation flag 必须是 private.
miniliuke
2018-08-28 20:26:26 +08:00
@raysonx 的确是这个问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/483831

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX