linux:kernel:namespace:more_on_pid_namespaces

文書の過去の版を表示しています。


PID 名前空間について更にもう少し

この記事では,PID 名前空間の先週の議論を続ける (そして名前空間に関する進行中のシリーズを続ける).PID 名前空間の利用法の一つは,パッケージ化したプロセス (コンテナ) を実装することである.これは独立した Linux システムのように振る舞う.伝統的なシステムのキーとなる部分は init プロセスである.そしてこれは PID 名前空間を使ったコンテナでも同様である.なので,init プロセスの特別な役割を調べ,伝統的な init プロセスとは違う点について 1 つ,2 つ述べる.加えて,PID 名前空間に適用する時の名前空間 API の他の詳細を調べる.

PID 名前空間内で最初に作られるプロセスは,名前空間内でプロセス ID 1 を取得する.このプロセスは伝統的な Linux システムの init プロセスと同様の役割を持つ.特に,init プロセスは PID 名前空間全体 (例えば多分,開始する名前空間の標準部分であるであろう他のプロセス) に必要な初期化を行う能力があり,他とは独立した名前空間内のプロセスの親になる.

PID 名前空間の操作を説明するために,特定の目的で作られたいくつかのサンプルプログラムを利用する.このプログラムの最初は ns_child_exec.c で,以下のようなコマンドライン文法である.

   ns_child_exec [options] command [arguments]

ns_child_exec プログラムは,子プロセスを作成するのに clone() システムコールを使用する.そして,子供は与えられた command を指定した arguments を引数に実行する.options の主目的は clone() の呼び出しで作成される新しい名前空間を指定するためのものである.例えば,-p オプションでは,以下のように子供が新しい PID 名前空間内に作られる.

    $ su                  # Need privilege to create a PID namespace
    Password:
    # ./ns_child_exec -p sh -c 'echo $$'
    1

コマンドで子プロセスが新しい PID 名前空間内に作られ,シェルの echo コマンドが実行され,シェルの PID が表示されている.1 という PID を持ち,シェルは実行中である間(少しの間だけ)存在した PID 名前空間に対する init であった.

次のプログラムは simple_init.c であり,これは PID 名前空間の init プロセスとして実行されるプログラムである.

simple_init プログラムは init の主要な 2 つの機能を実行する.1 つ目は『システムの初期化』である.ほとんどの init システムはもっと複雑なプログラムであり,システムの初期化に対してテーブル駆動のアプローチを取る.ここでの (もっとシンプルな) simple_init プログラムは,シンプルなシェルであり,ユーザが手動で名前空間の初期化に必要などのようなコマンドでも実行が可能なものである.このアプローチは名前空間内での実験を実行するためのシェルコマンドを自由に実行することも可能となる.simple_init が実行する 2 つ目の機能は,waitpid() を使って子供が終了するステータスを取得することである.

それゆえ,例えば,PID 名前空間内で実行する init プロセスを起動するために,ns_child_exec プログラムを simple_init と連携させて使うことが可能である.

    # ./ns_child_exec -p ./simple_init
    init$
  • linux/kernel/namespace/more_on_pid_namespaces.1376908967.txt.gz
  • 最終更新: 2013/08/19 10:42
  • by tenforward