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

第7回 LXCの歴史と特徴

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

今回からはいよいよLXCの話題です。まずは開発の歴史と現在の開発体制を少し紹介したあと,LXC自身が持つ特徴を紹介したいと思います。

LXCの歴史

LXCはLinuxカーネルにコンテナ関連の機能が実装されはじめた2008年頃から,当時IBMフランスのDaniel Lezcano氏を中心にして,カーネルの機能を使用してコンテナの操作を行うためのツールとして開発がはじまっています。当時の文書を読むと,カーネルに実装されたコンテナ関連の機能をカーネル開発者が簡単に試せるようにすることを目的としていたようです。

その後,開発はかなり活発に行われ2009年にはバージョンは0.6に達しています。筆者が初めてLXCを使い始めたのは2009年の年末で0.6.4の頃です。この頃にはすでに簡単にコンテナの起動や管理ができていました。この後はAppArmorのサポートのようにセキュアにコンテナを使用するための機能など,実用に向けた機能が徐々に実装されていきました。

2012年にリリースされたUbuntu 12.04 LTSではUniverseリポジトリですがLXCパッケージが含まれており,この頃にはかなり安定して実用的にコンテナが扱えるツールに成長していました。この年にリリースされた0.8.0で,2008年から開発が進められたLXCとしてはほぼ完成の域に達していたと言えるかもしれません。Ubuntu 12.04 LTSに含まれるLXCは0.7.5ですが,0.8.0の新機能がバックポートされており,実質0.8.0と言っても良い機能を持っています。

この頃までのLXCは,主要機能を扱うコマンドはC言語で実装されていましたが,周辺の管理コマンド等はLinuxに通常含まれているコマンドのラッパーとして実装されているシェルスクリプトだったりしました。手間をかけずにあるものをうまく工夫して使っている所があり,必要最低限の機能が実装されているものの,少し寄せ集め感がありましたし,コマンドによっては柔軟な使い方ができないこともありました。

2013年9月にはDaniel Lezcano氏が多忙のため,メンテナがこの頃実質的に開発を引っ張っていたSerge Hallyn氏とStéphane Graber氏に交代し,開発もGitHub上で行われるようになりました※1)。両氏ともにCanonical社のエンジニアですので,この頃から開発はUbuntuを中心に行われていくようになりました。

この後0.9.0の頃からAPIの整備が始まり,その後も1.0を安定版としてUbuntu 14.04 LTSに入れることを目標にAPIの整備が進められました。各種コマンドはそのAPIを使用して一貫性を持つ実装になり,APIを使った各種言語のバインディングも整備されていきました。

1.0の開発はリリース直前までかなり激しく機能が追加されていました。それでも無事2014年の2月20日にリリースされ,4月にリリースされたUbuntu 14.04 LTSでは目玉となる新機能のひとつとしてLXC 1.0が含まれました。

以上のようにUbuntuを中心にして開発が進んでいるため,Ubuntu以外で動かすときは問題があるのではないかと心配される方もいらっしゃるかもしれません。しかし,アクティブな開発者の中にはOracleのエンジニアやFedora上で開発をしている開発者もいますので,Ubuntu以外のディストリビューションでも問題なく動きますし,問題がある場合でもすぐに修正がされます。

※1)
実際はDaniel Lezcano氏もまだメンテナに名前は連ねています。

LXCの特徴

通常はLXCの特徴というとコンテナが持つ特徴をあげることが多いです。しかしそれは第2回ですでに紹介していますので,ここではLXC自身の特徴をいくつか紹介したいと思います。

豊富なテンプレート

コンテナを使用する際は,仮想マシンの時のようにCD,DVD,ISOイメージなどを用いて一からインストールできません。コンテナが起動したときの/(ルート)以下のディレクトリツリー(以降,コンテナイメージ)を作り,起動に必要な設定を行うのは少し面倒です。またコンテナとして起動させるために設定ファイルのカスタマイズが必要な場合もあります。

