Ubuntu 12.04 LTSの目標の一つは、LXC(Linux Containers)の充実でした。11.04の頃から本格的にサポートを開始したLXCは、かんたんに軽量な仮想環境を作成できるとあって、アプリケーションのテスト環境やJujuのようなクラウドマシンの生成ツールでも使われています。
さらに今回のリリースでは、x86マシン上でARMの実行環境を生成できるようになりました。そこで今回は、UbuntuにおけるLXCの基本的な使い方を紹介します。
LXCで仮想環境を作る
LXCはLinuxカーネルのControl GroupやNamespaceという機能を使って、ホストOSとは隔離された環境を作るツールです。LXCのパッケージにはテンプレートという形で各OSの最小構成のrootfs環境を作るスクリプトも付属しているため、VirutalBoxやXenのようにコマンドラインから簡単に仮想環境を作成できます。実態はただのchroot環境なので、KVMのようなハードウェアによる支援機構は必要なく、カーネルをそのまま使うため高速に起動や終了が動作することも特徴です。そのため、VPSやAWS上でも手軽に仮想環境を作成できます。
例えば第201回で紹介したArkoseも内部ではLXCを使っていますし、Software Design 2012年5月号で紹介しているJujuもLXCを使ったテスト環境の構築をサポートしています。
ただし、Linuxカーネルの機能を使っているため、ホストもゲストもLinuxで、さらに同じカーネル上で動作することになります。
LXCを使うには、lxcパッケージをインストールするだけです。LXCのチュートリアルで説明されることのあるcgroupの作成・マウントやブリッジインターフェースの作成などの環境構築は、パッケージ側でやってくれるのでインストールしたらすぐにLXCを使い始めることができます。
$ sudo apt-get update
$ sudo apt-get install lxc
Ubuntu環境を作る
仮想環境を作るにはlxc-createを作ります[1]。例えば、ホストOSと同じ環境を作るには以下のコマンドを入力します。
$ sudo lxc-create -t ubuntu -n precise
"-t ubuntu"はテンプレート名です。「/usr/lib/lxc/templates/lxc-テンプレート名」というファイルを参照します。中身を見ていただければわかるのですが、このテンプレートは実際に環境を作るためのシェルスクリプトになっています。このため、このシェルスクリプトをいじれば自由に好みの環境を作れます。
"-n precise"は作成した環境の名前を設定しています。今後はこの名前を指定することで、LXCの起動・終了・削除を行います。作成済みの環境のリストは「sudo lxc-list」コマンドで取得できます。
作成時にテンプレートにオプションを渡したい場合は、ハイフンを2つ連続してつけたあとに渡したいオプションを記述します。Ubuntuの場合、標準状態ではホストと同じリリースの環境を作成しますが、もし特定のリリース(例えばoneiric)の環境を作成したい場合は、次のように"-r"オプションをテンプレートに渡す必要があります。
$ sudo lxc-create -t ubuntu -n oneiric -- -r oneiric
lxc-createは必要なパッケージをダウンロードして、環境を構築するため若干時間がかかります。環境が構築できたら、lxc-startコマンドでその環境を立ち上げましょう。
$ sudo lxc-start -n precise
端末にシリアルコンソールのログが表示され、すぐにログインプロンプトが現れるはずです。初期設定では「ログイン名:ubuntu、パスワード:ubuntu」でログインできます。NAT接続になっているので、ゲストからのインターネット接続も特に問題なく行えます。よって、起動後に追加のパッケージをインストールすることで、ホストと独立した環境を構築できます。
Ubuntuテンプレートの場合、最初からopenssh-serverがインストールされるため、ホストからsshコマンドでログインするという方法もあります。初期設定ではゲストOSには、10.0.3.0/24のアドレスがDHCPで割り当てられるので、ゲストでIPアドレスを確認した上で、sshによる接続を試してみるとよいでしょう[2]。
コンソールの出力を抑制したい場合は"-d"オプションをつけます。次のように"-c"オプションと併用すればコンソールログを特定のファイルに出力できますし、lxc-consoleでいつでもコンソールを取得できます[3]。
$ sudo lxc-start -n precise -d -c /var/lxc-console.log
仮想環境をホストからシャットダウンする場合はlxc-shutdownです。
$ sudo lxc-shutdown -n precise
どうしても終了しない場合は、lxc-stopで強制終了しましょう。
$ sudo lxc-stop -n precise
なお、仮想環境は「/var/lib/lxc/仮想環境名」以下に作られます。例えば上記の場合ファイルシステムは「/var/lib/lxc/precise/rootfs」以下に作られるため、ここのファイルを編集することでホストからもゲストの構成を設定可能です。
ファイルシステムを含めて完全に削除したい場合は、lxc-destroyコマンドを使います。
$ sudo lxc-destroy -n precise
Fedora環境を作る
Linuxカーネルを使う他のLinuxディストリビューション相当の環境を作ることもできます。例えばLXCパッケージには最初からfedora用のテンプレートがあるので、これを使ってFedora環境を構築できます。環境構築時にYumを使うため、yumパッケージをインストールしておいてください。
$ sudo apt-get install yum
$ sudo lxc-create -t fedora -n fedora
Fedoraの場合、一般ユーザーのアカウントは作られません。rootとしてパスワードもrootでログインしてください。Ubuntuと同じようにsshで接続したい場合は、さらに次のコマンドをゲストで実行します。
# yum install openssh-server
# service sshd start
Debian環境を作る
Debian環境を作る場合、そのままのテンプレートだといくつか使い勝手が悪いため、次のような修正を行いましょう。前者は-nで指定した値を、lxc.utsnameに指定しています。後者は最初にインストールされるパッケージを移行パッケージになったdhcp3-clientではなく、新しいisc-dhcp-clientに変更します。
$ sudo sed -i "s/copy_configuration \$path \$rootfs/copy_configuration \$path \$rootfs \$name/" /usr/lib/lxc/templates/lxc-debian
$ sudo sed -i "s/dhcp3-client/isc-dhcp-client/" /usr/lib/lxc/templates/lxc-debian
sid環境を作るには次のコマンドを入力します。
$ sudo SUITE=sid lxc-create -n debian -t debian
アカウントとパスワードについてはFedoraの時と同じです。
特殊な環境を作る
前述のテンプレートを流用すれば、VineやScientific Linuxといった他のLinuxディストリビューションの環境も構築できます。それ以外にも、いくつか特殊な環境の構築方法があるので、ここで紹介しておきます。
既存の環境を流用して一時的な実行環境を作る
lxc-start-ephemeralコマンドを使えば、作成済みの環境を流用して起動し、シャットダウン時に起動後に加えた変更をすべて破棄するような、一時的な実行環境を生成できます。
$ sudo lxc-start-ephemeral -n precise
(ゲストに何がしかの変更を加える)
$ sudo lxc-stop -n precise
(上記で加えた変更点は破棄される)
ARMの実行環境を作る
Ubuntu 12.04 LTSでは、マルチアーキテクチャのサポートが充実したために、LXCを使ってx86マシン上にARM環境を簡単に構築できるようになりました。環境の構築方法は、テンプレートに"-a"オプションでアーキテクチャ(今回はarmhf)を指定するだけです。
$ sudo apt-get install qemu-user-static
$ sudo lxc-create -n armhf -t ubuntu -- -a armhf
$ sudo lxc-start -n armhf
qemu-user-staticパッケージをインストールしていることからわかるように、内部ではQEMUのユーザーモードエミュレーションを使って実行しているだけです。このため、速度はほとんど出ません。
便利な使い方
設定を変更する
LXCは構築時のオプションや設定ファイルを変更することで、さらに便利な使い方ができます。設定は主に次の4つの方法があります。
- - lxc-create時に設定される、/etc/default/lxcを編集する
- - lxc-start時に設定される、/etx/lxc/lxc.confを編集する
- - lxc-start時にゲスト固有で設定される、/var/lib/lxc/ゲスト名/configを編集する
- - lxc-start時にオプションで指定する
最後の設定方法は次のように-sオプションを使います。
$ sudo lxc-start -n precise -s lxc.network.ipv4=10.0.3.5/24
他の設定については、man lxc.fonfやUbuntuのドキュメントを参照してください。
LVMを使う
lxc-createはファイルシステムを「/var/lib/lxc/仮想環境名/rootfs」以下に作成しますが、"-B"オプションを使えばLVMのボリュームに変更することが可能です。
$ sudo lxc-create -t ubuntu -n precise -B lvm --vgname VolGroup00 --fssize 5G
上記の場合、VolGroup00のグループに仮想環境名と同じな前の論理ボリュームを、サイズ5GB、ファイルシステムext4で作成した上で、そこにルートファイルシステムを構築します。
仮想環境の複製やバックアップ、レストア
仮想環境一式を別の名前で複製する場合は、lxc-cloneを使います。
$ sudo lxc-clone -o precise -n precise2
LVMを使っている場合は、-vや-Lオプションを併用してください。
仮想環境のファイルシステムだけをバックアップするなら、lxc-backupコマンドがあります。
$ sudo lxc-backup precise
-nオプションは「つけない」ことに注意してください。これにより「/var/lib/lxc/仮想環境名/rootfs.backup数字」が生成されます。レストアする場合は、次のコマンドです。
$ sudo lxc-restore precise 数字