今日は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
[amazonjs asin="4844395777" locale="JP" title="企業システムのためのパブリッククラウド入門 主要ベンダ11社を徹底紹介 (Cloudシリーズ(Next Publishing))"]