Por que minha montagem de ligação é visível fora do seu namespace de montagem?

12

Então, eu estou tentando entender como o namespace de montagem do Linux funciona. Então, fiz um pequeno experimento, abri dois terminais e executei o seguinte:

Terminal 1

root@goliath:~# mkdir a b
root@goliath:~# touch a/foo.txt
root@goliath:~# unshare --mount -- /bin/bash
root@goliath:~# mount --bind a b
root@goliath:~# ls b
foo.txt

Terminal 2

root@goliath:~# ls b
foo.txt

Como é que a montagem é visível no Terminal 2? Como ele não faz parte do espaço para nome da montagem, eu esperava que o diretório aparecesse vazio aqui. Também tentei passar -o shared=noe usar --make-privateopções com mount, mas obtive o mesmo resultado.

O que estou perdendo e como posso torná-lo realmente privado?

Erro fatal
fonte
As montagens são de todo o sistema, não são específicas para um ambiente de shell. compartilhado, escravo, privado e desatável não são o que você pensa que são. leia man mount.
cas
3
@cas: Concordo que --make-privatenão é o que eu quero. Mas, esse não é o ponto de montagem dos namespaces (que eles não são de todo o sistema)?
FatalError

Respostas:

11

Se você estiver em uma distribuição baseada em sistema com uma util-linuxversão menor que 2,27, verá esse comportamento não intuitivo. Isso ocorre porque CLONE_NEWNSpropaga sinalizadores, como shareddepender de uma configuração no kernel. Essa configuração é normalmente private, mas systemd altera isso para shared. A partir da util-linuxversão 2.27, foi feito um patch que altera o comportamento padrão do unsharecomando para usar privatecomo comportamento de propagação padrão, para ser mais intuitivo.

Solução

Se você estiver em um sistema systemd com <2,27 util-linux, remonte o sistema de arquivos raiz depois de executar o unsharecomando:

# unshare --mount -- /bin/bash
# mount --make-private -o remount /

Se você estiver em um sistema systemd com> = 2,27 util-linux, ele deve funcionar conforme o esperado no exemplo que você deu na sua pergunta, literalmente, sem a necessidade de remontar. Caso contrário: passe --propagation privatepara o unsharecomando para forçar a propagação do espaço para nome de montagem a ser privado.

Dave
fonte
0

isso não funcionou no ubuntu, (15.04 e 14.04). funcionou no fedora. e para o fedora. se você precisa - tornar privado ou não, você também pode verificar

cat / proc / self / mountinfo | grep compartilhou

se compartilhado, significa que algum outro espaço de nome ainda pode ver essa montagem. Então é problema relacionado ao systemd. Você pode usar --make-private para fazê-lo funcionar

Kennan
fonte