使用现有的挂载命名空间创建新的进程命名空间

使用现有的挂载命名空间创建新的进程命名空间

一旦我退出由取消共享创建的进程命名空间,我就无法弄清楚如何创建新的进程命名空间。例如,我有以下内容。

unshare -f --mount-proc --mount=/containers/1/ns/mnt --pid=/containers/1/ns/pid

在另一个终端中,我输入这个名称空间。

nsenter --mount=/containers/1/ns/mnt --pid=/containers/1/ns/pid

一旦我退出通过 unshare 启动的 shell,我就无法再重新进入。

nsenter:分叉失败:无法分配内存

我从中得到了以下想法中等职位。但这每次都会创建一个新的进程命名空间,这不是我想要的。

nsenter --mount=/containers/1/ns/mnt unshare -f --mount-proc --pid

我无法让它与 pid 文件一起工作,也不明白问题是什么。

nsenter --mount=/containers/1/ns/mnt unshare -f --mount-proc --pid=/containers/1/ns/pid
unshare: cannot stat /proc/11379/ns/mnt: No such file or directory

我尝试从 unshare 启动的 shell 中运行 nsenter,但得到以下结果。

nsenter:重新关联到命名空间“ns/mnt”失败:参数无效

最后,我找到了一个解决方案,我相信它可以满足我的要求,但它很尴尬,并且需要创建两个进程,因为第一个进程不在正确的安装命名空间中。

# Terminal 1
unshare -f --mount-proc --pid=/containers/1/ns/pid
# Terminal 2
nsenter --mount=/containers/1/ns/mnt --pid=/containers/1/ns/pid unshare -f --mount-proc

一旦退出原始进程命名空间并重新运行脚本以在安装命名空间中设置所有内容,我就可以重新开始,但我认为有办法做到这一点,而无需每次都完全重新开始。

答案1

我终于想出了以下内容。诀窍在于,您必须将输入挂载命名空间夹在输入进程命名空间和挂载进程之间。该--mount-proc标志意味着一个新的挂载命名空间,显然,一旦您已经使用取消共享创建了挂载命名空间,就无法进入现有的挂载命名空间。这是重新关联错误消息。

# Terminal 1
unshare --pid=/containers/1/ns/pid -f nsenter --mount=/containers/1/ns/mnt unshare --mount-proc
# Terminal 2
nsenter --pid=/containers/1/ns/pid --mount=/containers/1/ns/mnt unshare --mount-proc

这样做的一个缺点是终端 1 和 2 中的 shell 现在位于不同的挂载命名空间中,因此即使它们共享现有挂载,一个终端中的任何未来更改也不会被另一个终端看到。然而,我意识到无论如何这样做都是没有意义的。由于挂载命名空间不会在重新启动后持续存在,因此我不妨重新运行我的脚本,而不是陷入所有这些麻烦。

相关内容