2013年7月25日木曜日

[.tested] LXC 0.8.0-rc1 [Debian Wheezy][AX3][A6]



LXCはOSレベル仮想化ソフトウェアであり、VTを持たないOpenBlocks Aシリーズにおいても導入が可能です。 仮想化環境はクラウド環境を支える技術ですが、OpenBlocksのようなマイクロサーバ環境においても、コンテナ上で開発環境を構築することにより、開発環境の初期化や複製が簡単に行え、ミドルウェアのバージョンの違いによる環境の再構築などの作業も軽減出来ます。

このパッケージに関しては、、Debian 6.0 (Squeeze) 環境では、以下の記事においてlxc-0.7.5をビルドして評価を行っています。

 OpenBlocks AX3でLXCによる仮想化を試してみる

今回は、Debian 7.1環境ににおいてパッケージ提供される、lxc-0.8.0-rc1の導入について、その手順を報告します。

( 7/23 追記 )
Debian 7.1正式版が公開されましたので、再度検証しました。
Debian 7.1環境でlxcパッケージを試される方は、 上記リンクより、リリース版のファームウェアをご利用下さい。

OBDN技術ブログによる動作検証は、該当するソフトウェアの動作を保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
Debian 7.1 Wheezy
OpenBlocks AX3/4 kernel: 3.2.40
OpenBlocks A6 kernel: 3.2.40

<使用機器>
OpenBlocks AX3 DPパッケージ (もしくは、SSD搭載モデル)
OpenBlocks A6 DPパッケージ (もしくは、SSD搭載モデル)

1. カーネルの再構築


AX3の場合はカーネルの再構築は必要ありません。
A6の場合は、devptsが組み込まれていないため、再構築の必要があります。

A6のカーネル再構築のためには、開発環境が必要になります。
ユーザマニュアルに書かれた、タイムゾーン等の最初の設定、標準ツールのインストールに加え、基本的な開発環境をインストールしてください。

# aptitude install build-essential

また、ファームウェア構築のためには、mkimageが必要となります。

# aptitude install uboot-mkimage

当社ftpサイトより、カーネルソースファイルと、A6に対応したramdiskイメージを入手し、展開してください。

# cd /usr/src
# wget ftp://ftp.plathome.co.jp//pub/OBSA6/wheezy/3.2.40-0/linux-3.2.40-20130710-2.tar.gz

# tar xvzf  linux-3.2.40-20130710-2.tar.gz

A6のramdiskイメージ
# wget  ftp://ftp.plathome.co.jp//pub/OBSA6/wheezy/3.2.40-0/ramdisk-wheezy.obsa6.img.lzma

/usr/src/linux-3.2.40/arch/arm/configs/obsa6_defconfig
を編集します。

# diff -u obsa6_defconfig.org obsa6_defconfig
--- obsa6_defconfig.org 2013-07-23 13:55:33.000000000 +0900
+++ obsa6_defconfig     2013-07-23 13:56:47.000000000 +0900
@@ -1764,7 +1764,7 @@
 CONFIG_HW_CONSOLE=y
 # CONFIG_VT_HW_CONSOLE_BINDING is not set
 CONFIG_UNIX98_PTYS=y
-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=16
 # CONFIG_SERIAL_NONSTANDARD is not set

上記のconfig情報を元に、カーネルの再構築を行います。

# cd /usr/src/linux-3.2.40
# make obsa6_defconfig arch=ARM oldconfig
# make zImage modules
# make modules_install

上記作業が終了したら、ファームウェアイメージを作成します。

# cd /usr/src
# gzip -9 < linux-3.2.40/arch/arm/boot/zImage > zImage.gz
# mkimage -n "OBSA6LXC 3.2.40" -A arm -O linux -T multi -C gzip -a 0x8000 -e 0x8000 -d zImage.gz:ramdisk-wheezy.obsa6.img.lzma uImage.initrd.obsa6

ファームウェアをFlashROMへ書き込みます。

