Ubuntu Weekly Recipe

第226回 LXCで軽量仮想環境の活用

この記事を読むのに必要な時間:およそ 3 分

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
注1
今回はシステムコンテナーを使った方法のみ説明します。ホストOSのファイルシステムを使って特定のアプリケーションのみを隔離環境で実行するアプリケーションコンテナーについては,lxcやlxc-executeのmanページを確認してください。
注2
ゲストにavahi-daemonパッケージをインストールしてしまえば,IPアドレスを調べなくてもホスト名であるpreciseを使って"ssh ubuntu@precise.local"といった形でログインすることも可能です。
注3
切断する場合はCtrl-a qを押します。

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の時と同じです。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入