次のリビジョン | 前のリビジョン |
linux:kernel:namespace:namespaces_overview [2013/07/08 11:03] – 作成 tenforward | linux:kernel:namespace:namespaces_overview [2013/07/11 09:37] (現在) – [名前空間] tenforward |
---|
| |
マウント名前空間は,2002 年に Linux に実装された名前空間の最初のものである.この事実が "NEWNS" という他に比べると一般的な名前 ("new namespace" の略) が付いている理由である.その時点では,誰も他の異なるタイプの名前空間が将来必要になってくるであろう事を考えていなかったのである. | マウント名前空間は,2002 年に Linux に実装された名前空間の最初のものである.この事実が "NEWNS" という他に比べると一般的な名前 ("new namespace" の略) が付いている理由である.その時点では,誰も他の異なるタイプの名前空間が将来必要になってくるであろう事を考えていなかったのである. |
| |
| [[http://lwn.net/Articles/179345/|UTS名前空間]] (CLONE_NEWUTS, Linux 2.6.19) は 2 つのシステムの識別子を隔離する.その識別子とは,uname() システムコールによって返される nodename と domainname である.この名前は sethostname() と setdomainname() システムコールで設定される.コンテナのコンテキストでは,UTS 名前空間機能は,コンテナごとに自分のホスト名と NIS ドメインネームを持つことができるようになる.これは,名前に基づいたアクションを行う初期化や設定スクリプトで役に立つ."UTS" とは uname() システムコールに渡される構造体 struct utsname に由来する.構造体の名前は "UNIX Time-sharing System" に由来する. |
| |
| [[http://lwn.net/Articles/187274/|IPC名前空間]] (CLONE_NEWIPC, Linux 2.6.19) は特定の interprocess communication (IPC) リソース,すなわち,[[http://man7.org/linux/man-pages/man7/svipc.7.html|System V IPC]]オブジェクトと (Linux 2.6.30 以降の) [[http://man7.org/linux/man-pages/man7/mq_overview.7.html|POSIX message queues]]を隔離する.これらの IPC メカニズムの共通の特徴は,IPC オブジェクトをファイルシステムのパス名以外の仕組みで特定するということである.IPC 名前空間はそれぞれ自身の System V IPC 識別子と POSIX メッセージキューファイルシステムを持つ. |
| |
| [[http://lwn.net/Articles/259217/|PID名前空間]] (CLONE_NEWPID, Linux 2.6.24) はプロセス ID 番号の空間を隔離する.言い換えると,異なる PID 名前空間内のプロセス同士は同じ PID を持つことが可能となるということである.PID名前空間の主要な利点は,コンテナ内のプロセスが同じプロセス ID を持ったまま,コンテナがホスト間をマイグレーションする事が可能になる事である.PID 名前空間により,様々なシステム初期化のタスクを管理したり,プロセス終了時の孤児プロセスを刈り取ったりする『全てのプロセスの祖先』である init (PID 1) をコンテナごとに持つことも可能になる. |
| |
| 特定の PID 名前空間の視点からすると,あるプロセスは 2 つの PID を持つことになる.つまり,名前空間内の PID とホストシステム上の名前空間外の PID である.PID 名前空間はネスト可能である.あるプロセスは自身が属する PID 名前空間から root PID 名前空間に至るまでの階層構造のそれぞれ階層に対して 1 つの PID を持つ.プロセスは自身の属する PID 名前空間と,ネストした下位の PID 名前空間のプロセスからのみ見える (例えば kill() でシグナルを送ったりするなど). |
| |
| [[http://lwn.net/Articles/219794/|ネットワーク名前空間]] (CLONE_NEWNET, Linux 2.6.24 で実装され,大部分の実装が完成したのが大体 Linux 2.6.29) はネットワークに関係するシステムリソースの隔離機能を提供する.したがって,それぞれのネットワーク名前空間は自身のネットワークデバイス,IPアドレス,IPルーティングテーブル,/proc/netディレクトリ,ポート番号などを持つ. |
| |
| ネットワーク名前空間は,ネットワークの視点からコンテナを便利にする.つまりコンテナはそれぞれ,自身の (仮想的な) ネットワークデバイスを持つことが可能であり,名前空間ごとのポート番号空間にバインドするアプリケーションを持つことが可能になる.ホストシステム内の適切なルーティングルールがパケットを特定のコンテナに関係するネットワークデバイスを送ることが可能になる.したがって,例えば複数のコンテナ化されたウェブサーバが同じホスト上で動くことも可能であり,それぞれのサーバは自身の (コンテナごとの) ネットワーク名前空間内でポート 80 番をバインドしているということが可能である. |
| |
| [[http://lwn.net/Articles/528078/|ユーザ名前空間]] (CLONE_NEWUSER, Linux 2.6.23 で実装が始まり,Linux 3.8 で完成) は,ユーザとグループ ID 番号の空間を隔離する.言い換えると,プロセスのユーザとグループ ID がユーザ名前空間の内部と外部で異なる値を取る事が可能になる.最も興味深いケースとして,ユーザ名前空間の外ではプロセスが通常の特権を持たないユーザを持ち,同時に名前空間内ではユーザ ID が 0 を持つというケースがある.これは,プロセスがユーザ名前空間内では root の特権をフルに持ちながら,名前空間外では特権のない操作を行うという事を意味する. |
| |
| Linux 3.8 から,非特権プロセスがユーザ名前空間を作成することが可能となる.これで,アプリケーションにとって面白い新しい可能性が多数広がる.非特権プロセスがユーザ名前空間内では root 特権を保持できるので,非特権プロセスは今まで root に限られていた機能へのアクセスが可能になる.Eric Biederman はユーザ名前空間の実装を安全で正しく行うために多大な努力を払った.しかし,この作業で行われた変更は巧妙で広大な範囲に及ぶ.それゆえ,ユーザ名前空間はまだ未知のセキュリティ問題を持ち,将来的に修正が続くかもしれない. |
| |
| |
| ===== 最後に ===== |
| |
| 最初に Linux に名前空間が実装されて 10 年余りになる.それ以来,名前空間のコンセプトは,従来はシステム全体のスコープであった様々なグローバルリソースの隔離を行うためのより一般的なフレームワークへと広がってきた.その結果名前空間は,コンテナ形式の軽量な仮想化システムを完成させるための基礎を提供するようになった.名前空間のコンセプトは広がってきたので,関連する API も拡張された.単一のシステムコール (clone()) と 1,2 の /proc ファイルから,いくつかの他のシステムコールとより多数の /proc 以下のファイルへと.この API の詳細はこの記事の後に続くテーマの記事で説明する. |
| |
| ===== シリーズインデックス ===== |
| (略) |
| |