Debian WheezyにLXCコンテナを設定する。

しばらく前にLXCのパッケージだけはインストールしていたものの、実際のコンテナ作成まで到達してなかった。
ぼちぼちお試ししてみようかなと、LXCコンテナの設定をしてみました。

apt-get install lxc

ちなみに環境はこんな感じです。

root@localhost:~# cat /proc/version
Linux version 3.2.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.6.3 (Debian 4.6.3-14) ) #1 SMP Debian 3.2.54-2
root@localhost:/proc# apt-cache show lxc
Package: lxc
Version: 0.8.0~rc1-8+deb7u2
Architecture: amd64
Depends: debconf (>= 0.5) | debconf-2.0, libc6 (>= 2.8), libcap2 (>= 2.10)

以降の手順はほぼこちらからの丸パクリです。
最後に違いが合った点をまとめてます。

概要
cookbook のテストとかでお手軽に試せる環境が欲しい
現在の環境では Virtual Box はちょっと重いので LXC でやってみる
余裕があれば Docker までやってみたい
ただし、結果として VirtualBox よりも手間は掛かってしまった..orz

Debian Wheezy で LXC 環境を作る - ようへいの日々精進XP

まずはLinuxコンテナが使うファイルシステムの設定。

root@localhost:~# vi /etc/fstab
以下の行を追加する。
cgroup        /sys/fs/cgroup        cgroup        defaults    0    0
mount /sys/fs/cgroup

/etc/network/interface を以下の通り変更

auto lxcbr0
iface lxcbr0 inet static
  address 192.168.1.1
  netmask 255.255.255.0
  post-up /usr/sbin/lxcbr0-up

/usr/bin/lxcbr0-up を以下の通り作成

#!/bin/sh
braddr=192.168.1.1
brrange=192.168.1.2,192.168.1.254
#
iptables -A FORWARD -i lxcbr0 -s ${braddr}/24 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A POSTROUTING -t nat -j MASQUERADE
#
dnsmasq --bind-interfaces --conf-file= --listen-address $braddr --except-interface lo --dhcp-range $brrange --dhcp-lease-max=253 --dhcp-no-override

作成したスクリプトの権限変更

sudo chmod 755 /usr/bin/lxcbr0-up

ここではたと気づく。このdnsmasqってコマンド、入ってるのか??
whichしてみると入ってないので、改めてapt-get installする。

root@localhost:~# apt-cache show dnsmasq
Package: dnsmasq
Version: 2.62-3+deb7u1
Depends: netbase, adduser, dnsmasq-base (>= 2.62-3+deb7u1)
Suggests: resolvconf
Conflicts: resolvconf (<< 1.15)

root@localhost:~# apt-get install dnsmasq
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  dnsmasq-base libnetfilter-conntrack3
提案パッケージ:
  resolvconf
以下のパッケージが新たにインストールされます:
  dnsmasq dnsmasq-base libnetfilter-conntrack3
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 6 個。
425 kB のアーカイブを取得する必要があります。
この操作後に追加で 1,054 kB のディスク容量が消費されます。
続行しますか [Y/n]? y
(中略)
[ ok ] Starting DNS forwarder and DHCP server: dnsmasq.

IPフォワーディングが出来るように設定する

sudo su -
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

lxc-create するときのネットワークテンプレート、/etc/lxc/interface.conf を作成する。

lxc.network.flags = up
lxc.network.type = veth
lxc.network.link = lxcbr0

ようやく、コンテの作成コマンドを発行。

root@localhost:~# lxc-create -t debian -n DevHub -f /etc/lxc/interface.conf
debootstrap は /usr/sbin/debootstrap です
Checking cache download in /var/cache/lxc/debian/rootfs-wheezy-amd64 ...
Copying rootfs to /var/lib/lxc/DevHub/rootfs...Generating locales (this might take a while)...
  ja_JP.UTF-8... done
Generation complete.
update-rc.d: using dependency based boot sequencing
update-rc.d: using dependency based boot sequencing
update-rc.d: using dependency based boot sequencing
update-rc.d: using dependency based boot sequencing

Current default time zone: 'Asia/Tokyo'
Local time is now:      Fri Feb 21 14:01:51 JST 2014.
Universal Time is now:  Fri Feb 21 05:01:51 UTC 2014.

Root password is 'root', please change !
'debian' template installed
'DevHub' created

以下のコマンドでLXCコンテナスタート。

root@localhost:~# lxc-start -n DevHub -d

無事起動したご様子。
起動しているかどうかはlxc-infoコマンドで確認できます。

root@localhost:~# lxc-info -n DevHub
state:   RUNNING
pid:     24719

とりあえず、ログインできるかどうかチェック。

lxc-console -n DevHub

Debian GNU/Linux 7 DevHub tty1

DevHub login: root
パスワード:
Linux DevHub 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@DevHub:~#

とりあえず使えるみたいですね。
ただ、いったんlxcbr0(仮想NWへのブリッジ)のIFを落として再起動しても、起動すると何やら怪しげなメッセージが。

root@localhost:~# ifconfig lxcbr0 down
root@localhost:~# ifconfig lxcbr0 up
root@localhost:~# sudo service networking restart
[warn] Running /etc/init.d/networking restart is deprecated because it may not re-enable some interfaces ... (warning).
[....] Reconfiguring network interfaces...RTNETLINK answers: File exists
Failed to bring up lxcbr0.
done.

エラーは来るものの、ホストOS側からコンテナ側にPingを打ってもちゃんと以下の通りかえってきます。

root@localhost:~# ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_req=1 ttl=64 time=0.101 ms
64 bytes from 192.168.1.2: icmp_req=2 ttl=64 time=0.034 ms
64 bytes from 192.168.1.2: icmp_req=3 ttl=64 time=0.033 ms
64 bytes from 192.168.1.2: icmp_req=4 ttl=64 time=0.035 ms


他にいくつか引用元のサイトと違いがあったのは、

  1. lxc-createコマンド発行時に、ウィザード形式での画面が出ない
  2. 普通にコンテナを作成しただけでは正常に起動しないとあったが、ふつうに起動した。そのため、/var/lib/lxc/コンテナ名/configへのlxc.devttydirの追加や、/var/lib/lxc/コンテナ名/rootfs/etc/securetty の修正は行っていない。
  3. /var/lib/lxc/コンテナ名/rootfs/etc/network/interfaceは最初から設定されていたため、この手順も不要だった

まあ、引用元が書かれてから半年くらい経ってますからね。
LXC側やDebian側に何らかの変更が加わったのかもしれず。