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

12

Estou tentando entender como funciona o namespace de montagem do Linux. Então, fiz uma pequena experiência e 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 a montagem é visível no Terminal 2? Como não faz parte do namespace de montagem, esperava que o diretório aparecesse vazio aqui. Também tentei passar -o shared=no e usar --make-private opções com mount , mas obtive o mesmo resultado.

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

    
por FatalError 30.11.2015 / 04:58

2 respostas

11

Se você estiver em uma distribuição baseada em systemd com uma versão util-linux menor que 2.27, você verá esse comportamento não intuitivo. Isso ocorre porque CLONE_NEWNS propaga sinalizadores como shared dependendo de uma configuração no kernel. Essa configuração é normalmente private , mas o systemd altera isso para shared . A partir de util-linux 2.27, foi feito um patch que altera o comportamento padrão do comando unshare usar private como comportamento de propagação padrão para ser mais intuitivo.

Solução

Se você estiver em um sistema systemd com < 2,27 util-linux , deverá remontar o sistema de arquivos raiz após executar o comando unshare :

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

Se você estiver em um sistema systemd com > = 2,27 util-linux , ele deve funcionar como esperado no exemplo fornecido em sua pergunta, literalmente, sem a necessidade de remontar. Caso contrário: passe --propagation private para o comando unshare para forçar a propagação do namespace de montagem para ser privado.

    
por 30.11.2015 / 19:19
0

isso não funcionou no Ubuntu (15.04 e 14.04). funcionou no fedora. e para o fedora. Se você precisa - make-private ou não, você também pode verificar

cat /proc/self/mountinfo | grep shared

se compartilhado, isso significa que algum outro namespace ainda pode ver essas montagens. Então é questão relacionada com o sistema. Você pode usar --make-private para fazer isso funcionar

    
por 07.12.2015 / 04:58