2016-08-15 3 views
1

Ich schrieb ein Linux-Kernel-Modul und eine Userspace-Applikation. Sie hatten sehr gut über Netlink kommuniziert. Aber ich habe errno 111 (Verbindung abgelehnt), als ich versuchte, die User-Space-Anwendung auf einem emulierten Knoten in CORE (Common Open Research Emulator) auszuführen. Können Sie mir helfen, die Ursache zu finden (ein emulierter Knoten ist laut CORE eine virtuelle Maschine, die denselben Kernel wie der lokale Host verwendet)?der virtuelle Maschine und die Kernel-Kommunikation über netlink

Vielen Dank!

Antwort

0

Meine Vermutung ist, dass es wegen fehlender Linux-Fähigkeiten (CAP_NET_ADMIN) passiert ist. Haben Sie die Funktionen Ihres Benutzerbereichs und Ihres VM-Prozesses überprüft?

+0

Hallo Galka, Vielen Dank für die Beantwortung meiner Frage. Ich habe es vor ungefähr einem Jahr gepostet und jetzt habe ich eine Lösung gefunden. Das Problem war, dass ich Netlink verwendet habe, das nur Kernel-Kommunikation und Benutzer-Space-Kommunikation unterstützt, wenn sich die beiden kommunizierenden Prozesse in denselben Netzwerk- und Prozessräumen befinden. Da ein CORE-Knoten separate Netzwerk- und Prozessräume verwendet, ist ein Fehler aufgetreten. Ich habe versucht, den CORE-Knoten zu den Kernel-Räumen wechseln zu lassen und dann war der Fehler weg. :) – Tina

+0

Hallo, Tina. Warum hast du die Antwort nicht eingereicht, jeder war neugierig :) – galka

+0

Nun, das wusste ich nicht. Das nächste Mal werde ich tun :) – Tina

0

Der Grund, warum ich den Fehler "Verbindung abgelehnt" bekam, ist, weil die User-Land- und Kernel-Land-Prozesse nicht im selben Netzwerkraum waren. Der Kernel-Land-Prozess lauschte im "root" -Raum, während der User-Land-Prozess einen anderen Raum sendete.

CORE verwendet Linux-Virtualisierung. Es erstellt separate Prozess- und Netzwerkräume für jeden emulierten Knoten. Wenn eine Anwendung auf einem CORE-Knoten ausgeführt wird, hat ihr Benutzerlandprozess einen eigenen Prozess-ID-Raum und Netzwerkstapelspeicherplatz. Die Nachrichten, die von der Anwendung gesendet wurden, waren innerhalb der eigenen Speicherbereiche des CORE-Knotens beschränkt.

Um die Kernel-Land- und User-Land-Kommunikation bei der Verwendung von CORE zu ermöglichen, sollten wir die Anwendung zuerst auf den Netzwerkraum des Kernels schalten und dann einen Netlink-Socket erstellen und Nachrichten über den Socket senden.

Um zum Netzwerkbereich des Kernels zu wechseln, müssen Sie zunächst /proc an /proc_root anhängen. Fügen Sie dann in der Anwendung {fd = open("/proc_root/1/ns/net", O_RDONLY); setns(fd, 0);} hinzu, bevor Sie mithilfe von Netlink Nachrichten an den Kernel-Land-Prozess senden.

Verwandte Themen