Experimento 1
De fora do namespace, cat /proc/self/mountinfo
dá
291 34 0:37 / /tmp/IMJUSTTMP rw,relatime shared:152 - tmpfs tmpfs rw,size=102400k
34 23 0:32 / /tmp rw,nosuid,nodev shared:16 - tmpfs tmpfs rw
Então eu corro unshare -mU --map-root-user --propagation private /usr/bin/zsh
para obter um novo shell dentro de um namespace, mas dentro do namespace mount recém-criado, não consigo umount /tmp/IMJUSTTMP
, umount
apenas me diga que não está montado. Embora eu possa verificar o namespace de montagem recém-criado por cat /proc/self/mountinfo
, que fornece montagem privada
290 263 0:32 / /tmp rw,nosuid,nodev - tmpfs tmpfs rw
302 290 0:37 / /tmp/IMJUSTTMP rw,relatime - tmpfs tmpfs rw,size=102400k
Então, por que recebo umount: /tmp/IMJUSTTMP: not mounted.
quando tento desmontar /tmp/IMJUSTTMP
dentro do namespace?
Estou usando 5.0.9-arch1-1-ARCH, com kernel.unprivileged_userns_clone = 1
.
Experimento 2
Depois unshare -mU --map-root-user --propagation private /usr/bin/zsh
de , tentar criar um overlayfs também falha.
mkdir -p /tmp/IMJUSTTMP/work
mkdir /tmp/IMJUSTTEST
mount -t tmpfs -o size=100m tmpfs /tmp/IMJUSTTMP
mount -t tmpfs -o size=200M tmpfs /tmp/IMJUSTTEST
Todos terão sucesso conforme o esperado, enquanto todos os itens a seguir entrariam permission denied
no namespace.
mount -t overlay -o "lowerdir=/home/xtricman,upperdir=/tmp/IMJUSTTMP/,workdir=/tmp/IMJUSTTMP/work" overlay /home/xtricman
mount -t overlay -o "lowerdir=/tmp/IMJUSTTEST,upperdir=/tmp/IMJUSTTMP,workdir=/tmp/IMJUSTTMP/work" overlay /mnt
Adivinhação minha
Encontrei essas duas perguntas: Dentro de um namespace de usuário, por que não tenho permissão para remontar um sistema de arquivos que montei? e Por que não posso ligar "/" dentro de um namespace de usuário? Parece que, como eu herdo o /tmp/IMJUSTTMP
and /tmp
mount, não posso desmontá-los, mesmo que tenha recursos completos no namespace de usuário proprietário do namespace mount recém-criado.
Pergunta
Alguém pode explicar o que exatamente está acontecendo dos dois experimentos? Existe algum documento mencionando o comportamento detalhado do kernel de montagem e desmontagem dentro de um namespace de montagem? Qual é o "proprietário do superbloco" conforme mencionado neste commit do kernel e Por que não posso ligar "/" dentro de um namespace de usuário? ?
Sim :-). Há três pontos distintos aqui.
Experimento 1: Por que recebo
umount: /tmp/IMJUSTTMP: not mounted
quando tentoumount /tmp/IMJUSTTMP
entrar no namespace?http://man7.org/linux/man-pages/man7/mount_namespaces.7.html
Experimento 2: Tentar criar uma sobreposição também falha
O artigo do LWN de 2008 diz que os sistemas de arquivos que foram verificados como "seguros para uso em namespaces de usuário" são sinalizados como
FS_USERNS_MOUNT
. Assim, podemos pesquisar facilmente quais sistemas de arquivos são permitidos .Observe que esse sinalizador foi adicionado ao OverlayFS com a versão 5.11 do kernel . Portanto, agora você pode montar um dentro de um usuário privilegiado e montar um namespace.
Qual é o "proprietário do superbloco" conforme mencionado neste commit do kernel e a pergunta "Por que não posso vincular a montagem "/" dentro de um namespace de usuário?" ?
O código-fonte no commit do kernel ao qual você se vincula, diz que cada superbloco é considerado de propriedade de um namespace de usuário específico. O proprietário é o namespace do usuário que originalmente criou o superbloco.