ホームページ  >  記事  >  バックエンド開発  >  Go から setns を呼び出すと mnt 名前空間の EINVAL が返されるのはなぜですか?

Go から setns を呼び出すと mnt 名前空間の EINVAL が返されるのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-03 14:30:03664ブラウズ

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

Go から setns を呼び出すと、mnt 名前空間の EINVAL が返されます

問題:

Go コードsetns 呼び出しで mnt 名前空間に入ることに失敗し、EINVAL エラーが発生します。 C コードでの呼び出しが同一であるにもかかわらず、Go 実装では一貫したエラーが生成されます。

調査:

  • C と Go コードの両方が libc の setns を同一に呼び出すことを確認します。 .
  • 問題を切り分けるために、問題を簡略化したコード例に落とし込みます。

解決策:

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。