我注意到一种奇怪的行为nsenter
,正在寻找一些解释。
当我进入使用创建的另一个进程的命名空间时,unshare
我观察到将根目录指定为常规路径与使用符号链接的情况之间产生的行为的差异/proc/PID/root
。
这是示例设置。
准备目标进程
sudo unshare --mount --mount-proc --pid --fork --root /tmp/jail bash
/tmp/jail
里面有一个Linux发行版(我通过docker export
使用ubuntu
图像来准备它):$ docker run ubuntu (grab the container ID) $ docker export 8c67e1fb5443 > ubuntu.tar $ mkdir /tmp/jail && cd /tmp/jail && tar -xf ~/ubuntu.tar
从另一个终端尝试进入该进程的命名空间
sudo nsenter --target=28716 --root=/tmp/jail --all bash
尝试
ps
命令在这里我观察到错误:
root@ubuntu:/proc# ps Error, do this: mount -t proc proc /proc root@ubuntu:/proc# mount mount: failed to read mtab: No such file or directory
然而,如果我指定--root=/proc/28716/root
它nsenter
,它就会突然开始工作。
$ sudo readlink /proc/28716/root
/tmp/jail
$ sudo nsenter --target=28716 --root=/proc/28716/root --all bash
root@ubuntu:.# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4624 3712 ? S+ 21:04 0:00 bash
root 31 0.0 0.0 4624 3712 ? S 21:10 0:00 bash
root 39 0.0 0.0 7060 2944 ? R+ 21:10 0:00 ps aux
root@ubuntu:.# mount
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
造成这种现象的原因是什么?既然符号链接和常规路径指向同一个目录,为什么它们会有区别?
$ sudo nsenter --target=28716 --root=/proc/28716/root --all bash # WORKS GOOD
$ sudo nsenter --target=28716 --root=/tmp/jail --all bash # DOES NOT WORK GOOD
(where /proc/28716/root is symlink to /tmp/jail)
strace
源代码似乎都nsenter
不能解释这些差异。
6.8.0-49-generic
Ubuntu 24.04.1 LTS
这种行为似乎在
proc_pid_root(5)
手册页中有明确记录,其中写道: