LXC on Fedora 10

はじめに

Fedora 10でLXC(Linux Containers)を体験してみました。

LXCは、Linuxに取り込まれつつあるcontainerの機能を用いて、Linux-VServerやOpenVZのような仮想化環境を提供するLinuxカーネル機能およびそれを制御するツールです。

ここでは、containerを作成、sshdサーバをcontainer内部で動かし、container内部にログインする最も簡単な(手抜きな)方法を紹介します。作成するcontainerはホスト(root context)のファイルを使い回す簡易的なものです。また、カーネルコンフィギュレーションやLXCの機能不足のため、ネットワークのisolationやcontainerのroot権限降格はできません。つまりcontainerのeth0はホストのそれと同じで、rootもホストと同等の権限を持ちます。

準備

普通にインストールしたFedora 10にlxcをインストールします。カーネルの再構築は必要ありません*1

私の環境は以下の通りです。

手順

基本的にman lxcに書かれてある通りにディレクトリや設定ファイルを用意します。

chrootディレクトリを作る

ここでは/lxc/test/をcontainerのrootディレクトリとし、以下の構成のディレクトリを作ります。

# tree -d /lxc/test/
/lxc/test/
-- bin
-- dev
`-- pts
-- etc
-- home
-- lib
-- lib64
-- proc
-- root
-- sbin
-- sys
-- tmp
-- usr
`-- var |-- empty | `-- sshd |-- lib | `-- empty | `-- sshd |-- log `-- run `-- sshd
ホストのファイルをbind mountする

すべて読み込み専用でmountします。

mount -o ro,bind /lib /lxc/test/lib
mount -o ro,bind /lib64 /lxc/test/lib64
mount -o ro,bind /usr /lxc/test/usr
mount -o ro,bind /sbin /lxc/test/sbin
mount -o ro,bind /bin /lxc/test/bin
mount -o ro,bind /etc /lxc/test/etc
lxc用の設定ファイルを用意する

/lxc/lxc-test.conf

lxc.utsname = test
lxc.rootfs = /lxc/test/
lxc.mount = /lxc/fstab.test

この設定ファイルで/lxc/test/をrootとするtestという名前のcontainerが作成されます。

/lxc/fstab.test

/home /lxc/test/home none bind 0 0
/dev /lxc/test/dev none bind 0 0
/dev/pts /lxc/test/dev/pts  none bind 0 0

container作成時に自動的にmount、container破棄時にumountされます。

なおこれらのディレクトリもあらかじめ手作業でmountしておいてもかまいません。ただ、前述の/usrなどのディレクトリはlxcを実行する前にmountしておかなければlxcの実行に失敗してしまうようです。(/etcはfstabで良いかも。)

cgroupsを有効にする
sudo mount -t cgroup cgroup /cgroup

lxcは内部でcgroupsを使っているらしくcgroupfsをmountすることでcgroupsの機能を有効にしないといけないようです。(なくても動く?)マウントポイントはどこでも良いようです。

Container作成!

の前にホストのsshdを止めておきます。本当はsshdがbindするIPを制限する等の対処が正しいやり方ですがここでは省きます。

sudo service sshd stop

そして以下のコマンドを実行!

sudo /usr/local/bin/lxc-execute -n test -f /lxc/test/lxc-test.conf /usr/sbin/sshd

これでプロンプトが戻ってこなければ成功です。

※どうもlxcツールに不具合があるらしく、上記コマンドは'/'ディレクトリで実行しないと失敗してしまいました。

ログインしてみる
ssh localhost

できましたか?

うまくいった場合、psを実行すると以下のような出力になるはずです。

ps xa
  PID TTY      STAT   TIME COMMAND
    1 pts/9    S+     0:00 /usr/local/bin/lxc-init --mount-procfs -- /usr/sbin/s
    3 ?        Ss     0:00 /usr/sbin/sshd
    4 ?        Ss     0:00 sshd: kvm [priv]
    6 ?        R      0:00 sshd: kvm@pts/11
    7 pts/11   Ss     0:00 -zsh
   80 pts/11   R+     0:00 ps xa

ホスト(root context)と異なる名前空間に移行しているため、他のプロセスは見えません。hostnameコマンドの結果も'test'になるはずです。

なおsshdのログ出力は/dev/log経由で行なわれるため、/dev/logの相手(syslog)がいるホストのログファイルにログが出力されます。

おわりに

簡単ですがFedora 10でLXCを使う方法をご紹介しました。sshdサーバをcontainer内部で実行し、container内部にsshログインすることができました。

とはいえ、この方法は実運用には使えません。本来ならばcontainer用にファイルを用意する必要がありますし、syslogなど必要なデーモンも動かさないといけません。またネットワークの分離、root権限問題などにも対処しなければいけません。

このようにLXCには解決しないといけない課題、実装しないといけない機能、ツールがいくつかありますが、libvirtも対応を始めており、いずれ解消されると思います。LXCは、KVM同様Linuxの大きな流れに逆らわない将来性のあるシステムだと思います。利用者が増えて盛り上がっていけば良いなと期待しています。

*1:netnsを使いたい場合は、コンフィギュレーションを有効にしてカーネルコンパイルする必要があります。