Go から setns を呼び出すと、mnt 名前空間の EINVAL が返されます
問題:
Go コードsetns 呼び出しで mnt 名前空間に入ることに失敗し、EINVAL エラーが発生します。 C コードでの呼び出しが同一であるにもかかわらず、Go 実装では一貫したエラーが生成されます。
調査:
解決策:
Go では、setns を実行する必要があります。 Go ランタイム スレッドが開始される前のシングルスレッド コンテキストで。これは、setns が呼び出しスレッドに作用し、名前空間に結合するためです。
CGO コンストラクターを使用した代替解決策のトリック:
__attribute__((constructor)) マクロを追加します。 Go の初期化前に実行するように C 関数に追加します。これにより、Go スレッドが開始する前に名前空間に入ることができ、問題が解決されます。
更新:
Linux カーネルのメーリング リストでの会話により、マルチスレッド プロセスが実行できない制限が確認されました。新しいマウント名前空間に再度関連付けられます。これには、呼び出し元の名前空間の CAP_SYS_CHROOT および CAP_SYS_ADMIN の機能と、ターゲットの名前空間の CAP_SYS_ADMIN が必要です。
以上がGo から setns を呼び出すと mnt 名前空間の EINVAL が返されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。