从我在unshare和nsenter手册页中看到的所有内容来看,我应该能够绑定--将一个目录挂载到自己,mount --make-private目录,然后使用该目录中的文件来保存永久名称空间的参考资料。下面是我正在做的事情,基本上与man unshare相同,但使用不同的目录,除了使用--mount=file之外,还使用--pid=file
# 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到目前为止,上面的容器还能用。在此期间:
# 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 )中尝试过这种方法,结果完全相同:
# 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。)
发布于 2022-07-25 05:17:09
在这个提交中修补的util v2.36之前有一个bug:
使用包含修补程序的util版本!
下面是一个测试脚本,用于验证是否存在此bug:
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发布于 2022-07-24 20:50:33
首先,我怀疑这件事:
... /bin/sh & echo $!; fg这似乎总是随着外壳的离开和我的终端处于一种奇怪的状态而结束。所以不要那样做,只要跑:
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 的整数,使用您创建的持久名称空间:
# 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命令创建的名称空间。
https://unix.stackexchange.com/questions/710809
复制相似问题