今回からはいよいよLXCの話題です。まずは開発の歴史と現在の開発体制を少し紹介したあと、
LXCの歴史
LXCはLinuxカーネルにコンテナ関連の機能が実装されはじめた2008年頃から、
その後、
2012年にリリースされたUbuntu 12.
この頃までのLXCは、
2013年9月にはDaniel Lezcano氏が多忙のため、
この後0.
1.
以上のようにUbuntuを中心にして開発が進んでいるため、
LXCの特徴
通常はLXCの特徴というとコンテナが持つ特徴をあげることが多いです。しかしそれは第2回ですでに紹介していますので、
豊富なテンプレート
コンテナを使用する際は、
そこでLXCにはコンテナを作成するためのスクリプトとしてテンプレートが付属しています。テンプレートを使うと、lxc-create
コマンドから直接使えます。
各種ディストリビューションに対応したテンプレートは、
ディストリビューション用のテンプレートだけでなく、
テンプレートは全てシェルスクリプトで書かれていますので簡単にカスタマイズできます。実際、
1.
$ 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テンプレートの一部です。ご覧のようにシェルスクリプトで書かれていますし、
:
:(略)
:
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
イメージのダウンロード
テンプレートには、lxc-download
という名前のテンプレートが付属しており、
この機能は1.
このコンテナイメージは、
Dockerではあらかじめ作成したイメージが提供されており、
執筆時点で準備されているダウンロード用のイメージは以下の通りです。
ディストリビューション | バージョン | アーキテクチャ | バリアント |
---|---|---|---|
CentOS | 6 | amd64 i386 | default |
7 | amd64 | default | |
Debian | jessie sid wheezy | amd64 armel armhf i386 | default |
Fedora | 19 20 | amd64 armhf i386 | default |
Gentoo | current | amd64 armhf i386 | default |
openSUSE | 12. | amd64 i386 | default |
Oracle | 6. | amd64 i386 | default |
Plamo | 5. | amd64 i386 | default mini |
Ubuntu | lucid | amd64 i386 | default |
precise | amd64 armel armhf i386 | default | |
trusty utopic | amd64 arm64 armhf i386 ppc64el | default |
「バリアント」とは
ディストリビューションによってはコンテナイメージ内に含まれるパッケージが異なる複数のイメージが準備されていることがあります。このイメージごとに名前が付けられており、
APIと各種言語のバインディングの提供
LXCにはlxc-
で始まるコンテナ用のコマンドが付属しています。これらは全てLXCライブラリのAPI
このAPIを使って自分でアプリケーション内からコンテナが操作できます。また、
- Python3
- Lua
- Go
- Ruby
このうち、
LXCでインストールされるコマンドのいくつかはPython3とLuaで書かれています。
- Python3で書かれているコマンド
- lxc-device, lxc-ls, lxc-start-ephemeral
- Luaで書かれているコマンド
- lxc-top
いろいろなストレージバックエンドのサポート
ストレージバックエンドは、
1.
- ディレクトリ (デフォルト)
- btrfs
- zfs
- lvm
- ループデバイス
- aufs
- overlayfs
作成時やクローン、
またlvmを使用する場合、
クローンとスナップショット
テンプレートを使ってコンテナを新規に作成するのでなく、
btrfsやzfsやlvmのような多機能なストレージバックエンドを使っている場合は、
通常のディレクトリを使用している場合でも、
また、
セキュリティ
コンテナごとの隔離がされていない部分などに対するセキュリティの確保や、
また、
一般ユーザでのコンテナの起動
第2回で説明したユーザ名前空間を使った一般ユーザでのコンテナの作成と起動が可能です。
root権限で実行するコンテナと全く同じことが一般ユーザでできるわけではありませんが、
ネストしたコンテナ
コンテナのネストが可能です。つまりLXCで作成し起動したコンテナの中でコンテナが動作します。
日本語マニュアルの付属
これは機能ではありませんし、
LXC 1.
LXCの気になる点
LXCの改良すべき点はたくさんあると思います。しかし、
短所は思いつきませんが気になる点はあります。現時点で筆者が一番気になる所はcgroupの設定です。
コンテナに対してcgroupでリソース制限をかける場合、
たとえばdevicesサブシステムの場合、devices.
とdevices.
というファイルに許可したいデバイス用のアクセス権を設定しました。これをLXCで設定すると以下のようになります。
$ cat /usr/share/lxc/config/ubuntu.common.conf : (略) # Default cgroup limits lxc.cgroup.devices.deny = a ## Allow any mknod (but not using the node) lxc.cgroup.devices.allow = c *:* m lxc.cgroup.devices.allow = b *:* m ## /dev/null and zero lxc.cgroup.devices.allow = c 1:3 rwm lxc.cgroup.devices.allow = c 1:5 rwm : (略)
lxc.
に続いて、
カーネルのバージョンやディストリビューションの設定によってcgroupfs以下に現れるファイルが異なることもあります。細かくコンテナのリソース制御を行いたい場合にはcgroupの知識が必要なことに加えて、
この辺りを改善する提案はでていましたので、
まとめ
今回はLXC開発の歴史について紹介したあと、
次回からは今回紹介した特徴の説明も含めて、
Ubuntuを使った基本的な機能の紹介が済んだ後に、
最近のLXCのリリース
第4回の記事を執筆中にLXC 1.
1.
一方で次のバージョンとなる1.
1.