首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Linux命令‘`unshare -pid=p--挂载=m’不创建一个持久的命名空间?

为什么Linux命令‘`unshare -pid=p--挂载=m’不创建一个持久的命名空间?
EN

Unix & Linux用户
提问于 2022-07-22 02:03:25
回答 2查看 347关注 0票数 2

从我在unsharensenter手册页中看到的所有内容来看,我应该能够绑定--将一个目录挂载到自己,mount --make-private目录,然后使用该目录中的文件来保存永久名称空间的参考资料。下面是我正在做的事情,基本上与man unshare相同,但使用不同的目录,除了使用--mount=file之外,还使用--pid=file

1号终端:

代码语言:javascript
复制
# mkdir -p /mnt/jails/debian/bookworm/.ns
# mount --bind /mnt/jails/debian/bookworm/.ns /mnt/jails/debian/bookworm/.ns
# touch /mnt/jails/debian/bookworm/.ns/{mount,pid}
# mount --make-private /mnt/jails/debian/bookworm/.ns
# unshare --fork --mount-proc --mount=/mnt/jails/debian/bookworm/.ns/mount --pid=/mnt/jails/debian/bookworm/.ns/pid /bin/sh & echo $!; fg
[1] 151299
151299
sh-4.4# echo $
1
sh-4.4# grep NS /proc/self/status
NStgid: 3
NSpid:  3
NSpgid: 3
NSsid:  0

到目前为止,上面的容器还能用。在此期间:

2号航站楼:

代码语言:javascript
复制
# nsenter  --mount=/mnt/jails/debian/bookworm/.ns/mount --pid=/mnt/jails/debian/bookworm/.ns/pid /bin/sh
sh-4.4# ps ax
Error, do this: mount -t proc proc /proc
# ls /proc/1/exe -l
lrwxrwxrwx. 1 root root 0 Jul 21 18:49 /proc/1/exe -> /usr/bin/bash
sh-4.4# mount -t proc proc /proc
sh-4.4# ps ax|head

sh-4.4# grep NS /proc/self/status
NStgid: 156987
NSpid:  156987
NSpgid: 156987
NSsid:  156921

我还在终端2(请注意来自终端1的pid )中尝试过这种方法,结果完全相同:

代码语言:javascript
复制
# nsenter -t 151299 -a  /bin/sh
sh-4.4# ps ax
Error, do this: mount -t proc proc /proc
# ls /proc/1/exe -l
lrwxrwxrwx. 1 root root 0 Jul 21 18:49 /proc/1/exe -> /usr/bin/bash
sh-4.4# mount -t proc proc /proc
sh-4.4# ps ax|head

sh-4.4# grep NS /proc/self/status
NStgid: 155356
NSpid:  155356
NSpgid: 155356
NSsid:  143538

由于某种原因,nsenter正在进入主机OS的pid空间,但是它似乎确实看到了正确的/proc目录的名称空间,但是对于terminal2中的sh来说,它是无效的,因为pid名称空间不起作用,所以(我认为)这就是为什么ps ax会出现错误。此外,我也尝试过有和没有-挂载

问题:

如何从终端1输入PID命名空间?

我在这里做错什么了?

(主机linux内核为5.18,运行Oracle Linux 8。)

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2022-07-25 05:17:09

在这个提交中修补的util v2.36之前有一个bug:

0d5260b66取消共享:修复PID和时间命名空间持久性

使用包含修补程序的util版本!

下面是一个测试脚本,用于验证是否存在此bug:

代码语言:javascript
复制
umount -l /mnt/jails/*/*/.ns/* /mnt/jails/*/*/.ns/
sleep 1

mkdir -p /mnt/jails/debian/bookworm/.ns
mount --bind /mnt/jails/debian/bookworm/.ns /mnt/jails/debian/bookworm/.ns
touch /mnt/jails/debian/bookworm/.ns/{mount,pid}
mount --make-private /mnt/jails/debian/bookworm/.ns

unshare --fork --mount-proc --mount=/mnt/jails/debian/bookworm/.ns/mount --pid=/mnt/jails/debian/bookworm/.ns/pid sleep 99 &
upid=$!

sleep 1

if nsenter --mount=/mnt/jails/debian/bookworm/.ns/mount --pid=/mnt/jails/debian/bookworm/.ns/pid [ -d /proc/self ]; then
    kill $upid
    echo worked
    exit 0
else
    kill $upid
    echo didnt
    exit 1
fi
票数 1
EN

Unix & Linux用户

发布于 2022-07-24 20:50:33

首先,我怀疑这件事:

代码语言:javascript
复制
...  /bin/sh & echo $!; fg

这似乎总是随着外壳的离开和我的终端处于一种奇怪的状态而结束。所以不要那样做,只要跑:

代码语言:javascript
复制
unshare --fork --mount-proc --mount=/mnt/jails/debian/bookworm/.ns/mount --pid=/mnt/jails/debian/bookworm/.ns/pid

现在,您可以在自己的挂载和pid名称空间中运行一个shell。

我还在终端2(请注意来自终端1的pid )中尝试过这种方法,结果完全相同:

我们讨论了这个其他地方;如果停止使用进程ids,您的生活会更简单,特别是因为您已经开始创建持久名称空间了。-t 的整数,使用您创建的持久名称空间:

代码语言:javascript
复制
# nsenter --mount=/mnt/jails/debian/bookworm/.ns/mount --pid=/mnt/jails/debian/bookworm/.ns/pid
# ps -fe
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 16:45 pts/4    00:00:00 /bin/sh
root           3       0  1 16:48 pts/15   00:00:00 -bash
root          41       3  0 16:48 pts/15   00:00:00 ps -fe

如您所见,我们已经成功地输入了前面的unshare命令创建的名称空间。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/710809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档