一つのカーネルで複数のLinuxを動かすOpenVZを試してみる。
Xenより構造的に軽量で、VPSサーバとしてよく使われているらしい。
VMware Fusionに入れたCentOS4にOpenVZを構築してみた


参考になるURL




OpenVZ
第3回 処理性能の高さが際立つOpenVZ
OpenVZの実行ガイド
OpenVZの小技
OpenVZのネットワーク(3) veth + vlan + bridge – z手帖


インストール


リポジトリの追加


su -
cd /etc/yum.repos.d
wget http://download.openvz.org/openvz.repo
vi openvz.repo

デフォルトではopenvz-kernel-rhel5がenabled=1になっているが、
今回はcentos4を使いたいので、こちらをenabled=0にして
openvz-kernel-rhel4をenabled=1にする。


カーネルのインストール


yum install ovzkernel

IPフォワードなどの設定


cp /etc/sysctl.conf /etc/sysctl.conf.orig

※ 次のようなものはcatから最後のEOSまでコピペすると楽


cat > /etc/sysctl.conf << 'EOS'
kernel.sysrq = 1
kernel.core_uses_pid = 1
net.ipv4.ip_forward = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.eth0.forwarding = 1
net.ipv4.conf.eth0.proxy_arp = 1
EOS

リブート


vi /etc/grub.conf

default=1をdefault=0に書き換えして再起動
※2.6.9-023stab044.11を起動


補助ソフトのインストールとOpenVZの起動


yum install vzctl vzquota
/etc/init.d/vz start

ゲストのインストールの準備


yum search vztmpl
yum install vztmpl-centos-4.i386

必要に応じてcentosのリポジトリを変更する


vi /vz/template/centos/4/i386/config/yum.conf

ゲスト構築用のダウンロード(キャッシュ)


vzpkgcache

パッケージリスト


vzpkgls

vzlist -a 101

VE not foundならVE 101のインストールが可能になる。


ネットワークの準備


bridge-utilsのインストール


yum install -y bridge-utils

DHCPなeth0をbr0にする


この方法はすでにeth0をDHCPで利用していて、br0もDHCPで設定したい場合に有効だが、固定IPのほうがラクなのでそちらをおすすめする。こけると非常にまずいので遠方リモートではオススメしない。


cat < /etc/sysconfig/network-scripts/ifcfg-eth0 >> EOS
DEVICE=eth0
BOOTPROTO=static
IPADDR=0.0.0.0
ONBOOT=no
TYPE=Ethernet
EOS
cat < /etc/sysconfig/network-scripts/ifcfg-br0 >> EOS
DEVICE=br0
BOOTPROTO=dhcp
ONBOOT=no
TYPE=Bridge
EOS

network-scriptではどうもうまくいかないので、/etc/init.d/にあるファイルを参考にしてinitスクリプトを書くことにした。


080223_bridge.txtをダウンロードして、
/etc/init.dにbridgeという名前にリネームしておく。
内容を自分の環境に合わせて書き換えて、

chmod 755 /etc/init.d/bridge
/etc/init.d/bridge start

運がよければbr0がdhcpで取得できる。


VEの作成


vzctl create 101 --ostemplate centos-4-i386-minimal
vzctl set 101 --hostname testserver.localdom --save
vzctl set 101 --userpasswd root:password
vzctl set 101 --diskspace 4G:8G --save
vzctl set 101 --onboot yes --save
vzctl set 101 --netif_add eth0,00:00:00:FE:00:01,veth1010,00:00:00:FF:00:01 --save
vzctl start 101
brctl addif br0 veth1010

cat > /vz/private/101/etc/sysconfig/network-scripts/ifcfg-eth0 << 'EOS'
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
EOS

kernel.sysrq = 0, kernel.core_uses_pid = 1 がエラーになるのでコメントアウト


mv /vz/private/101/etc/sysctl.conf /vz/private/101/etc/sysctl.conf.bak
sed -e 's/^kernel\./#kernel\./g' /vz/private/101/etc/sysctl.conf.bak > /vz/private/101/etc/sysctl.conf

dhclientのインストールとネットワークの起動


vzyum 101 install -y dhclient
vzctl exec 101 service network start

VEに入る


vzctl enter 101
ping www.yahoo.co.jp

通信できたらこれでおk
exit

VEにDevelopment Toolsのインストール


vzyum groupinstall 'Development Tools'がうまくいかないので、
ちょっとしたプログラムを作ってインストールする


cat > vzyum_devtools << 'EOS'
#!/usr/bin/perl
use strict; use IO::File;
my @groups=('Development Libraries','Development Tools');
my @ar; foreach my $group(@groups) {
my $fh=IO::File->new(qq{yum groupinfo "$group" | });
my $flag=0; foreach(<$fh>) {chomp;if(/^\sDefault Packages:$/) {$flag=1
} elsif(/^\sMandatory Packages:$/) {$flag=1} elsif (/^\s{3}(.+?)$/) {
push @ar,$1 if ($flag)} else {$flag=0}}}
my $cmd="vzyum ".join(" ",@ARGV)." ".join(" ",@ar);
print "$cmd\n"; system $cmd;
EOS

chmod 700 vzyum_devtools
./vzyum_devtools 101 -y install