コンテナは、軽量な仮想化技術です。これはQemuやVMwareのような完全仮想化に比べると、どちらかというと拡張されたchrootに似ています。なぜなら、コンテナはハードウェアをエミュレートしたりせず、ホストと同じOSを共有するからです。なのでコンテナは、SolarisのzoneやBSDのjailと比べて優れています。Linux-vserverとOpenVZの二つが、現在のところ既に存在している独立して実装されているLinux機能のコンテナ実装です。実はコンテナは、vserverとOpenVZの機能の上位互換を開発するための仕事の延長で登場しました。いくつかのvserverとOpenVZの機能は現在のコンテナではまだ実装されていませんが、コンテナは多くのLinuxディストリビューションを起動(boot)することができ、upstreamカーネルの変更なしで利用することができるという利点があります。
コンテナのユーザー領域の実装には、カーネルの同じ機能を利用した二つの方法があります。Libvirtは、「lxc:///」に接続してLXCドライバー経由でコンテナへのアクセスを許可します。この仕組みは他のドライバーと同じ使い方をサポートしているので、非常に使い勝手の良いものになるでしょう。もう一つのコンテナ実装は、単純に「LXC」と呼ばれるものです。これはlibvirtとは互換性はありませんが、より多くのユーザー領域ツールによってより柔軟に使うことができます。これは、少し混乱を生む特異な部分もありますが、二つのLXC間での入れ替えも可能になります。
このドキュメントでは主にlxcパッケージについて記述します。あとは、ドキュメントの最後の辺りにかけてlibvirt LXCドライバーについても記述します。
このドキュメントでは、コンテナの名前はCN、C1、そしてC2として説明します。
lxcパッケージはapt-getコマンドを使い、以下のコマンドでインストールできます。
sudo apt-get install lxc
このコマンドは、cgroup-lite、lvm2、debootstrapなどの依存ライブラリ等も一緒に持ってきます。libvirt-lxcを利用するには、libvirt-binをインストールしてください。LXCとlibvirt-lxcは、同時にインストールし利用することも可能です。
以下は、LXCをインストールし利用する際のファイルとディレクトリに関する説明です。
- 二つの起動ジョブ
- /etc/init/lxc-net.conf: はオプショナルなジョブで、/etc/default/lxc がUSE_BRIDGEを指定している場合(デフォルトではtrue)のみ走ります。このスクリプトは、コンテナが使用するためにNAT化されたブリッジをセットアップします。
- /etc/init/lxc.conf: /etc/default/lxc で、LXC_AUTO(デフォルトではtrue)がtrueに設定されてる場合に走ります。このスクリプトは、/etc/lxc/auto/ 内に置かれたブート時に起動するコンテナのコンフィグファイルへのシンボリックリンクを見つけ出します。
- /etc/lxc/lxc.conf: このファイルはデフォルトのコンテナ作成用コンフィグファイルで、起動ジョブのlxc-netにて作成されたLXCブリッジを使用するコンテナを指定します。もしコンテナ作成時になにもコンフィグファイルが指定されていない場合は、このファイルが使用されます。
- 他のコンテナ作成用のコンフィグファイルの例は、/usr/share/doc/lxc/examples ディレクトリにあります。これらの例は、プライベートネットワークなしでコンテナを作る方法や、macvlan、vlanもしくはその他のネットワークを利用する方法等を示しています。
- さまざまなコンテナ管理用のツールは、/usr/bin 配下にあります。
- /usr/lib/lxc/lxc-init は最低限で軽量な、lxc-executeで使用され初期バイナリファイルです。完全なコンテナを「起動」する代わりに、/proc などのいくつかのファイルシステムを手動でマウントしてその引数を実行します。このファイルを手動で参照する必要はありません。
- /usr/lib/lxc/templates/ には、さまざまなディストリビューションでコンテナを作成することができる「テンプレート」を置いています。すべてのテンプレートが現在サポートされているわけではありません。
- /etc/apparmor.d/lxc/lxc-default には、コンテナからホストを守るために動作するデフォルトのApparmor MACポリシーが置かれています。より詳しい説明はApparmor(英語)をご覧ください。
- /etc/apparmo r.d/usr.bin.lxc-start には、コンテナ設定中のlxc-startからホストを守るためのプロファイルが含まれています。
- /etc/apparmor.d/lxc-containers ブート時に読み込まれた /etc/apparmor.d/lxc 配下で定義されているすべてのプロファイルを実行します。
- LXC管理ツール及び lxc.conf コンテナコンフィグファイル用のマニュアルはいくつもあります。
- /var/lib/lxc は、コンテナとコンテナのコンフィグ情報が保存される場所です。
- /var/cache/lxc は、複数のコンテナ作成を高速化するために配布用のデータが保存されている場所です。
USE_LXC_BRIDGEが/etc/default/lxc内でtrueに設定されている時(デフォルトでそうなっています)、lxcbr0と呼ばれるブリッジが最初に作成されます。このブリッジはプライベートアドレスの10.0.3.1が与えられ、このブリッジを使用しているコンテナは10.0.3.0/24のアドレスを保持します。dnsmasqインスタンスがそのブリッジを他のdnsmasqがlxc-net起動ジョブが実行される前にすべてのインターフェースを割り当ててしまっていないか調べるためにリッスンしており、lxc-netが開始に失敗した場合はlxcbr0は存在しないでしょう。
もしあなたが他のブリッジを保持している場合(libvirtのデフォルトのvirbr0かもしくは、デフォルトNIC用のbr0)、lxcbr0の代わりにコンテナ用にそのブリッジを使用することができます。
LXCはコンテナ情報と(デフォルトのバックアップ領域と一緒に)ルートファイルシステムを /var/lib/lxc 配下に保存します。コンテナ作成テンプレートも、よくキャッシュ配布情報を /var/cache/lxc 以下に保存することがあります。
もしあなたが /var 以外のファイルシステムを使用したい場合、より大きな領域を持つスペースにファイルシステムをマウントすることができます。もしあなたがディスクを専用でこのために割り当てることができる場合は、単純に /var/lib/lxc にそれをマウントすることができます。
もしあなたが /srv などの別の場所を使用したい場合は、bind mountするかシンボリックリンクを使用することができます。例えば、もし /srv が大きなマウント済みのファイルシステムの場合、以下のようにシンボリックリンクを二つのディレクトリに作成します。
sudo mkdir /srv/lxclib /srv/lxccache
sudo rm -rf /var/lib/lxc /var/cache/lxc
sudo ln -s /srv/lxclib /var/lib/lxc
sudo ln -s /srv/lxccache /var/cache/lxc
もしくはbind mountを利用します。
sudo mkdir /srv/lxclib /srv/lxccache
sudo sed -i '$a \
/srv/lxclib /var/lib/lxc none defaults,bind 0 0 \
/srv/lxccache /var/cache/lxc none defaults,bind 0 0' /etc/fstab
sudo mount -a
LVMパーティションをコンテナ用の二次記憶領域(バッキングストア)として利用することが可能です。この方法の利点は、保存領域のマネジメントの柔軟さと高速なコンテナの複製が行えることなどです。ツールはデフォルトではlxcと名付けられたVG(Volume Group: ボリュームグループ)を使用することになっていますが、別のVGをコマンドラインのオプションから利用することができます。LVがコンテナのバッキングストアとして利用されている場合でもコンテナのコンフィグファイルは /var/lib/lxc/CN/confg にありますが、そのファイル(lxc.rootfs)のroot fsエントリーはそのIVブロックデバイス名を指します。(例: /dev/lxc/CN )
ディレクトリツリーとLVMバッキングストアのコンテナは共存可能です。
もしホストがbtrfs /var を持っている場合、LXC管理ツール自動的にそれを検出して、btrfsスナップショットを利用してコンテナの複製を作る形で利用します。
LXCは、コンテナ内部の特権が予期せず悪用・誤用された場合にホストを守る目的でApparmorが同封されています。例えば、コンテナは /proc/sysrq-trigger や、ほとんどの /sys ファイルへの書き込みができません。
usr.bin.lxc-startプロファイルは、lxc-start
を実行することで挿入されます。このプロファイルは主にlxc-start
がコンテナのルートファイルシステム外に新しいファイルシステムをマウントすることを防ぎます。コンテナのinit
スクリプトを起動する前に、LXC
はコンテナのプロファイルに切り替えることを要求します。デフォルトでは、このプロファイルは、/etc/apparmor.d/lxc/lxc-default で定義されている lxc-container-defult ポリシーになります。このプロファイルは、コンテナが多くの危険なファイルにアクセスすることやほとんどのファイルシステムをマウントすることを防ぎます。
もしlxc-start
が普通にアクセスしている状態であるにもかかわらずApparmorのポリシーによって拒否されて失敗した場合には、lxc-startポリシーを以下のようにして無効にすることができます。
sudo apparmor_parser -R /etc/apparmor.d/usr.bin.lxc-start
sudo ln -s /etc/apparmor.d/usr.bin.lxc-start /etc/apparmor.d/disabled/
このコマンドはlxc-start
を開放しつつ、コンテナ自体は閉鎖状態にし続けます。もしコンテナの閉鎖・監禁状態も無効化したい場合は、usr.bin.lxc-start
プロファイルjを無効化することに加えて、以下をコンフィグファイルに追記してください。
lxc.aa_profile = unconfined
もしあなたがコンテナを独自のプロファイルで実行したい場合、新しいプロファイルを /usr/apparmor.d/lxc/ 以下に作成してください。ファイル名は、 lxc-start
がそのプロファイルに転移できるように、lxc- から始めなければなりません。ポリシーを作成した後は、以下のコマンドを利用してロードしてください。
sudo apparmor_parser -r /etc/apparmor.d/lxc-containers
そのプロファイルは、再起動後に自動的に読み込まれます。なぜなら、/etc/apparmor.d/lxc-containers からsourceとして読み込まれているからです。最後にコンテナCNがこの新しい lxc-CN-profile を使用するために、以下の行をコンフィグファイルに追加してください。
lxc.aa_profile = lxc-CN-profile
lxc-execute
はApparmorプロファイルに入りませんが、生成されたコンテナは隔離されます。
この文章は、Ubuntuサーバーガイドの中の仮想化に関するLXCのページを翻訳したものです。
本家と同じCreative Commons ShareAlike 3.0 License (CC-BY-SA)を採用しています。
fluxflex, inc.のサポートを受け、Kei Kuboと、Keisuke Sogawaが翻訳しました。