もぐてっく

人は1つ歳をとるたび、1ビットづつ大きくなれると信じてた。

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ればいいと思うよ。