Skip to content

1-3. プロセス隔離

前節では、プロセスについて詳しく見ていきました。
1-1で述べたように、コンテナは

プロセスツリーのある枝から先を、Namespaceやchroot/pivot_root、cgroupなどの機能を使って隔離して実行したもの

です。すなわち、コンテナを実現するためにはプロセスを隔離する技術が必要です。

プロセスを隔離するというのは、主に子プロセスから親プロセスの「何かしら」を操作できなくする・操作を制限することを指します。「何かしら」に当てはまるものは多く、それぞれに対して別の機能が実装されています。
この節では、Linuxに実装されているプロセス隔離機能について解説します。

Namespace

プロセス隔離の代名詞、Namespace。
OS内の様々なリソースの管理を、独立したNamespaceに切り分けることで

  • Namespace内からホストのリソースが閲覧できない
  • Namespace内でのリソースの変更がホストに影響を与えない

といったことが実現できます。
Namespaceはプロセス単位の概念で、あるプロセスが独立したNamespaceに所属すると、子プロセスも自動的にそのNamespaceに所属します。

現在Namespaceは以下の8つのリソースに対して指定できます。

Namespace隔離するリソース
Cgroupcgroup (後述)
IPCプロセス間通信
Networkネットワークデバイス・アドレス
Mountマウント情報
PIDプロセスID
Timeシステムクロックの一部
Userユーザー
UTShostname

これらの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の中でのプロセスの権限を設定

これらは今回のワークショップでは扱わないため、是時各自で調べてみて下さい。