Como criar vários namespace de rede a partir de uma única instância de processo

Eu estou usando a seguinte função C para criarvários namespaces de rede a partir de uminstância de processo único:

void create_namespace(const char *ns_name)
{
    char ns_path[100];

    snprintf(ns_path, 100, "%s/%s", "/var/run/netns", ns_name);
    close(open(ns_path, O_RDONLY|O_CREAT|O_EXCL, 0));
    unshare(CLONE_NEWNET);
    mount("/proc/self/ns/net", ns_path, "none", MS_BIND , NULL);
}

Depois que meu processo cria todos os namspaces e eu adiciono umtoque interface para qualquer um dos namespace de redeip link set tap1 netns ns1 comando), então eu realmente vejo essa interface em todos os namespaces (presumivelmente, este é na verdade um único namespace que tem nomes diferentes).

Mas, se eu criar vários namespaces usando vários processos, tudo estará funcionando bem.

Oque pode estar errado aqui? Eu tenho que passar quaisquer bandeiras adicionais para ounshare() obter isso funcionando a partir de uma única instância de processo? Existe uma limitação de que uma única instância de processo não possa criar vários namespaces de rede? Ou há um problema commount() chamar, porque/proc/self/ns/net na verdade é montado várias vezes?

Atualizar: Parece queunshare() função cria vários namespaces de rede corretamente, mas todos os pontos de montagem/var/run/netns/ na verdade, referência ao primeiro namespace de rede que foi montado nesse diretório.

Update2: Parece que a melhor abordagem é fork () em outro processo e executar a função create_namespace () a partir daí. De qualquer forma, ficaria feliz em ouvir uma solução melhor que não envolva fork () call ou pelo menos obtenha uma confirmação que provaria que é impossível criar e gerenciar vários namespaces de rede a partir de um único processo.

Update3: Eu sou capaz de criar vários namespaces com unshare () usando o seguinte código:

int  main() {
    create_namespace("a");
    system("ip tuntap add mode tap tapa");
    system("ifconfig -a");//shows lo and tapA interface
    create_namespace("b");
    system("ip tuntap add mode tap tapb");
    system("ifconfig -a");//show lo and tapB interface, but does not show tapA. So this is second namespace created.
}

Mas depois que o processo termina e eu executoip netns exec a ifconfig -a eip netns exec b ifconfig -a parece que ambos os comandos foram subitamente executados no namespacea. Portanto, o problema real é armazenar as referências aos namespaces (ou chamar mount () da maneira correta. Mas não tenho certeza se isso é possível).

questionAnswers(2)

yourAnswerToTheQuestion