É possível juntar dois namespaces de processo diferentes?

1

Eu estou querendo saber se é possível juntar dois namespaces de processo no Linux. Para demonstrar o que quero dizer, o seguinte é um cenário:

1) Um processo é executado em seu próprio namespace separado. Vamos chamar este processo A.

2) Agora, o Processo A está fazendo o seu trabalho e eu giro outro processo B que está isolado dentro de seu próprio espaço de nomes separado.

3) Agora, o processo A e o processo B têm seu próprio espaço de nomes separado, mas desejo "mesclar" seus namespaces de processo como um só. Ou seja, quero que o Processo B seja capaz de ver o espaço de nomes de A e enviar sinais / interagir com os processos de A.

O caso de uso para isso é que, em última análise, quero anexar um contêiner a outro contêiner em execução, de forma que o contêiner anexo possa interagir com o contêiner em execução.

Pensei em setns, mas isso não funcionará porque o Processo B não tem idéia das alças de namespace do Processo A (/ proc / PID / ns / pid), pois também está em isolamento. Estou tentando pensar qual é a melhor maneira de conseguir isso a partir do sistema host.

Isso foi implementado no docker aqui , mas não consigo entender a lógica por trás dele. Alguns aspectos de implementação também são discutidos aqui se isso ajudar.

Obrigado pelo seu tempo!

    
por user182405 31.07.2016 / 22:06

2 respostas

1

Quando falamos de namespaces do Linux, na verdade estamos falando de vários espaços de nomes diferentes , os quais podem ser configurados separadamente:

  1. IDs de processo
  2. Memória compartilhada
  3. Rede
  4. Nome do host, etc
  5. IDs de usuário
  6. Sistema de arquivos

Quando um processo chama setns() ou clone() com os flags certos, um novo namespace é gerado com uma visão "falsa" do mundo.

Agora, isso pode causar problemas se quisermos mesclá-los novamente.

Vamos usar o namespace "ID do processo" porque é fácil.

Quando você cria um novo namespace PID, o primeiro processo obtém um PID de 1 dentro desse namespace. Se você tem dois novos namespaces, então você tem dois processos que pensam que são PID 1. Se você quiser mesclá-los, então você tem um conflito; apenas um deles pode manter o PID 1, você terá que alterar o PID do processo em execução inesperadamente. Isso pode ter consequências inesperadas.

Da mesma forma com o IPC; dois trechos separados de memória compartilhada poderiam ter o mesmo endereço dentro de seus respectivos namespaces; se tentarmos mesclá-los, veremos a corrupção da memória (mesmo se você alterasse o endereço de um segmento, os processos ainda teriam o endereço antigo).

Portanto, a fusão de dois namespaces existentes é perigosa.

O que os docker patches fazem é impedir que um novo namespace seja criado quando o container é inicializado. Isso é diferente de mesclar dois contêineres existentes; isso acontece no momento da partida do contêiner.

    
por 01.08.2016 / 14:17
0

Tanto quanto sei, não há como unir namespaces de processo diferentes. setns em um namespace PID permite apenas que um processo crie filhos em um namespace diferente, e que namespace diferente deve ser um descendente do namespace do processo, então não acho que isso possa ajudá-lo.

No entanto, no seu cenário, parece que os dois namespaces estão em árvores intimamente relacionadas. Então você poderia fazer essa manipulação do ancestral comum.

Os tópicos que você cita sobre o Docker não discutem a fusão de namespaces: eles não estão criando um namespace filho (para que ele permaneça como um grande namespace).

    
por 01.08.2016 / 02:23