1-3. プロセス隔離
前節では、プロセスについて詳しく見ていきました。
1-1で述べたように、コンテナは
プロセスツリーのある枝から先を、Namespaceやchroot/pivot_root、cgroupなどの機能を使って隔離して実行したもの
です。すなわち、コンテナを実現するためにはプロセスを隔離する技術が必要です。
プロセスを隔離するというのは、主に子プロセスから親プロセスの「何かしら」を操作できなくする・操作を制限することを指します。「何かしら」に当てはまるものは多く、それぞれに対して別の機能が実装されています。
この節では、Linuxに実装されているプロセス隔離機能について解説します。
Namespace
プロセス隔離の代名詞、Namespace。
OS内の様々なリソースの管理を、独立したNamespaceに切り分けることで
- Namespace内からホストのリソースが閲覧できない
- Namespace内でのリソースの変更がホストに影響を与えない
といったことが実現できます。
Namespaceはプロセス単位の概念で、あるプロセスが独立したNamespaceに所属すると、子プロセスも自動的にそのNamespaceに所属します。
現在Namespaceは以下の8つのリソースに対して指定できます。
| Namespace | 隔離するリソース |
|---|---|
| Cgroup | cgroup (後述) |
| IPC | プロセス間通信 |
| Network | ネットワークデバイス・アドレス |
| Mount | マウント情報 |
| PID | プロセスID |
| Time | システムクロックの一部 |
| User | ユーザー |
| UTS | hostname |
これらのNamespaceは、ユーザーが好きに組み合わせを選んで使うことができます。
chroot・pivot_root
chroot・pivot_rootは、どちらもファイルシステムのルートを変える機能です。/が別の場所にあると登録することで、ホスト側のファイルは閲覧・編集できなくなります。
後程触れますが、これらは同じ機能を違う方法で実現しています。
例えばこれらの機能を使い「/home/container/tmpがこれからは/だ」と設定すれば、設定されたプロセスは/home/container/tmp以下のファイルしか閲覧できなくなります。
これもプロセス単位の概念で、あるプロセスのルートディレクトリを変更すれば、その子プロセスも自動的にそこがルートディレクトリになります。
cgroup
cgroupことControl Groupは、あるプロセスが使うことのできるリソース量を制限するための機能です。
Namespaceの対象となるリソースと違い、全体で共有しておりはっきりと分離ができないリソースが対象で、CPU・メモリ・ストレージのアクセス速度、パケットの制御などが該当します。
コンテナにおいては、主にCPUとメモリの使用量を制限するために使われています。
これもプロセス単位の概念で、あるプロセスをあるcgroupに入れれば、その子プロセスも自動的にそのcgroupに所属し、所属したプロセス全体の合計量が制限を受けます。
その他の隔離機能
現代のコンテナでは、以下のような隔離機能も利用されています。
- Seccomp: 呼ぶことのできるsyscall (1-4) を制限
- Capabilities: Linuxの中でのプロセスの権限を設定
これらは今回のワークショップでは扱わないため、是時各自で調べてみて下さい。