2016-10-05 7 views
0

私たちの状況は次のとおりです。ある名前空間から別の名前空間にカーネルスレッドを移動できますか?

  1. まず我々はカーネルが実行を開始したときに実行を開始し、カーネルスレッド(と言うKS)を持っています。システムの準備ができたとき
  2. はその後、我々はLXCと異なるmntnsを持つ別の名前空間を(NS1と言う)を作成します。

私たちの必要条件は、NS1だけが見ることができる経路に何かを書く必要があるということです。私はKSをNS1名前空間に移動できますか(少なくともマウント名前空間を変更することはできますか?)はいの場合、どうですか?私はsetns() syscallとそのカーネルソースコードをチェックしましたが、それでもやっている(ユーザー空間でもKSソースコードでも)方法を知らず、問題が解決する正しい方法であるかどうかも分かりません。

私の理解は、カーネルタスク(カーネルスレッドなど)がプロセスコンテキスト内にある場合は「名前空間」を認識しているが、「名前空間」はユーザー空間の概念カーネルのスタッフはルート名前空間についてしか知りません。どちらが正しいか?

答えて

-1

ありません、それはあなたの問題を解決する正しい方法ではありません。カーネルスレッドから任意の名前空間に書き込むことのアイデアは、ここで詳しく説明するように悪いです:http://www.linuxjournal.com/article/8110。 setns(2)のシステムコールを使用して必要なマウント名のスペースを入力した後、ユーザースペースから実行する必要があります。 setns(2)のマニュアルページにそのようなコード例があります。

あなたの他の質問への答えはあなたの友人が間違っています。名前空間の設定と関連する処理はカーネル内でカーネルによって行われるため、カーネルはすべての名前空間についてすべてを知る必要があります。各タスクのstruct_taskには、それぞれの名前空間データ構造に関連するすべてのポインタを持つnsproxy構造体メンバが含まれます。これらは、カーネルのみのデータ構造です。ユーザー空間は実際にはこれについて何も知らない(clone()で要求した以外)。マウント・ネーム・スペースの場合、ユーザー・プロセスにはマウント・テーブルが渡されます。マウント・テーブルは、親と同じマウント・テーブルか、新しいマウント・ネーム・スペースがクローンによって要求された場合はプライベート・コピーです(flags = CLONE_NEWNS)。どちらの方法でも、ユーザプロセスは、それが渡されたマウントテーブル(構造体)を使用するだけで、カーネルはユーザがそれを意識することなく名前空間の詳細を管理します。

+0

ありがとうございます! –

関連する問題