Variáveis ​​de ambiente ao executar unshare

Variáveis ​​de ambiente ao executar unshare

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 envpargumento 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 /enve, ao contrário do Unix,compartilhadopor padrãoentre o pai e o filho.

Responder2

As variáveis ​​de ambiente bashtê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 bashsessão na outra janela do terminal.

informação relacionada