linux:kernel:namespace:pid_namespaces

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
linux:kernel:namespace:pid_namespaces [2013/08/06 08:58] – [/proc/PID と PID 名前空間] tenforwardlinux:kernel:namespace:pid_namespaces [2013/08/07 12:06] (現在) – [/proc/PID と PID 名前空間] tenforward
行 116: 行 116:
  
 ファイルの PPid フィールドは 0 であり,子供に対する親プロセスの ID が 0 であると報告した getppid() の結果と一致する. ファイルの PPid フィールドは 0 であり,子供に対する親プロセスの ID が 0 であると報告した getppid() の結果と一致する.
 +
 +===== ネストした PID 名前空間 =====
 +
 +先に述べたように,PID 名前空間は親子関係で階層構造的にネストする.PID 名前空間内では,同じ名前空間内の他の全てのプロセスを見ることができるだけでなく,子孫の名前空間のメンバーの全てのプロセスも見る ("see") ことができる.ここで「見る」("see") とは PID を指定して操作するシステムコールを利用できることを意味する(例えばプロセスにシグナルを送る kill() の利用など).子供の PID 名前空間内のプロセスは親の PID 名前空間内 (や消去された祖先の名前空間) に存在するプロセスを見ることはできない.
 +
 +プロセスは,属している PID 名前空間から始まり,root PID 名前空間までに属する PID 名前空間の階層構造のぞれぞれのレイヤーごとに 1 つ PID を持つだろう.getpid() を呼ぶと,プロセスが属する名前空間に紐付いた PID が常に返ってくる.
 +
 +プロセスが,そのプロセスが見える名前空間内のそれぞれで異なる PID を持っていることを示すために [[http://lwn.net/Articles/532745/|ここ]] のプログラムを見てみよう.簡潔な記述のために,ここではコードを通して見るよりは,プログラムがやっていることを簡単に説明しよう.
 +
 +プログラムはネストされた PID 名前空間内で一連の子プロセスを再帰的に作成する.プログラムを起動する際に,何個の子供と PID 名前空間を作るのかをコマンドライン引数で指定する.
 +
 +<code>
 +    # ./multi_pidns 5
 +</code>
 +
 +新しい子プロセスを作るのに加えて,それぞれの再帰ステップはユニークに名前が付けられたマウントポイントに procfs をマウントする.再帰の最後に,最後の子供が sleep を実行する.先のコマンドラインは以下のような出力が出る.
 +
 +<code>
 +    ^Z                           Stop the program, placing in background
 +    [1]+  Stopped            ./multi_pidns 5
 +    # ls -d /proc4/[1-9]*        Topmost PID namespace created by program
 +    /proc4/ /proc4/ /proc4/ /proc4/ /proc4/5
 +    # ls -d /proc3/[1-9]*
 +    /proc3/ /proc3/ /proc3/ /proc3/4
 +    # ls -d /proc2/[1-9]*
 +    /proc2/ /proc2/ /proc2/3
 +    # ls -d /proc1/[1-9]*
 +    /proc1/ /proc1/2
 +    # ls -d /proc0/[1-9]*        Bottommost PID namespace
 +    /proc0/1
 +</code>
 +
 +全てを見ることができる名前空間内で,再帰の末尾 (例えば最も深くネストした名前空間内で sleep を実行しているプロセス) でプロセスの PID を見るには grep コマンドが適切だろう.
 +
 +<code>
 +    # grep -H 'Name:.*sleep' /proc?/[1-9]*/status
 +    /proc0/1/status:Name:       sleep
 +    /proc1/2/status:Name:       sleep
 +    /proc2/3/status:Name:       sleep
 +    /proc3/4/status:Name:       sleep
 +    /proc4/5/status:Name:       sleep
 +</code>
 +
 +言い換えると,最も深くネストした PID 名前空間 (/proc0) 内では,sleep を実行しているプロセスは PID 1 を持つ.そして,最も浅い PID 名前空間で作られた名前空間 ((/proc4) では,プロセスは PID 5 を持つ.
 +
 +もしこの記事で紹介したプログラムを実行した場合,プログラムはマウントポイントとマウントディレクトリをそのままにしていることに注意すること.プログラムが終了した後,以下のようなシェルコマンドが片付けをするのに十分である.
 +
 +<code>
 +    # umount /proc?
 +    # rmdir /proc?
 +</code>
 +
 +===== 最後に =====
 +
 +この記事では,PID 名前空間についてかなり詳しく見た.次の記事では,PID 名前空間での init プロセスについての議論と説明を記載すると共に,PID 名前空間 API の他の詳細についても少し触れる.
  • linux/kernel/namespace/pid_namespaces.1375779504.txt.gz
  • 最終更新: 2013/08/06 08:58
  • by tenforward