Plamo Linux 4.73 で lxc 0.7.2 (前編)
以前,lxc-0.6.2 で行なったときは何事もなくうまくいったのですが,今回 lxc がバージョンアップして,イマイチうまくいかない部分があったので,とりあえず方法をメモ.
カーネル再構築
Plamo 標準カーネルは cgroup など,lxc の動作に必要なオプションが有効になっていません.以前の設定 (lxc (2))そのままでいけると思います.
ブリッジ設定
こんな感じ]でブリッジを設定します.普通に作っているだけで lxc 特有のものはありません.
lxc の make
lxc-0.7.2.tar.gz を取得して展開します.たぶん,そのまま (docbook2man が存在する状態) では man の make に失敗するので,無効化しておきます.
$ ./configure --disable-doc $ make # make install
Plamo 用はパッケージは
以下に置いてありますので,取得後 installpkg コマンドでインストールしても構いません.
コンテナの準備
以前の lxc(3)で書いたように OpenVZ 用の debian の precreated テンプレートキャッシュを取得してみます.ここはお好きなように,ですね.
lxc-debian などのコンテナ作成スクリプトは,以前は /usr/bin なんかに置かれていましたが,今回から /usr/lib/lxc/template 以下に置かれています.
デフォルトでは lxc のコマンド群は /var/lib/lxc 以下にコンテナがあるとして見にいきますので,
# mkdir -p /var/lib/lxc
で作成しておきます.
ここで,例えば "debian" というコンテナを作成する場合は,
# mkdir -p /var/lib/lxc/debian/rootfs
という風にディレクトリを作成しておきます.debian 環境なんかで lxc-debian コマンドを使う場合は /var/lib/lxc/debian まで指定すれば,rootfs は自動的に作ってくれますが,今回は Plamo で使うので,事前に作っておきます.
/var/lib/lxc/debian/rootfs 以下に,事前に取得した OpenVZ 用のテンプレートキャッシュを展開します.
# tar zxvf debian-5.0-x86.tar.gz -C /var/lib/lxc/debian/rootfs
展開した状態で lxc-debian スクリプトを使って設定を手抜きしますので,このスクリプトを適当なディレクトリにコピーします.で,debootstrap など Plamo で動かない部分をコメントアウトします.
# cp /usr/lib/lxc/template/lxc-debian . # vi lxc-debian # diff -u /usr/lib/lxc/templates/lxc-debian lxc-debian --- /usr/lib/lxc/templates/lxc-debian 2010-09-14 09:00:00.000000000 +0900 +++ lxc-debian 2010-09-17 15:31:12.000000000 +0900 @@ -273,11 +273,11 @@ exit 0 fi -type debootstrap -if [ $? -ne 0 ]; then - echo "'debootstrap' command is missing" - exit 1 -fi +#type debootstrap +#if [ $? -ne 0 ]; then +# echo "'debootstrap' command is missing" +# exit 1 +#fi if [ -z "$path" ]; then echo "'path' parameter is required" @@ -291,11 +291,11 @@ rootfs=$path/rootfs -install_debian $rootfs -if [ $? -ne 0 ]; then - echo "failed to install debian" - exit 1 -fi +#install_debian $rootfs +#if [ $? -ne 0 ]; then +# echo "failed to install debian" +# exit 1 +#fi configure_debian $rootfs $name if [ $? -ne 0 ]; then
この後 lxc-debian を実行します.以下のように実行すると,/var/lib/lxc/debian/config という設定ファイルが生成されます.ネットワーク関係の設定がなされていませんので,以下の例の最後の部分のように設定を追加します.
# ./lxc-debian -p /var/lib/lxc/debian # cat /var/lib/lxc/debian/config lxc.tty = 4 lxc.pts = 1024 lxc.rootfs = /var/lib/lxc/debian/rootfs lxc.cgroup.devices.deny = a # /dev/null and zero lxc.cgroup.devices.allow = c 1:3 rwm lxc.cgroup.devices.allow = c 1:5 rwm # consoles lxc.cgroup.devices.allow = c 5:1 rwm lxc.cgroup.devices.allow = c 5:0 rwm lxc.cgroup.devices.allow = c 4:0 rwm lxc.cgroup.devices.allow = c 4:1 rwm # /dev/{,u}random lxc.cgroup.devices.allow = c 1:9 rwm lxc.cgroup.devices.allow = c 1:8 rwm lxc.cgroup.devices.allow = c 136:* rwm lxc.cgroup.devices.allow = c 5:2 rwm # rtc lxc.cgroup.devices.allow = c 254:0 rwm # mounts point lxc.mount.entry=proc /var/lib/lxc/debian/rootfs/proc proc nodev,noexec,nosuid 0 0 lxc.mount.entry=devpts /var/lib/lxc/debian/rootfs/dev/pts devpts defaults 0 0 lxc.mount.entry=sysfs /var/lib/lxc/debian/rootfs/sys sysfs defaults 0 0 # これ以下は追加するモノ. lxc.utsname = debian lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0
cgroup のマウント
fstab に cgroup のマウントをするように行を追加します.例えば,
none /cgroup cgroup default 0 0
この例だと /cgroup ディレクトリの作成をお忘れなきよう.
# mkdir /cgroup # mount /cgroup
これで
# lxc-start -n debian
とやれば debian が起動します."-d" オプションを追加すれば,バックグラウンドで起動しますので,sshd が設定されていれば ssh で,そうでなければ,
# lxc-console -n debian Type <Ctrl+a q> to exit the console Debian GNU/Linux 5.0 debian tty1 debian login:
みたいにログインプロンプトが出てきます.
サーバとして X なしで母艦を動かしていて,コンテナを起動させるのなら,これで OK です.評価のために Desktop 環境で lxc を動かすのなら,Plamo の場合,これだと Desktop 環境で新たにターミナル (xterm とか gnome-terminal とか...) が開かなくなります. Debian Squeeze や Ubuntu 10.04 でやったら何の問題もなく動きますが... (なぜこの違いが出てくるかは分かりません,教えてプリーズ)
(続く)
Plamo Linux 4.73 で lxc 0.7.2 (後編)
前編 で書いたように,普通に lxc のコンテナを起動すると,母艦の Desktop 環境上でターミナルが開きません.これは debian や ubuntu の lxc 環境では起きません.コンテナ側の処理依存で,debian じゃない別の環境だと問題はないかも知れないけど,よくわかりません.
ターミナルプログラムが動かないということで,推理としては /dev/ptmx とか /dev/pts/ あたりの権限が,コンテナを動かした影響で奪われた,という想像をしてみました.
そこで出てくるのが lxc を動かすのに必要だったカーネルオプション "CONFIG_DEVPTS_MULTIPLE_INSTANCES" です.通常はターミナルが /dev/ptmx を開いて,/dev/pts 以下のファイルディスクリプタが返されますが (man pts 参照),このオプションをオンにすると,/dev/pts/ptmx というのが作成されます.デフォルトだと権限なしで.
c--------- 1 root root 5, 2 Sep 21 17:03 ptmx
おそらく,作成されるだけで,何も設定をしないと /dev/ptmx が使われるのでしょうけど,このままだと,母艦とコンテナの擬似端末が共有されたままです.コンテナから母艦の /dev/pts/ 以下の端末に出力が出来たりします.
そこで,母艦とコンテナの擬似端末を独立させる設定をしてみよう,それでこそ本当のコンテナだ,って事でやってみました.母艦とコンテナの擬似端末を独立させることで,母艦側への影響がなくなるだろう,という算段です.
devpts ファイルシステムのマウント
Plamo デフォルトでは /etc/fstab で
none /dev/pts devpts gid=5,mode=620 0 0
のようにマウントされています.これにオプションを付けて,
none /dev/pts devpts gid=5,mode=620,newinstance,ptmxmode=0666 0 0
とします.このあたりはカーネル付属の devpts.txt を参照してください.この状態だと owner, group, other いずれも書き込み,読み込み権限が与えられた状態で /dev/pts/ptmx が作成されます.
これだけでは母艦側の ptmx が開けませんので,
# rm -f /dev/ptmx # ln -s /dev/pts/ptmx /dev/ptmx
とリンクを貼ります.
この状態で "lxc-start" コマンドを実行して,コンテナを起動すると,無事母艦でも gnome-terminal がエラーなく実行されました!!
lxc-start 実行前の /dev/pts
Desktop環境上で gnome-terminal を一つ実行しています.
# ls -l total 0 crwx-w---- 1 root tty 136, 0 Sep 21 17:14 0 crw-rw-rw- 1 root root 5, 2 Sep 21 17:14 ptmx
lxc-start 実行後 (母艦)
同じく.おそらくコンテナ用の擬似端末が開かれているのかと.
ls -l 合計 0 crw--w---- 1 karma tty 136, 0 9月 21日 17:16 0 crw------- 1 root root 136, 1 9月 21日 17:17 1 crw------- 1 root root 136, 2 9月 21日 17:17 2 crw------- 1 root root 136, 3 9月 21日 17:17 3 crw------- 1 root root 136, 4 9月 21日 17:17 4 crw------- 1 root root 136, 5 9月 21日 17:17 5 crw-rw-rw- 1 root root 5, 2 9月 21日 17:18 ptmx
コンテナ内の /dev/pts
lxc-console でつないでみた状態です.母艦で見えている擬似端末は見えていません.
debian:/dev/pts# ls -l total 0 crw-rw-rw- 1 root root 5, 2 Sep 21 12:16 ptmx