LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術

第13回 LXCの構築・活用 [1] ― テンプレートを紐解く

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

コンテナのインストール

install_plamo()の関数では,コンテナのルートファイルシステムに対し,パッケージのインストールを行います。他のテンプレートにおいても,install_<テンプレート名>のような関数名になっています。この関数の中核となる部分は以下のコードになります。

      for p in `ls -cr $dlcache/*.t?z` ; do
        installpkg -root $rtcache -priority ADD $p
      done

ここでは,download_plamo()ダウンロードした順にパッケージをインストールしていきます。そのため,インストールされたコンテナのルートファイルシステムは,通常のインストーラでベアメタルのルートファイルシステムにインストールした場合と,ほぼ同じ結果が得られます。

細かいことをいうと,通常のインストーラでは,カテゴリ内のパッケージとサブカテゴリを区別しないで,アルファベット順にインストールしていくのに対し,install_plamo()では,wgetコマンドの仕様上,まずカテゴリ内のパッケージをアルファベット順にインストールしてから,サブカテゴリをアルファベット順にインストールしていきます。そのため,インストールした結果が若干異なりますが,動作上まったく問題ないので,特に気にすることはありません。

なお,ここに出てくるinstallpkgコマンドは,Slackware由来のものであるため,ディストリビューションによっては用意されていません。そこで,パッケージのインストールに先立ち,installpkgコマンドをLXCキャッシュディレクトリに一時的にインストールしておき,Plamo Linux以外のディストリビューション上でも,Plamoコンテナを作成できるようになっています。

LXCキャッシュディレクトリにインストールしたinstallpkgコマンドは,異なるディストリビューション上で展開したファイル/ディレクトリのUID/GIDを,システム側に合わせることなく,オリジナルのUID/GIDを維持します。以前,いくつかのテンプレートで,この考慮が抜けているケースがあったのですが,筆者がテンプレートに対する修正パッチを投稿したので,現在lxc-1.0.5以降)は任意のディストリビューション上で,どのテンプレートを使ってコンテナを作成しても,コンテナのルートファイルシステム上のファイル/ディレクトリは,正しいUID/GIDで展開されるようになっています。

コンテナ内の設定ファイルの調整

Plamoテンプレートを使って作成したコンテナを起動するとき,コンテナ内ではinitを最初に起動して,通常のOSが起動するのと同じような環境を作成します。このような環境を,システムコンテナと呼ばれるということを,以前説明しましたね。

configure_plamo()の関数では,作成したコンテナ内の設定ファイルをコンテナ向けに調整したり,コンテナ内で起動するrcスクリプトの不要な処理の削除などを行います。他のテンプレートにおいても,configure_<テンプレート名>のような関数名になっています。

デバイスファイルの初期化
Plamoコンテナでは,起動時のudevを無効にしているので,コンテナの起動に必要なデバイスファイルを作成したり,権限を調整します。また,udevのログレベル出力を無効にします。
/etc/fstabの初期化
ファイルシステム情報ファイルをコンテナ向けに作成します。
/etc/inittabの修正
lxc-startコマンドを実行したとき,コンソールにログインプロンプトを表示するための設定を追加し,ログインプロンプトを表示する仮想コンソールを4つに制限します。また,lxc-stopコマンドを実行すると,デフォルトではSIGPWRinitに送ります。このとき,Plamo Linuxのデフォルト設定だと,ランレベル1(シングルユーザモード)に移行し,lxc-stopによってコンテナを強制停止する60秒後に,コンテナ上のすべてのタスクがkill -9されるまで,システムが停止しません。そこで,SIGPWRinitに送られたらシステムが停止するように,/etc/inittabを修正します。
ホスト名の設定
lxc-createコマンドの-nオプションで指定した名前を,コンテナのホスト名として設定します。
ネットワークの設定
DHCPを使うように,コンテナのネットワークを設定します。
タイムゾーンの設定
コンテナのタイムゾーンを+0900(JST)に設定します。
/etc/pam.d/loginファイルの編集(libvirt対策)
libvirtのLXCドライバ経由でゲストにログイン可能にするため,/etc/pam.d/loginファイル内のpam_loginuid.soの行をコメントアウトします。
/etc/ld.so.confファイルの生成
コンテナ上でldconfigを実行して,/etc/ld.so.confファイルを生成します。
パスワードの設定
rootのパスワードを暫定的に"root"に設定します。
/etc/rc.d/rc.[SM]ファイルの編集
コンテナ内で起動するrcスクリプトの不要な処理の削除などを行います。
/etc/rc.d/rc.inet1.tradnetファイルの生成および編集
カスタマイズしたnetconfigコマンドのコピーを実行して,/etc/rc.d/rc.inet1.tradnetファイルを生成します。また,ホストOSで無線LANを使用するために,カーネルの起動時パラメータにwlanを指定した環境でコンテナを起動すると,起動スクリプトでもホストOSの/proc/cmdlineを参照して,コンテナ上でも無線LANを使用しようとします。そのため,無線LANの設定を抑止する処理を追加します。

