15分で分かるLXC(Linux Containers)の仕組みとコンテナ作成

図2 LXCによる仮想化

 最近注目されている仮想化技術の1つにLXC(Linux Containers)がある。LXCはコンテナ型仮想化技術と呼ばれるものの1つで、OS上に別の隔離された環境を構築するものだ。今回はLXCの仕組みと、インストール方法、コンテナの作成/起動方法について紹介する。

さまざまな仮想化技術とLXC

 仮想化技術を使って一台のマシン上に複数の隔離された環境を構築する、というのはメインフレームの世界では古くから行われていたが、近年ではマシンの性能向上により、エントリレベルのサーバーでもこのような使われ方が実用的になっている。そういった背景の下注目されているのがLXC(Linux Container)と呼ばれる仮想化技術だ。

 広く使われている仮想化技術としてはXenやKVMがあるが、これらはホストOS(もしくはハイパーバイザ)上で演算によって仮想的なマシン環境を作り出し、その上でOSを実行させることで複数のOS環境の構築を可能にしている(図1)。

図1 Xen/KVMによる仮想化
図1 Xen/KVMによる仮想化

 この場合、ホストOSとは異なるOSを仮装マシン上で実行できる、ホストOSとゲストOSを完全に分離できる、といったメリットがあるが、ハードウェアを演算によってシミュレートするため、そのためのオーバーヘッドが必要になるというデメリットもある。

 いっぽうLXCはXenやKVMといった仮想化技術とは異なり、仮想マシンを作り出すのではなく、OSが利用するリソースを隔離することで複数の環境を並立させることを可能にしている(図2)。

図2 LXCによる仮想化
図2 LXCによる仮想化

 この方式ではハードウェアをシミュレートする必要がないため、仮想化によるオーバーヘッドはほぼ存在しない。また、仮想マシンのブートやシャットダウンという概念も存在しないため、仮想環境の立ち上げや停止を高速に実行できる。さらに、仮想マシン上で実行されている環境上でも利用できるというメリットもある。

LXCはどのように実装されているのか

 LXCと似た技術として、「chroot」というものが存在する。chrootはプロセスのルートディレクトリを変更するもので、これによってプロセスがアクセスできるディレクトリを制限したり、システムが通常使用するライブラリとは異なるライブラリを読み込ませることが可能になる。ただし、chrootで制御できるのはファイルやディレクトリに対するアクセスのみで、ネットワークやプロセスなどについてはコントロールできない。

 また、FreeBSDにはchrootを発展させた機構として「jail」と呼ばれる機能が搭載されている。jailではファイルシステムに対するアクセスだけでなく、プロセスやデバイスといったリソースについても制御が可能になっている。LXCはこのjailと同様の考え方で実装されたもので、Linuxカーネル2.6.24より搭載された「cgroups」と呼ばれるリソース管理機構を用いて実装されている。

 cgroupsは、OSが管理するさまざまなリソースを一元的に制御するための機構だ。リソースをグループ化し、グループごとに優先度や利用できるリソースを制限したり、グループを隔離して他のグループからは不可視にする、といった機能を提供する。

 cgroupsで管理できるのはファイルシステムやプロセスに加え、CPUリソースやメモリ、各種デバイス、ネットワークパケット、ネットワークインターフェイスなど多岐に渡る。cgroupsの利用例としては特定のプロセスが利用できるメモリ量やCPU時間などを制限する、といったものがあるが、LXCではプロセスに対しchrootのように特定のディレクトリをルートディレクトリと認識させ、かつcgroupsの名前空間機能を使って各種リソースを隔離することで、仮想的な環境の構築を実現している(図3)。

図3 cgroupsによるリソースのグルーピング
図3 cgroupsによるリソースのグルーピング

 なお、cgroupsについてはRed Hatの日本語ドキュメントが詳しいので、より詳しくその機能を知りたい方はそちらを参照してほしい。

LXCを利用する際の注意点

 LXCはcgroupsの機能を使って各種リソースを隔離することで独立した環境を提供している。そのため、CPUやハードウェア固有の機能を必要としない。XenやKVMといった仮想化技術にって作成された仮想マシン上での動作も可能だ。

 また、LXCで作られた仮想環境はホスト環境から完全に隔離された状態になり、仮想環境からホスト環境のリソースに直接アクセスすることはできない。ただし、注意が必要なのはroot権限の扱いだ。コンテナ内でroot権限で実行されているプロセスは、ホスト環境内のroot権限を持つことになる。ただし、この問題を解決するための仕組みも開発されており、LXC 1.0以降ではコンテナ内のrootユーザーをコンテナ外では別のユーザーとして扱う仕組み(非特権コンテナ)が実装されている。これにはカーネル側でのサポートも必要であるため、環境によっては利用できないこともあるので注意したい。