概要
- 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
上記を実行すると...
ウィザード形式で 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
コンテナにアクセス出来た!(ホスト名が違うのは無視!)
お疲れ様でした
LXC を使うメリット
- 動いてしまえば手軽(対 VirtualBox ※個人的感想)
- 任意のスクリプトを起動させたり出来そう