Raspbian WheezyにLXCを導入してみた。
Raspberry Piにアタシが愛して止まないお手軽仮想化技術であるところのLXCを導入します。
ワンボード系(非Intel)なLinux箱に於けるLXCのメリットは以下。
- (然るべきコンフィグの)Linuxが動けばどんなCPUでも動いちゃう。
- CPUエミュレーション不要なので、ppcの266MHzとかでもそれなりの速度で動いちゃう。
- 仮想マシンメインで運用すればホストの環境が汚れないので、面倒な再インストールの機会が劇的に減っちゃう。
このLXC、普通のDebianならサクッと動くんですがRaspbianって結構色々特殊なので、そこそこ作業が必要です。
例えば、LXCの動作には以下のカーネルオプションが必要ですが、Raspbianのカーネルは下2つが無効です。
- CONFIG_NAMESPACES
- CONFIG_CGROUPS
- CONFIG_DEVPTS_MULTIPLE_INSTANCES
- CONFIG_VETH
カーネルの再構築法がいまいちよく分かんなかったので、サードパーティのてんこ盛りカーネルを導入します。
ベースとして、Raspbian Wheezy(12/10/28版 armhf)をインストールしといて下さい。
ファームウェアのアップデート
何がアップデートされるのかよく分からんですが、カーネル導入のために必要とのこと。
# wget https://raw.github.com/Hexxeh/rpi-update/master/rpi-update -O /usr/local/bin/rpi-update # chmod 755 /usr/local/bin/rpi-update # apt-get install git-core # /usr/local/bin/rpi-update
カーネルパッケージの展開
armhfなRaspbianですが、armel版カーネルを無理くりインストールします。
# wget http://apt.bootc.net/debian/pool/main/l/linux-source-3.2.23-rpi1+/linux-image-3.2.23-rpi1+_1_armel.deb # dpkg -i --force-architecture linux-image-3.2.23-rpi1+_1_armel.deb # cd /boot/ # cp -p kernel.img kernel.img.orig # cp -p vmlinuz-3.2.23-rpi1+ kernel.img
リブートして起動すればOK
cgroupのマウント
どこでもいいんでcgroupをマウントします。
# mkdir /cgroup # mount -t cgroup cgroup /cgroup
リブートしても動くように、fstabにも登録して置いて下さい。
cgroup /cgroup cgroup defaults 0 0
必要なパッケージのインストール
質問には全てデフォルトで。
# apt-get install lxc bridge-utils
LXCコンテナの作成
どうもRaspbianが好きになれないので、ここではDebian Squeezeのarmel版を導入します。
(Raspbianの導入は気が向いたら書きます。)
# _ARCHITECTURE=armel lxc-create -n nana-chan -t debian
選択肢は以下でクリアしましょう。
- Preseed file anyone? →デフォルト
- Distribution →Debian GNU/Linux 6.0 "squeeze"
- Archives →デフォルト
- Mirror →デフォルト
- Archive Areas →デフォルト
- Packages →デフォルト
- Root password →お好きに
結構な時間がかかります。
最後のほうでchpasswdとかdebconfのエラーが出ますが、問題無さそうです。
ブリッジの設定
コンテナの仮想NICを受け止めるブリッジを作っときます。
# brctl addbr br0
これもリブートで消えるので、rc.localとかinterfacesとかに組み込むのがいいと思います。
参考:/etc/interfacesでブリッジをセットアップする - もぐてっく
inittabの修正
consoleでgettyを動かしてlxc-startした時にログインプロンプトが出るようにする。
tty1〜6は存在しないのでgettyの起動をやめる。
# vi /var/lib/lxc/nana-chan/config
# so if you want to add more getty's go ahead but skip tty7 if you run X. # #1:2345:respawn:/sbin/getty 38400 tty1 ←コメントアウト #2:23:respawn:/sbin/getty 38400 tty2 ←コメントアウト #3:23:respawn:/sbin/getty 38400 tty3 ←コメントアウト #4:23:respawn:/sbin/getty 38400 tty4 ←コメントアウト #5:23:respawn:/sbin/getty 38400 tty5 ←コメントアウト #6:23:respawn:/sbin/getty 38400 tty6 ←コメントアウト 1:2345:respawn:/sbin/getty 38400 console # ←追加 # Example how to put a getty on a serial line (for a terminal)
LXCコンテナの設定変更
LXCコンテナの設定を変更して、仮想NICを追加します。
(これは通常のDebianも同じ)
# vi /var/lib/lxc/nana-chan/config
# /var/lib/lxc/nana-chan/config lxc.network.type=veth # ←追加 lxc.network.link=br0 # ←追加 lxc.network.flags=up # ←追加 ## Container
LXCコンテナの起動
いよいよ起動してみます。
# lxc-start -n nana-chan
起動中にちょろちょろエラーが出ますが、コンテナにアクセスを許可していないデバイスに触りに行っているだけなので無視して構いません。
気になるなら起動スクリプトをhogeればいいと思うよ。