そこでLXCにはコンテナを作成するためのスクリプトとしてテンプレートが付属しています。テンプレートを使うと,簡単にコンテナイメージを作成し,コンテナの起動に必要な変更を行い,設定ファイルを作成できます。このテンプレートはコンテナを作成するためのlxc-createコマンドから直接使えます。

各種ディストリビューションに対応したテンプレートは,そのテンプレートと同じディストリビューション上で動かすのが基本ですが,DebianやUbuntuのように多数のパッケージが準備されているディストリビューションだと,rpmやyumのパッケージをインストールしてFedoraやCentOSのコンテナを作成できます。

ディストリビューション用のテンプレートだけでなく,アプリケーションコンテナとしてsshdやbusyboxを起動させるためのテンプレートも付属しています。

テンプレートは全てシェルスクリプトで書かれていますので簡単にカスタマイズできます。実際,LXC 1.0に含まれているlxc-plamoというテンプレートは,筆者がubuntu用のテンプレートなどの他のテンプレートを真似しながら作ったものをマージしてもらいました。

1.0に標準で含まれるテンプレートは以下の17個です。

$ ls /usr/share/lxc/templates/
lxc-alpine     lxc-centos    lxc-fedora        lxc-oracle  lxc-ubuntu-cloud
lxc-altlinux   lxc-cirros    lxc-gentoo        lxc-plamo
lxc-archlinux  lxc-debian    lxc-openmandriva  lxc-sshd
lxc-busybox    lxc-download  lxc-opensuse      lxc-ubuntu

テンプレートの中も少し紹介しておきましょう。以下は17個のうちで一番シンプルなlxc-sshdテンプレートの一部です。ご覧のようにシェルスクリプトで書かれていますし,sshdを起動するのに必要なファイルを作成したりしているだけで,複雑なことをしているわけでもありませんので,これを見ながらカスタマイズを行うのもそれほど難しくはありません。


  :
  :(略)
  :
configure_sshd()
{
    rootfs=$1

    cat <<EOF > $rootfs/etc/passwd
root:x:0:0:root:/root:/bin/bash
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
EOF

    cat <<EOF > $rootfs/etc/group
root:x:0:root
sshd:x:74:
EOF

ssh-keygen -t rsa -N "" -f $rootfs/etc/ssh/ssh_host_rsa_key
ssh-keygen -t dsa -N "" -f $rootfs/etc/ssh/ssh_host_dsa_key

    # by default setup root password with no password
    cat <<EOF > $rootfs/etc/ssh/sshd_config
Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
UsePrivilegeSeparation yes
KeyRegenerationInterval 3600
ServerKeyBits 768
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords yes
ChallengeResponseAuthentication no
EOF

    if [ -n "$auth_key" -a -f "$auth_key" ]; then
        u_path="/root/.ssh"
        root_u_path="$rootfs/$u_path"
        mkdir -p $root_u_path
        cp $auth_key "$root_u_path/authorized_keys"
        chown -R 0:0 "$rootfs/$u_path"
        chmod 700 "$rootfs/$u_path"
        echo "Inserted SSH public key from $auth_key into $rootfs/$u_path"
    fi

    return 0
}
  :
  :(略)
  :
install_sshd $rootfs
if [ $? -ne 0 ]; then
    echo "failed to install sshd's rootfs"
    exit 1
fi

configure_sshd $rootfs
if [ $? -ne 0 ]; then
    echo "failed to configure sshd template"
    exit 1
fi

copy_configuration $path $rootfs $name
if [ $? -ne 0 ]; then
    echo "failed to write configuration file"
    exit 1
fi

著者プロフィール

加藤泰文(かとうやすふみ)

2009年頃にLinuxカーネルのcgroup機能に興味を持って以来,Linuxのコンテナ関連の最新情報を追っかけたり,コンテナの勉強会を開いたりして勉強しています。英語力のない自分用にLXCのmanページを日本語訳していたところ,あっさり本家にマージされてしまい,それ以来日本語訳のパッチを送り続けています。

Plamo Linuxメンテナ。ファーストサーバ株式会社所属。

Twitter:@ten_forward
技術系のブログ:http://d.hatena.ne.jp/defiant/

コメント

コメントの記入