So erstellen Sie mehrere Netzwerknamespaces aus einer einzelnen Prozessinstanz

Ich benutze folgende C-Funktion zum Erstellenmehrere Netzwerk-Namespaces von einemeinzelne Prozessinstanz:

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);
}

Nachdem mein Prozess alle Namespaces erstellt hat, füge ich einZapfhahn Schnittstelle zu einem der einen Netzwerk - Namespaces (mitip link set tap1 netns ns1 Befehl), dann sehe ich diese Schnittstelle tatsächlich in allen Namespaces (vermutlich ist dies tatsächlich ein einzelner Namespace, der unter verschiedenen Namen geführt wird).

Wenn ich jedoch mehrere Namespaces mithilfe mehrerer Prozesse erstelle, funktioniert alles einwandfrei.

Was könnte hier falsch sein? Muss ich zusätzliche Flags an die weitergeben?unshare() funktioniert dies mit einer einzelnen Prozessinstanz? Gibt es eine Einschränkung, dass eine einzelne Prozessinstanz nicht mehrere Netzwerknamespaces erstellen kann? Oder gibt es ein Problem mitmount() anrufen, weil/proc/self/ns/net wird eigentlich mehrfach gemountet?

Aktualisieren: Es scheint, dassunshare() Funktion erstellt mehrere Netzwerknamespaces korrekt, aber alle Mount-Punkte in/var/run/netns/ Verweis auf den ersten Netzwerknamespace, der in diesem Verzeichnis bereitgestellt wurde.

Update2: Es scheint, dass der beste Ansatz darin besteht, einen anderen Prozess zu forken () und die Funktion create_namespace () von dort auszuführen. Auf jeden Fall würde ich mich über eine bessere Lösung freuen, bei der kein Aufruf von fork () erforderlich ist, oder zumindest eine Bestätigung, die beweist, dass es unmöglich ist, mehrere Netzwerknamespaces von einem einzigen Prozess aus zu erstellen und zu verwalten.

Update3: Ich kann mit unshare () mehrere Namespaces erstellen, indem ich den folgenden Code verwende:

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.
}

Aber nachdem der Prozess beendet ist, führe ich ausip netns exec a ifconfig -a undip netns exec b ifconfig -a Es scheint, dass beide Befehle plötzlich im Namespace ausgeführt wurdena. Das eigentliche Problem besteht also darin, die Verweise auf die Namespaces zu speichern (oder mount () richtig aufzurufen. Ich bin mir jedoch nicht sicher, ob dies möglich ist).

Antworten auf die Frage(2)

Ihre Antwort auf die Frage