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

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

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

皆さま初めまして。田向と申します。今回から数回にわたり,加藤さんに代わって,本連載の執筆を担当させていただくことになりました。よろしくお願いいたします。

前回まで,Ubuntuを使ったLXCの基本的な機能を紹介してきましたので,今回からUbuntu以外のディストリビューションでのLXCの構築や活用について紹介していきます。

第8回で,コンテナを作成するコマンドとしてlxc-createを紹介しました。作成したいコンテナに応じて,-tオプションでテンプレートディレクトリ(デフォルトで/usr/share/lxc/templatesにあるテンプレートを選択します。

/usr/share/lxc/templates$ wc *
   387   1220  10789 lxc-alpine
   486   1708  13533 lxc-altlinux
   331   1170  10253 lxc-archlinux
   376   1337   9446 lxc-busybox
   922   3741  28932 lxc-centos
   335   1248  10150 lxc-cirros
   459   1507  12158 lxc-debian
   587   1987  17427 lxc-download
  1424   6455  47200 lxc-fedora
   821   3203  27808 lxc-gentoo
   490   1725  13961 lxc-openmandriva
   433   1528  13705 lxc-opensuse
   839   3850  35445 lxc-oracle
   389   1601  11837 lxc-plamo
   275    921   6851 lxc-sshd
   809   2937  24273 lxc-ubuntu
   406   1584  12401 lxc-ubuntu-cloud
  9769  37722 306169 合計

テンプレートの中身については,第7回のときに簡単に紹介しました。今回は,Plamoテンプレートlxc-plamoを題材に,テンプレートの中で何が行われているのかを,詳細に見ていきたいと思います。

Plamoテンプレートや他のテンプレートの全体は,上記テンプレートディレクトリから参照できます。もし,お手元の環境でlxcがインストールされていなければ,テンプレートの元になる雛型ファイルではありますが,GitHubの生ソースなどを参考にしてください。

Plamoテンプレートの内部紹介

テンプレートは,基本的に標準的な引数を受け取り,指定された場所にコンテナのルートファイルシステムを作成する実行可能なファイルです。テンプレートの形式は,必ずしもシェルスクリプトでなくても良いのですが,今のところPlamoテンプレートを含むすべてのテンプレートが,シェルスクリプト(bash)で書かれています。

テンプレートは,大きく分けて以下の部分で構成されています。

  1. コンテナを作成するためにインストールする資材(パッケージ)をダウンロードする部分
  2. コンテナのルートファイルシステムにパッケージをインストールする部分
  3. 作成したコンテナ内の設定ファイルなどをコンテナ向けに調整する部分
  4. コンテナの設定ファイルconfigを作成する部分

これらを順に説明してきます。

パッケージのダウンロード

まず,Plamo Linuxインストーラのパッケージの分類(カテゴリ)について,簡単に説明します。

Plamo Linuxインストーラには,plamoディレクトリとcontribディレクトリがあり,plamoディレクトリには,現在のところ11種類のカテゴリが用意されています。

00_base
Plamo Linuxの動作に必須のカーネルや基本コマンド,設定ファイルなど。すべての環境でインストールする必要があります。
01_minimum
ALSAやGCC,Perl,Pythonなど,Xなしでも使える重要コマンド集。サーバなどのコンソール環境で使う場合は,ここまででたいてい間に合うはずです。
02_x11
X11とXに必須のパッケージ群。ウィンドウマネージャはtwmのみです。
03_xclassics
GNOMEで使われていたEsounDサウンドサーバや,伝統的なXプロトコルレベルでプロセス間通信を行うソフトウェア,AfterstepやQvwmなどの伝統的なウィンドウマネージャ,CannaやFreeWnn,Kinput2などの伝統的なFEPやIM(インプットメソッド)システム。ここまでインストールすれば,古き良きワークステーション相当の環境になるはずです。
04_xapps
最近のGUI環境の主流になっているGTK環境と主にGTKベースなアプリケーション群。
05_ext
XfceとKDEが共通に利用する,PulseAudioなどの機能拡張用ライブラリを中心としたアプリケーション群。iBusやuim,SCIMなどの最近のインプットメソッドも含みます。
06_xfce
シンプルながら高機能なXfceデスクトップ環境。
07_kde
多機能なKDEデスクトップ環境。
08_tex
TeXの統合パッケージであるTeX Live。
09_kernel
Linuxカーネルのソースコード。
10_lof
Office用統合ツールであるLibreOffice。

これらのカテゴリのうち,00_baseはPlamo Linuxの動作に必須,01_minimumはほぼ必須の環境で,02_x11以降は必要に応じて取捨選択可能です。

一方,contribディレクトリには,以下のようなカテゴリがあります。これらは,サポートレベルが低いパッケージ(カテゴリ)や,ステージングとしての位置づけであるパッケージ(カテゴリ)が含まれています。

カテゴリ含まれる内容
AVtoolオーディオ&ビジュアルツールパッケージ
DBデータベース関連パッケージ
Devel開発向けパッケージ
Education教育用(主に言語系)パッケージ
EmacsEmacs関連パッケージ
Hamradioアマチュア無線関連パッケージ
HaskellHaskell(関数型プログラミング言語)パッケージ
KernelLinuxカーネルパッケージ(予備)
Libraryライブラリ関連パッケージ
MUAMUA(電子メールクライアント)パッケージ
Network ネットワーク関連パッケージ
PythonPython関連パッケージ
Texlive2010Tex Live 2010パッケージ
Texttoolテキスト処理関連パッケージ
Utilitiesユーティリティパッケージ
VLCVLCメディアプレーヤーパッケージ
Virtualization仮想化関連パッケージ
X11X11関連パッケージ

これらのパッケージは,開発中のPlamo Linuxパッケージを格納しているミラーサーバから取得できます。ミラーサーバの内容は,日々更新されているので,ダウンロード時点の最新パッケージ構成で,コンテナを作成することができます。ミラーサーバの情報は,テンプレート内の以下の変数で表現しています。

DLSCHEME
ダウンロードスキーム。httpまたはftpを指定します。デフォルトはhttpです。
MIRRORSRV
ミラーサーバを指定します。デフォルトはwww.ring.or.jpです。
MIRRORPATH
インストーラのパスを指定します。デフォルトは/pub/linux/Plamoです。

仮に,Plamo Linuxインストーラのplamoディレクトリ以下とcontribディレクトリ以下のカテゴリをすべてインストールする場合,インストールDVD1枚分相当のサイズをダウンロードすることになり,またパッケージ展開後のサイズの合計は十数GBに及ぶので,あまり汎用的とは言えません。そこで,Plamoテンプレートでは以下の変数を用意して,ダウンロードするカテゴリ/パッケージを制御できるようにしています。

CATEGORIES
ダウンロードするplamoディレクトリ以下のカテゴリを指定します。デフォルトは00_base01_minimumです。
EXTRACTGRS
ダウンロードするcontribディレクトリ以下のカテゴリを指定します。デフォルトは指定なし,つまりダウンロードしません。
IGNOREPKGS
上記のカテゴリ内のパッケージのうち,ダウンロード対象から除外するパッケージを指定します。デフォルトはgrubkernellilolinux_firmwaremicrocode_ctlcpufreqdcpufrequtilsおよびgpmです。
ADDONPKGS
上記のカテゴリに含まれていないパッケージで,ピンポイントでダウンロードするパッケージを指定します。デフォルトはcontrib/Hamradio/{morse,qrq}です。

これらの変数は,Plamoテンプレート実行時の環境変数で上書きして設定可能です。

パッケージをダウンロードする関数download_plamo()を以下に示します。

download_plamo()関数

download_plamo() {
  # check the mini plamo was not already downloaded
  if ! mkdir -p $ptcache ; then
    echo "Failed to create '$ptcache' directory."
    return 1
  fi
  # download a mini plamo into a cache
  echo "Downloading Plamo-$release minimal..."
  cd $ptcache
  case $DLSCHEME in http) depth=2 ;; ftp) depth=3 ;; esac
  rej=${IGNOREPKGS%% *} ; [ -n "$rej" ] && rej="$rej-*"
  if [ `echo $IGNOREPKGS | wc -w` -gt 1 ] ; then
    for p in ${IGNOREPKGS#* } ; do rej="$rej,$p-*" ; done
  fi
  for i in $CATEGORIES ; do
    wget -nv -e robots=off -r -l $depth -nd -A .tgz,.txz -R "$rej" \
        -I $MIRRORPATH/Plamo-$release/$arch/plamo/$i \
        -X $MIRRORPATH/Plamo-$release/$arch/plamo/$i/old \
        $DLSCHEME://$MIRRORSRV$MIRRORPATH/Plamo-$release/$arch/plamo/$i
    if [ $? -ne 0 ] ; then
      echo "Failed to download the rootfs, aborting."
      return 1
    fi
  done
  for i in $EXTRACTGRS ; do
    wget -nv -e robots=off -r -l $depth -nd -A .tgz,.txz -R "$rej" \
        -I $MIRRORPATH/Plamo-$release/$arch/contrib/$i \
        -X $MIRRORPATH/Plamo-$release/$arch/contrib/$i/old \
        $DLSCHEME://$MIRRORSRV$MIRRORPATH/Plamo-$release/$arch/contrib/$i
    if [ $? -ne 0 ] ; then
      echo "Failed to download the rootfs, aborting."
      return 1
    fi
  done
  for p in $ADDONPKGS ; do
    wget -nv -e robots=off -r -l $depth -nd -A "`basename $p`-*" \
        -I $MIRRORPATH/Plamo-$release/$arch/`dirname $p` \
        -X $MIRRORPATH/Plamo-$release/$arch/`dirname $p`/old \
        $DLSCHEME://$MIRRORSRV$MIRRORPATH/Plamo-$release/$arch/`dirname $p`
    if [ $? -ne 0 ] ; then
      echo "Failed to download the rootfs, aborting."
      return 1
    fi
  done
  mv $ptcache $dlcache
  echo "Download complete."
  return 0
}

Plamo Linuxインストーラ内のカテゴリは,機能単位でまとめられたサブカテゴリを含んでいるので,wgetコマンドを使ってパッケージを再帰的に取得しています。他のテンプレートにおいても,download_<テンプレート名>のような関数名になっているので,興味があればダウンロードの方法を比較してみるのも面白いでしょう。

著者プロフィール

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

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

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

コメント

コメントの記入