Fazer uma montagem de ligação entrar em vigor apenas no contexto do processo atual e seus descendentes

0

Eu tenho 2 arquivos: / MyDir / ae / MyDir / MySubDir / be estou executando um script bash, ao qual eu quero adicionar código para tornar o arquivo / um ponto para o arquivo / b, mas apenas no processo atual e seus descendentes.

Na esperança de fazer / MyDir / a apontar para / MyDir / MySubDir / b no contexto de apenas o processo atual (não incluindo seus descendentes, ainda) eu tentei primeiro fazer com que o processo atual fosse executado em seu próprio namespace de montagem executando um pequeno programa em C no meu script que executa

unshare(CLONE_NEWNS)

e depois

mount --bind /MyDir/MySubDir/b /MyDir/a.

Infelizmente, isso não funcionou como eu esperava, pois a montagem ainda era visível por outros processos, apesar do sucesso do relatório de chamadas do sistema.

Em outra tentativa, tentei fazer a montagem a partir do código C chamando

mount("/MyDir/a", "/MyDir/MySubDir/b", "ext3", MS_BIND, null)

Mas isso não funcionou, pois a montaria não teve efeito algum (apesar do sucesso do relatório de chamadas).

Existe uma maneira de fazer / MyDir / a apontar para / MyDir / MySubDir / b no contexto apenas do processo atual e seus descendentes usando um script bash?

Eu também li um pouco sobre o chroot, mas isso se aplica apenas ao diretório / ... Existe algo semelhante ao chroot que se aplica apenas a um subdiretório específico?

Obrigado pelo seu tempo!

    
por Ben S. 18.05.2018 / 21:03

2 respostas

1

Uma solução apenas de shell seria:

Para shell interativo:

# unshare --mount
# mount --bind /MyDir/MySubDir/b /MyDir/a
# 

não interativamente, antes de um script que não precisa saber sobre essas configurações:

# unshare --mount sh -c 'mount --bind /MyDir/MySubDir/b /MyDir/a; exec somethingelse'

A página de manual não compartilhada também avisa sobre as subárvores compartilhadas. Se você precisar desativá-los, considere adicionar, por exemplo, --make-private para montar.

Como Hauke disse, você tem que ter certeza de não deixar o namespace apenas depois de tê-lo criado, porque ele irá desaparecer.

Se necessário, há um método para manter um namespace sem processo. Como envolve o mount, é apenas um pouco mais complicado para um namespace de montagem. Aqui está um exemplo interativo para isso:

shell1# unshare --mount
shell1# echo $$
12345
shell1#

shell2# : > /root/mntreference
shell2# mount --bind /proc/12345/ns/mnt /root/mntreference

Agora, desde que essa referência seja mantida montada, o namespace não desaparecerá, mesmo que não haja mais nenhum processo usando-a. Usar nsenter --mount=/root/mntreference entrará, para que você possa facilmente executar scripts adicionais.

Usar o equivalente em C não deve ser um problema.

    
por 19.05.2018 / 02:07
1

Infelizmente, você ainda não explicou como o programa em C e o script estão relacionados.

Uma razão possível (e aqui provável) para o problema é: você chama o programa C a partir do script, mas a alteração do namespace é efetiva somente dentro do programa C (e possíveis filhos). Depois que o programa existe, a situação permanece inalterada para todos os comandos seguintes.

Você deve iniciar um shell a partir do programa C chamando execve() para o shell desejado.

    
por 19.05.2018 / 01:06