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:
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!