O espaço para nomes de montagem do Linux é considerado nocivo?

1

Em um aplicativo, eu preciso temporariamente "mudar" para um espaço de nomes de montagem específico para verificar algumas coisas dentro dele em /proc , depois voltar para o espaço de nomes de montagem com o qual meu aplicativo foi iniciado e alternar para outro namespace de montagem etc, etc.

O aplicativo é iniciado com o namespace de montagem "root" e sob o usuário root (dois conceitos básicos diferentes aqui!).

Sob o capô, setns() é usado para alternar e voltar. Além disso, uso a biblioteca Python nsenter do Zalando. Esta biblioteca permite "entrar" em um namespace específico abrindo primeiro um fd para /proc/self/ns/[nstype] a ser usado posteriormente para voltar. Em seguida, ele leva o caminho para um namespace no sistema de arquivos, abre um fd a partir dele e se associa via setns(fd, 0) . Depois, o primeiro fd é usado para unir o namespace original, usando setns() novamente. Isso funciona lindamente para, digamos, namespaces de rede.

Mas, para saltar namespaces de montagem, ele falha ao tentar inserir novamente o mesmo namespace de montagem, depois de tê-lo deixado antes. Pular aqui significa: meu aplicativo insere um namespace de montagem, faz algum trabalho, retorna ao namespace de montagem original, alterna para um namespace de montagem novamente, alterna de volta, etc.

Por que vale a pena: o problema parece entrar em contêineres em contêineres.

Existe alguma restrição na troca de namespaces de montagem? Possivelmente relacionado a namespaces de usuário? A página de manual do namespace menciona alguma relação com namespaces de usuários, mas eu não entendo Como um namespace de usuário diferente ativo quando o namespace de montagem de um contêiner foi criado afeta meu aplicativo do namespace de usuário raiz com direitos de root em relação a alternar para e fora desses namespaces de montagem de contêiner. Mudar para um namespace de montagem faz com que meu aplicativo perca direitos, então ele falha mais tarde?

Então, com um aceno para os gigantes: o namespace de montagem é considerado prejudicial?

    
por TheDiveO 27.06.2018 / 18:18

1 resposta

0

Provavelmente, esta cópia minúscula perto do final da página man para setns (2) é a chave para meus problemas:

Changing the mount namespace requires that the caller possess both CAP_SYS_CHROOT and CAP_SYS_ADMIN capabilities in its own user namespace and CAP_SYS_ADMIN in the target mount namespace.

Eu suspeito que meu aplicativo / processo perde alguns CAPs após ter entrado em um namespace de montagem de contêiner dentro de outro contêiner, por isso ele está bloqueado dentro do namespace de montagem. O que ainda me faz pensar: nenhum erro / exceção ao tentar se associar com o namespace da montagem raiz ...

O típico usecase para switching provavelmente está mudando para um namespace de destino, e então morre, mas nunca retorna. Parece que não há nenhuma linha de vida para retornar, no caso de namespaces de montagem.

    
por 28.06.2018 / 22:00