ようへいの日々精進XP

よかろうもん

Debian Wheezy で LXC 環境を作る

概要

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

LXC については

  • 以前にも Ubuntu でやったりした
  • LXC (Linux Containers) とは、一つのコントロールホスト上で、複数の隔離された Linuxシステム(コンテナ)を走らせる、OSレベル仮想化のソフトウェア...だそうです

準備

パッケージ達

こちらを参考にしてパッケージ達をインストール。

aptitude install lxc
aptitude install bridge-utils libvirt-bin debootstrap

ファイルシステム

LXC は cgroup というファイルシステムを利用してコンテナを管理する為、/etc/fstab に以下のように設定する。

cgroup        /sys/fs/cgroup        cgroup        defaults    0    0

そしてマウントする。

mount /sys/fs/cgroup

ファイルシステムの準備はちゃんとパッケージがインストールされていれば...とても簡単。

ネットワーク周りの準備

激ハマリ

当初はブリッジインターフェースを作成して、ノートパソコンの wlan0 にバインドしてうんちゃらかんちゃらすれば出来ると軽く見ていたが、以下の点で激ハマリしてしまった...

  • 素の状態では wlan0 にブリッジインターフェースをバインド出来ない
  • iw コマンドで 4-address-mode を設定するとバインド出来るけどホストが通信出来なくなる

結局

ググったらこちらで紹介されていたLXC containers on a host with wirelessを参考にしてとりあえず解決した。

ざっくり言うと、

  • lxcbr0 というインターフェースを作成する(コンテナの default gateway になる)
  • ホストがコンテナに対して NAT してあげる
  • dnsmasq でコンテナ内だけに IP アドレスを配る

で、以下の手順にて設定。

lxcbr0 インターフェースの作成

sudo brctl addbr lxcbr0

/etc/network/interface を以下のように設定する。IP アドレスは任意のアドレスで良いかと思われる。

auto lxcbr0
iface lxcbr0 inet static
  address 192.168.8.1
  netmask 255.255.255.0
  post-up /opt/bin/lxcbr0-up

/opt/bin/lxcbr0-up は以下のように設定する。

設定後、実行権限を設定しておく。

chmod 755 /opt/bin/lxcbr0-up

IP フォワーディングの設定

以下のように IP をフォワーディング出来るように設定する。

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

LXC 用の configuration ファイルを設定する

コンテナを作成する際に上記で設定したインターフェースを利用する為に LXC の設定ファイルを作成する。設定ファイルの場所やファイル名は任意。

sudo vim /opt/etc/lxc/interface.conf

以下のように記載。

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

コンテナを作成してみる

Debian コンテナを作成してみる

以下のようにして squeeze のコンテナを作成してみる。-f オプションにてネットワークインターフェースの設定を渡す。

sudo lxc-create -t debian -n squeeze-test1 -f /opt/etc/lxc/interface.conf

上記を実行すると...

f:id:inokara:20130720064022p:plain

ウィザード形式で Debian コンテナの作成が開始する。無事に作成が終わると以下のようにコンテナを起動する。-d オプションでデーモンとして起動することが出来るが...

sudo lxc-start -n squeeze-test1 -d

Debian コンテナにはさらにちょっとひと手間

Debian のコンテナの場合、普通にコンテナを作成しただけでは正常に起動しないらしく、以下のような作業が必要になる。

/var/lib/lxc/コンテナ名/config の修正

/var/lib/lxc/コンテナ名/config に以下を追記する。

lxc.devttydir                           = lxc

/var/lib/lxc/コンテナ名/rootfs/etc/securetty の修正

/var/lib/lxc/コンテナ名/rootfs/etc/securetty に以下を追記する。

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

/var/lib/lxc/コンテナ名/rootfs/etc/network/interface の修正

/var/lib/lxc/コンテナ名/rootfs/etc/network/interface に以下を追記する。

auto eth0
iface eth0 inet dhcp

ん、/var/lib/lxc/コンテナ名/ 以下がそれぞれのコンテナのファイルシステムなのか...ということは /opt/ 以下あたりに chef とかそのままコピーしておいたり、任意のシェルスクリプトをおいたり出来るのかな...

やっとコンテナを起動

sudo lxc-start -n squeeze-test1 -d

起動したら以下のコマンドにてアクセスする。

sudo lxc-console -n  squeeze-test1

f:id:inokara:20130720064535p:plain

コンテナにアクセス出来た!(ホスト名が違うのは無視!)

お疲れ様でした

  • Ubuntu の時にはサクッと出来たのにも関わらず、ネットワーク周りで激ハマリした...
  • 色々と手間がかかる Debian コンテナを作るスクリプトを直したい

LXC を使うメリット

  • 動いてしまえば手軽(対 VirtualBox ※個人的感想)
  • 任意のスクリプトを起動させたり出来そう

参考