もぐてっく

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

Raspberry Piでコンテナ仮想化(Raspbian on Raspbian編)

前回はRaspberry PiにLXCをインストールして、コンテナにDebianを導入しましたが、よりRaspberry PiのCPUを活用できるRaspbianをコンテナにしてみます。

ここでは、前回の手順との差分のみを書いていきます。
Raspbian WheezyにLXCを導入してみた。 - moguno's diary

LXCコンテナの作成

# lxc-create -n ranka -t debian

選択肢は以下で乗り切りましょう。
ミラーサーバをRaspbian公式に切り替えるのがミソです。

後は前回同様、configとinittabを編集すればOKです。


Interface (インターフェース) 2012年 12月号 [雑誌]

Interface (インターフェース) 2012年 12月号 [雑誌]

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

Raspbian Wheezyにzramを導入してみた。

これまでのあらすじ


約束の6week待ったけどRaspberry Pi全然こねぇぞゴルァ!
        ↓
ようやく発送通知メールがキターーーーーーー!!!
        ↓
「Raspberry Piにメモリ倍増512MBモデル登場。お値段据え置き。」ですとっ!!!
        ↓
ようこそ、Raspberry Pi 256MBモデルorz....


まぁ、鯖用途に使うなら必要十分なんですが、HDMIを活用してマルチメディアな用途に使うには少々不安。
幸い、CPUは700MHzと余裕があるので、zramを導入することにしました。


zramって言うのはメインメモリの一部をブロックデバイスにできるカーネルモジュールです。
書き込んだ内容をリアルタイムに圧縮・伸長させることで、実容量よりもちょっと多くのデータを保存できるってのが、通常のRAMディスクとの違いです。


この性質を利用してzramをスワップに設定してやれば、メインメモリの見かけ上の容量を増やすことが出来るという寸法です。


てか、一昔前はramzswapという名前で上記の用途に特化したモジュールでした。
(そして登場当時はcompacacheって名前でした。stagingに居るせいか、結構自由に名前とか仕様が変わってますな。)


設定はとっても簡単です。お試しあれ。


/etc/rc.local

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

# enable zram
modprobe zram
echo $((128 * 1024 * 1024)) > /sys/block/zram0/disksize
mkswap /dev/zram0
swapon -p 1 /dev/zram0

exit 0