当使用 --fork 为 `nsenter -t 时,如何获取 `unshare` 的子 pid`?

当使用 --fork 为 `nsenter -t 时,如何获取 `unshare` 的子 pid`?

使用 时unshare --pid --fork,该nsenter命令必须附加到子 pid 而不是unsharepid 以获取正确的 pid 命名空间。

我可以按如下方式获取 unshare 的 pid:

unshare --pid --mount --fork --mount-proc  bash & 
echo PID: $!
fg

但我需要unshare孩子的 pid (2914003) 才能输入正确的命名空间:

ps wwfuax | grep -A1 unshare 
2914002 pts/4    S      0:00  |           \_ unshare --pid --mount --fork --mount-proc bash
2914003 pts/4    S+     0:00  |               \_ bash

这有效:nsenter -t 2914003 这不起作用:nsenter -t 2914002

我希望有某种选择,unshare --show-child-pid但没有。

有什么可靠的方法可以获取 unshare 子进程的 pid?

答案1

最好的解决方案是不依赖进程 ID。

当您使用 unshare 命令创建命名空间时,您可以创建由文件系统上的绑定挂载引用的持久命名空间。我们可以按照手册页中的示例进行设置unshare(1)

首先,我们需要设置一个带有private传播的挂载点:

mkdir /tmp/ns
mount --bind /tmp/ns /tmp/ns
mount --make-private /tmp/ns

然后我们需要 mount 和 pid 命名空间的目标文件:

touch /tmp/ns/{mnt,pid}

现在我们使用以下命令创建命名空间unshare

unshare --pid=/tmp/ns/pid --mount=/tmp/ns/mnt --fork --mount-proc  bash

使用这些引用挂载点,我们可以在不知道进程 ID 的情况下输入名称空间:

nsenter --mount=/tmp/ns/mnt --pid=/tmp/ns/pid

完成后,不要忘记清理:

umount /tmp/ns/{mnt,pid}

相关内容