通常,シェルスクリプトでファイルの一部を編集するとき,sedコマンドやインラインでpatchコマンドを使って行うのが一般的です。ところが,/etc/rc.d/rc.[SM]ファイルのように,広範囲の行をまとめて削除するなど編集対象が多くなると,パッチを含んだテンプレートのサイズも大きくなってしまいます。そのため,Plamoテンプレートではedコマンドを使って,以下のように/etc/rc.d/rc.[SM]ファイルを編集しています。これにより,編集元ファイルの変更に対して堅牢である上,テンプレートのサイズを250行近く削減できています。

  # /etc/rc.d/rc.S
  ed - $rootfs/etc/rc.d/rc.S <<- "EOF"
        /^mount -w -n -t proc/;/^# ln -s \/bin\/true/-1d
        /^mknod \/dev\/unikey/;/^# Clean \/etc\/mtab/-2d
        /^# copy the rules/;/^# Set the hostname/-1d
        /^# Check the integrity/;/^# Clean up temporary/-1d
        w
        EOF
  # /etc/rc.d/rc.M
  ed - $rootfs/etc/rc.d/rc.M <<- "EOF"
        /^# Screen blanks/;/^# Initialize ip6tables/-1d
        /^# Initialize sysctl/;/^echo "Starting services/-1d
        /^sync/;/^# All done/-1d
        w
        EOF

コンテナの設定ファイルconfigの作成

copy_configuration()の関数では,コンテナの設定ファイルconfigを完成させます。他のテンプレート間で,処理内容にあまり顕著な違いが見られないこともあり,テンプレートに依らない共通の関数名になっているようです。また,中身が空のfstabファイルも併せて作成します。

lxc-createコマンドを実行すると,コンテナの設定ファイルのヘッダ部が作られ,第8回で説明したように,コンテナのデフォルト設定ファイルの設定値がコピーされます。その後,copy_configuration()によって,lxc.utsnamelxc.mountlxc.archの設定および共通で使用する設定ファイルを読み込む設定lxc.includeが追記されます。これらの設定項目については,第11回を参照してください。

まとめ

今回は,Plamoテンプレートlxc-plamoを題材に,テンプレートの中身を詳しく紹介しました。テンプレートを機能ごとに分けて見ていくと,意外とすっきりした構成であることが,おわかりいただけたのではないかと思います。他のテンプレートについても,基本的にやっていることは同じですので,ぜひ中身を紐解いてみてください。

次回は,lxc-createコマンドを使ってコンテナを作成するときの,root権限と一般ユーザ権限での動作の違いを紹介し,その後でPlamo Linuxを使ったLXCの構築や活用について紹介する予定です。

著者プロフィール

田向正一(たむきしょういち)

本業では,Linuxベースのクラウドシステムを開発する傍ら,いろいろなOSSコミュニティに首を突っ込んでいます。昨年あたりから,LXCの開発に参加するようになりました。vi ()をこよなく愛し,プログラミングからMIDIデータの打ち込みまで,viを使った生活環境にどっぷり浸っています。Plamo Linuxメンテナ。これからの世代の人たちに,UNIX/Linux文化の楽しさを広く伝えることを目標としています。

※ nviです。vimではありません。