Heim >Backend-Entwicklung >Golang >Warum gibt der Aufruf von setns von Go aus EINVAL für mnt-Namespaces zurück?

Warum gibt der Aufruf von setns von Go aus EINVAL für mnt-Namespaces zurück?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-03 14:30:03709Durchsuche

Why Does Calling setns from Go Return EINVAL for mnt Namespaces?

Aufruf von Sets aus Go gibt EINVAL für mnt-Namespace zurück

Problem:

Der Go-Code Beim Aufruf von setns gelingt es nicht, den mnt-Namespace einzugeben, was zu einem EINVAL-Fehler führt. Trotz identischer Aufrufe im C-Code erzeugt die Go-Implementierung den konsistenten Fehler.

Untersuchung:

  • Bestätigung, dass sowohl C- als auch Go-Codeaufrufe in libc identisch eingestellt sind .
  • Reduzierung des Problems auf ein vereinfachtes Codebeispiel, um das Problem zu isolieren.

Lösung:

In Go müssen setns ausgeführt werden in einem Single-Threaded-Kontext vor dem Start der Go-Laufzeitthreads. Dies liegt daran, dass setns auf den aufrufenden Thread einwirkt und ihn mit dem Namespace verbindet.

Alternative Lösung mit CGO-Konstruktor-Trick:

Fügen Sie das Makro __attribute__((constructor)) hinzu zu einer C-Funktion hinzufügen, damit sie vor der Go-Initialisierung ausgeführt wird. Dies ermöglicht die Eingabe eines Namespace vor dem Start von Go-Threads, wodurch das Problem behoben wird.

Aktualisierung:

Eine Konversation in der Linux-Kernel-Mailingliste bestätigt die Einschränkung, die Multithread-Prozesse nicht können erneut einem neuen Mount-Namespace zugeordnet werden. Dies erfordert die Funktionen CAP_SYS_CHROOT und CAP_SYS_ADMIN im Namespace des Aufrufers und CAP_SYS_ADMIN im Ziel-Namespace.

Das obige ist der detaillierte Inhalt vonWarum gibt der Aufruf von setns von Go aus EINVAL für mnt-Namespaces zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn