Estou percebendo um comportamento estranho para nsenter
o qual estou procurando uma explicação.
Quando entro nos namespaces de outro processo criado, unshare
observo as diferenças no comportamento resultante entre os casos em que especifico o diretório raiz como um caminho regular e em que uso /proc/PID/root
um link simbólico.
Aqui está o exemplo de configuração.
Preparar processo de destino
sudo unshare --mount --mount-proc --pid --fork --root /tmp/jail bash
/tmp/jail
tem um distributivo linux dentro (eu o preparodocker export
usandoubuntu
imagem):$ docker run ubuntu (grab the container ID) $ docker export 8c67e1fb5443 > ubuntu.tar $ mkdir /tmp/jail && cd /tmp/jail && tar -xf ~/ubuntu.tar
De outro terminal tente inserir os namespaces desse processo
sudo nsenter --target=28716 --root=/tmp/jail --all bash
ps
Comando TryAqui observo o erro:
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
No entanto, se eu especificar --root=/proc/28716/root
, nsenter
de repente ele começa a funcionar.
$ 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)
Quais são as razões para esse comportamento? Por que symlink vs. regular path faz diferença, já que eles apontam para o mesmo diretório?
$ 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)
Nem strace
o código fonte nem o código fonte nsenter
parecem sugerir a explicação para essas diferenças.
6.8.0-49-generic
Ubuntu 24.04.1 LTS
Esse comportamento parece estar explicitamente documentado na
proc_pid_root(5)
página de manual , que diz: