[さくらVPS]centos6の環境にlxcを構築する


nullpopopo今日は6月9日、ロックの日です。人生デッドロックな (っ´∀`)っ ゃー ですこんにちは。大抵のVPSは1台のサーバが野ざらしとなっているので、おのずとWEBサーバもDBサーバもインターネットに晒されます。例えばDBサーバをNATの内側に押し込めたい、という場合にどうするかを考えたのですが、クラウドにするのもお金かかってしまうし・・・そこでlxcを使ったコンテナ化です!

今回は、さくらVPS 2GのCentOS 6.4 64bitなサーバにlxcをインストールし、ゲストOSもCentOSをインストールしてみました。

 

※ 2013/06/14 訂正

項番6で、 /cgroup ディレクトリ作成の手順記載が漏れていましたので追記いたしました。申し訳ございません。

■ 下準備

1) lxcに必要なパッケージ debootstrap をインストールする

sudo yum --enablerepo=epel install debootstrap

※ 事前にsudoが使えるようにするかrootで実行する
※ さくらVPSはデフォルトでepelリポジトリがインストールされている
※ あらかじめepel.repoを無効化しておいたのでenablerepoしている

2) rpmforgeリポジトリをインストールする

wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
sudo rpm -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

3) lxcをインストールする

sudo yum --enablerepo=rpmforge install lxc lxc-templates lxc-doc lxc-libs

4) ブリッジを作成する

sudo vi /etc/sysconfig/network-scripts/ifcfg-lxcbr0
DEVICE=lxcbr0
TYPE=Bridge
BOOTPROTO=none
IPADDR=10.0.3.1
NETMASK=255.255.255.0
ONBOOT=yes

5) ブリッジを起動する

sudo ifup lxcbr0

6) /cgroup ディレクトリを作成し、fstabに以下の1行を追加する

sudo mkdir -p /cgroup
sudo vi /etc/fstab
none                    /cgroup                 cgroup  defaults        0 0

7) /cgroup をマウントする

sudo mount -a

8) dnsmasq をインストールする

sudo yum install dnsmasq

9) /etc/dnsmasq.conf に以下追記する。大抵はサンプルがコメントアウトされているので、その付近に追記するのがよい。

sudo vi /etc/dnsmasq.conf
domain-needed
bogus-priv
interface=lxcbr0
listen-address=127.0.0.1
listen-address=10.0.3.1
expand-hosts
domain=lxc
dhcp-range=10.0.3.50,10.0.3.200,1h

10) dnsmasq デーモンを起動する

sudo /etc/init.d/dnsmasq start
sudo chkconfig dnsmasq on

11) カーネルパラメータにパケット転送の許可を行わせる

sudo sysctl -w net.ipv4.ip_forward=1

12) /etc/sysctl.conf でパケット転送許可の設定変更を行う(通常は不許可なので許可する)

sudo vi /etc/sysctl.conf
net.ipv4.ip_forward = 0
↓
net.ipv4.ip_forward = 1

13) iptablesでNATルールを追加する。

sudo iptables -A POSTROUTING -s 10.0.3.0/24 -t nat -j MASQUERADE
sudo service iptables save

 

■ テンプレート作成

14) テンプレート作成作業用ディレクトリ /t を作成する

sudo mkdir /t

15) centos-release パッケージをダウンロードする

cd /t
sudo wget http://mirrors.kernel.org/centos/6/os/x86_64/Packages/centos-release-6-4.el6.centos.10.x86_64.rpm

16) centos-release パッケージの中身を取り出す

sudo rpm2cpio centos-release-6-4.el6.centos.10.x86_64.rpm | sudo cpio -idm

17) リポジトリファイルに記載されている変数「$releasever」を「6」に置換する

cd etc/yum.repos.d/
sudo vi CentOS-Base.repo
sudo vi CentOS-Debuginfo.repo
sudo vi CentOS-Media.repo
sudo vi CentOS-Debuginfo.repo
sudo vi CentOS-Vault.repo

18) baseグループパッケージをインストールする

cd ../../
sudo yum --installroot=/t groupinstall base

19) DHCPクライアントをインストールする

sudo yum --installroot=/t install dhclient

 

■ chroot 環境内作業

20) デバイスファイルを作成する

sudo chroot /t
rm -f /dev/null
mknod -m 666 /dev/null c 1 3
mknod -m 666 /dev/zero c 1 5
mknod -m 666 /dev/urandom c 1 9
ln -s /dev/urandom /dev/random
mknod -m 600 /dev/console c 5 1
mknod -m 660 /dev/tty1 c 4 1
chown root:tty /dev/tty1
mkdir -p /dev/shm
chmod 1777 /dev/shm
mkdir -p /dev/pts
chmod 755 /dev/pts

21) rootユーザのホームディレクトリにskelをコピーする

cp -a /etc/skel/. /root/.

22) resolv.conf を作成する

cat > /etc/resolv.conf << END
nameserver 8.8.8.8
nameserver 8.8.4.4
END

23) hostsファイルを作成する

cat > /etc/hosts << END
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
END

24) ネットワーク設定ファイルを作成する

cat > /etc/sysconfig/network << END
NETWORKING=yes
HOSTNAME=localhost
END

25) eth0のインターフェイスファイルを作成する

cat > /etc/sysconfig/network-scripts/ifcfg-eth0  << END
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
END

26) fstabファイルを作成する

cat > /etc/fstab << END
/dev/root               /                       rootfs   defaults        0 0
none                    /dev/shm                tmpfs    nosuid,nodev    0 0
END

27) lxc-sysinit.confファイルを作成する

cat > /etc/init/lxc-sysinit.conf << END
start on startup
env container
pre-start script
        if [ "x$container" != "xlxc" -a "x$container" != "xlibvirt" ]; then
                stop;
        fi
        telinit 3
        initctl start tty TTY=console
        exit 0;
end script
END

28) rootユーザのパスワードを作成する

passwd

※ ここでrootユーザのパスワード作成を忘れるとログインできない

 

29) chroot環境からログアウトする

exit

 

■ テンプレート作成

30) テンプレートをtarで固める

cd /t
sudo tar cvfz /centos6-lxc-root.tgz .

 

■ 最初のvm「vm0」を作成する

31) ディレクトリ作成

sudo mkdir /var/lib/lxc/vm0

32) rootファイルシステムとなるディレクトリを作成する

cd /var/lib/lxc/vm0
sudo mkdir rootfs

33) テンプレートのアーカイブを展開する

cd rootfs
sudo tar xfz /centos6-lxc-root.tgz --numeric-owner

34) vm0のconfigファイルを作成する

cd /var/lib/lxc/vm0
sudo touch /var/lib/lxc/vm0/config
sudo chmod 666 /var/lib/lxc/vm0/config
cat >/var/lib/lxc/vm0/config << END
lxc.network.type=veth
lxc.network.link=lxcbr0
lxc.network.flags=up
lxc.network.veth.pair=veth-vm0
lxc.utsname = vm0

lxc.tty = 1
lxc.pts = 1024
lxc.rootfs = /var/lib/lxc/vm0/rootfs
lxc.mount  = /var/lib/lxc/vm0/fstab
lxc.arch = x86_64
lxc.cap.drop = sys_module mac_admin

lxc.cgroup.devices.deny = a
lxc.cgroup.devices.allow = c *:* m
lxc.cgroup.devices.allow = b *:* m
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
lxc.cgroup.devices.allow = c 254:0 rwm
lxc.cgroup.devices.allow = c 10:229 rwm
lxc.cgroup.devices.allow = c 10:200 rwm
lxc.cgroup.devices.allow = c 1:7 rwm
lxc.cgroup.devices.allow = c 10:228 rwm
lxc.cgroup.devices.allow = c 10:232 rwm
END
sudo chmod 644 /var/lib/lxc/vm0/config

35) fstab を作成する

sudo touch fstab
sudo chmod 666 fstab
cat > fstab  << END
proc            /var/lib/lxc/vm0/rootfs/proc         proc    nodev,noexec,nosuid 0 0
sysfs           /var/lib/lxc/vm0/rootfs/sys          sysfs defaults  0 0
END

sudo chmod 644 fstab

 

■ vm0 動作確認

36) vm0 を起動する

sudo lxc-start -n vm0 -l debug -o debug.out -d

37) vm0 のコンソールにログインする

sudo lxc-console -n vm0

※ ログアウトするときは「Ctrl+A」を入力後「q」キーを入力しエンターを押す。
38) opensshサーバがインストールされていないのでインストールする

yum install openssh-server
/etc/init.d/sshd start

39) ipアドレスを確認し、ログアウトする

ifconfig
exit

40) ホストOSからvm0へssh接続する

ssh root@<項番39のifconfigコマンドで確認したeth0のIPアドレス>

41) vm0 からログアウトする

exit

42) vm0 を停止する

sudo lxc-stop --name vm0

※ 注意点
ゲストOSを起動する際、デバッグモードにしないとうまくコンソールログインできないようだ。ただし、デバッグファイルの出力先は /dev/null でも良い。

sudo lxc-start -n vm0 -l debug -o /dev/null -d

以上でコンテナ環境作成は終了です。

 

※ 備考

テンプレートとなるマシンは、あえてDHCPで作成している。ゲストOSを固定IPアドレスにしたい場合は、ゲストOS起動後に各々設定することにした。

※ 参考サイト
さくらのVPSにLXCで仮想環境構築してXtraDB Cluster動かす - apatheia.info