# flashcfg -y -f uImage.initrd.obsa6

上記の作業に関しては、作業内容をご理解の上、自己責任の元に慎重に行ってください。
なお、現行ファームウェアと同様、正式なリリース時には上記変更を行ったカーネルへのアップデートが行われる場合もあります。

2. lxc-0.8.0-rc1およびオプションパッケージのインストール


debian 7.0 Wheezyにて提供される、lxcのバージョンは、0.8.0-rc1であり、今回はこのパッケージを導入します。
また、ネットワーク設定において、bridge-utilsが必要になります。

# aptitude install lxc bridge-utils

3. cgroupのマウント設定


/etc/fstabへ以下の行を追加します。

cgroup  /sys/fs/cgroup  cgroup  defaults  0   0

rebootするか、mount -aにてマウントを行ってください。

4. カーネルの構成チェック


カーネルがlxcを実行するために問題ない構成になっているかを、チェックします。
先にカーネルの構成情報をアップデートします。

# modprobe configs

# lxc-checkconfig
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup namespace: CONFIG_CGROUP_NSmissing
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

Cgroup namespaceはCONFIG_CGROUP_NSのようですが、Linux Kernel 3.0以降では削除されているようなので無視します。

5. ネットワーク設定


/etc/network/interfaces より、eth0の記述を削除し、以下の記述を追加します。
固定アドレスにする場合は、dhcpではなく、staticに書き換え、必要な設定を追加してください。

auto br0
iface br0 inet dhcp
bridge_ports eth0

6. コンテナの作成


以下のコマンドでコンテナを対話的に作成することが出来ます。

# lxc-create -n test -t debian

ただし、そのままではうまく動作しません。
/var/lib/lxc/<コンテナ名>/configに以下の行を追加し、

lxc.devttydir                           = lxc

/var/lib/lxc/<コンテナ名>/rootfs/etc/securettyの以下の記述を変更してくささい。

lxc/console
lxc/tty1
lxc/tty2
lxc/tty3

また、別の方法としては、ここを参考にして、コンテナを作成する方法もあります。
この場合は、修正は特に必要ありません。

Usage: lxc-debian.sh <distribution> <container-name> <container-number>

# wget https://gist.github.com/raw/3008518/e3b87deb423ace3c67628fe501af79d46d9de04c/lxc-debian.sh
# chmod +x lxc-debian.sh
# ./lxc-debian.sh wheezy test 2

後述しますが、どちらの方法で作成したコンテナにおいても、inittabにおいて、consoleにgettyを割り付けることにより、起動+オペレーションが可能になります。


7. ゲストOSの起動、コンソール操作、停止、コピー


・ゲストOSの起動

# lxc-start -d -n test

起動のテストをする場合は、-dオプションを外して起動すると、エラー等の確認が出来ます。
そのままコンソールを出してオペレーションしたい場合は、 コンテナ内の/etc/inittabに、以下の行を追加してください。
立ち上げ前に作業する場合は、/var/liv/lxc/<コンテナ名>/rootfs/etc/inittabを編集します。

c0:2345:respawn:/sbin/getty 38400 console

上記の設定を行なわない場合は、別のコンソールからはlxc-consoleコマンドでログインします。

・コンソールへの接続

# lxc-console -n test

Ctrl+a q でコンソール操作を停止します。

・ゲストOSの停止

# lxc-stop -n test

・ゲストOSのコピー
 環境によっては、rsyncをインストールする必要があります。

# lxc-clone -o test -n test2

このコマンドは、環境をコピーしますが、新たに作成されたconfigが元の環境の設定そのままであるため、新たにコピーされたrootfsが指定されていません。
そのため、config内のコンテナ名を全て新しいコンテナ名に書き換える必要があります。

8.さいごに


今回、Debian 7.1(wheezy)環境でのインストール、起動の確認を行いました。
今後、上記環境を利用した、ソフトウェア検証等を行っていく予定です。

0 件のコメント:

コメントを投稿