2つの異なるプロセス名前空間を組み合わせることは可能ですか?

2つの異なるプロセス名前空間を組み合わせることは可能ですか?

Linuxで2つのプロセス名前空間を組み合わせることができるかどうかを知りたいです。私が意味するものを証明するために、シナリオは次のとおりです。

  1. プロセスは別の名前空間で実行されます。私たちはこのプロセスをAと呼びます。

  2. これでプロセスAがタスクを実行しているので、別の名前空間に分離された別のプロセスBを起動します。

  3. 今、プロセスAとプロセスBには別々の名前空間がありますが、両方のプロセス名前空間を1つに「マージ」したいと思います。つまり、プロセスBがAの名前空間を見てシグナルを送信し、Aのプロセスと対話できるようにしたいのです。

これのユースケースは、最終的にリンクされたコンテナが実行中のコンテナと対話できるように、コンテナを他の実行中のコンテナにリンクすることです。

考えてみましたが、プロセスBも分離され、setns()プロセスAのネームスペースハンドル()がわからないため、機能しません。/proc/PID/ns/pid私はホストシステムでこれを達成するための最良の方法が何であるかを考えようとしています。

これはすでにdockerに実装されています。ここしかし、私はその背後にあるロジックを理解できません。いくつかの実装問題も議論されている。ここそれが役立つなら。

時間をいただきありがとうございます!

ベストアンサー1

Linuxネームスペースについて話すとき、実際にはさまざまなことについて話しています。その他名前空間はすべて個別に設定できます。

  1. プロセスID
  2. 共有メモリ
  3. ネットワーキング
  4. ホスト名など
  5. ユーザーID
  6. ファイルシステム

プロセスが正しいフラグを使用して呼び出されるsetns()と、clone()「偽」の世界観を使用して新しい名前空間が作成されます。

今すぐ再マージしたい場合は、問題が発生する可能性があります。

簡単なので「プロセスID」ネームスペースを使います。

新しいPID名前空間を作成すると、名前空間の最初のプロセスはPID 1を取得します。 2つの新しい名前空間がある場合は、PID 1があると思う2つのプロセスがあります。マージしようとすると競合が発生し、そのうちの1つだけがPID 1を保持できます。変化実行中のプロセスのPIDが予期しないものです。これは意図しない結果を引き起こす可能性があります。

IPCに似ています。 2つの独立した共有メモリブロックは、それぞれの名前空間内で同じアドレスを持つことができます。これをマージしようとすると、メモリ破損が発生します(1セグメントのアドレスを変更しても)。プロセスそれでも古い住所を保持しています。)

したがって、2つの既存の名前空間をマージすることは危険です。

パッチの機能docker防ぐコンテナが起動すると、新しい名前空間が作成されます。これは、2つの既存のコンテナをマージすることとは異なります。コンテナの起動時に発生します。

おすすめ記事