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もホストと同等の権限を持ちます。
手順
基本的に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 |
ホストのファイルを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を使いたい場合は、コンフィギュレーションを有効にしてカーネルをコンパイルする必要があります。