
Existe algum namespace (processo, usuário, etc) que isole variáveis de ambiente?
Caso haja, o que acontece quando você unshare
? Eles são clonados? O que acontece se um processo alterar uma variável existente?
EDITAR: estou usando Ubuntu
Responder1
Você não precisa de nenhum namespace para isolar variáveis de ambiente. Eles já estão isolados e privados para cada processo. Modificar uma variável de ambiente em um processo filho NÃO será propagado para seu pai.
Variáveis de ambiente no Unix são apenas um monte de strings armazenadas no espaço de endereço de um processo. Quando um processo se bifurca, seus filhos “herdarão” uma cópia deles junto com todo o espaço de endereço, e quando um programa executa outro (e substitui todo o conteúdo do espaço de endereço), eles devem ser passados explicitamente como o envp
argumento para a execve(2)
chamada do sistema se eles devem ser preservados.
Se você quiser iniciar um processo com umvazioambiente, você pode iniciá-lo como
env - cmd ...
que apenas chamará execve("/path/to/cmd", ["cmd", ..., NULL], [NULL])
.
Ou para executá-lo com um ambiente contendo apenas FOO=bar
:
env - FOO=bar cmd ...
Tanto o namespace que afeta as chamadas do sistema ( clone(2)
, unshare(2)
, setns(2)
) quanto os utilitários de linha de comando unshare(1)
não consideram ou afetam o ambiente de nenhuma maneira especial.
Nota: É assim que funciona no Unix, não em alguma lei da natureza. Em outros sistemas como o plan9 (onde o conceito de namespace se originou, mas onde todos os namespaces são basicamentemontarnamespaces, já que tudo que existe é um arquivo/sistema) oambienteé apenas um sistema de arquivos montado por padrão /env
e, ao contrário do Unix,compartilhadopor padrãoentre o pai e o filho.
Responder2
As variáveis de ambiente bash
têm escopo apenas para uma instância específica do shell, portanto, não há necessidade de definir namespaces separados para elas.
Você pode ver isso claramente se abrir duas janelas de terminal ao mesmo tempo (em um ambiente de área de trabalho). Crie uma nova variável de ambiente em um deles, por exemplo:
TEST_VAR=34
Não aparecerá na bash
sessão na outra janela do terminal.