2009年6月21日日曜日

OpenVZ #2

CentOS 5の上でOpenVZを導入するにあたって、vethを使ってネットワークを構築するときに得たノウハウを公開しておきます。

用語解説
HN:OpenVZが稼働しているホストマシン(ハードウェアノード)
CT:vzctl createで作成した仮想マシン(コンテナ)

HN上に複数のCTを構築する

この作業は、必ずコンソール上から行ってください。SSHなどネットワークを経由しているときには、途中で一時的にネットワークがつながらなくなるため、作業続行不能となります。

#1の記事にそって、もうひとつCTを作成します(IP:10.0.1.102)
そしてHNから各CTに対してpingを打つと、きちんと結果が返ってきます。

[root@hn ~]# ping -c4 10.0.1.101
PING 10.0.1.101 (10.0.1.101) 56(84) bytes of data.
64 bytes from 10.0.1.101: icmp_seq=1 ttl=64 time=0.093 ms
64 bytes from 10.0.1.101: icmp_seq=2 ttl=64 time=0.110 ms
64 bytes from 10.0.1.101: icmp_seq=3 ttl=64 time=0.109 ms
64 bytes from 10.0.1.101: icmp_seq=4 ttl=64 time=0.113 ms

--- 10.0.1.101 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.093/0.106/0.113/0.010 ms
[root@hn ~]# ping -c4 10.0.1.102
PING 10.0.1.102 (10.0.1.102) 56(84) bytes of data.
64 bytes from 10.0.1.102: icmp_seq=1 ttl=64 time=0.122 ms
64 bytes from 10.0.1.102: icmp_seq=2 ttl=64 time=0.116 ms
64 bytes from 10.0.1.102: icmp_seq=3 ttl=64 time=0.110 ms
64 bytes from 10.0.1.102: icmp_seq=4 ttl=64 time=0.115 ms

--- 10.0.1.102 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 0.110/0.115/0.122/0.013 ms

しかし、CTからCTにはpingが通りません。
[root@ct101 /]# ping -c4 10.0.1.102
PING 10.0.1.102 (10.0.1.102) 56(84) bytes of data.
From 10.0.1.101 icmp_seq=2 Destination Host Unreachable
From 10.0.1.101 icmp_seq=3 Destination Host Unreachable
From 10.0.1.101 icmp_seq=4 Destination Host Unreachable

--- 10.0.1.102 ping statistics ---
4 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2999ms
, pipe 3

これは、HNにあるveth101.0とveth102.0がネットワーク的につながっていないのが原因です。
eth0(CT101) --- veth101.0(HN) --|ここが切れている| -- veth102.0(HN) --- eth0(CT102)

HN側に作成された二つの仮想ネットワークインターフェイス(veth101.0, veth102.0)を接続するためには、HN内に仮想のブリッジを作成します。

[root@hn ~]# yum install bridge-utils
[root@hn ~]# brctl addbr vzbr0
[root@hn ~]# brctl addif vzbr0 eth
[root@hn ~]# brctl addif vzbr0 veth101.0
[root@hn ~]# brctl addif vzbr0 veth102.0
[root@hn ~]# ifconfig eth0 down
[root@hn ~]# ifconfig eth0 0.0.0.0 promisc up
[root@hn ~]# ifconfig vzbr0 192.168.0.101 up
[root@hn ~]# route add -net 10.0.1.0 netmask 255.255.255.0 vzbr0
[root@hn ~]# route
ernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.1.0 * 255.255.255.0 U 0 0 0 vzbr0
192.168.0.0 * 255.255.255.0 U 0 0 0 vzbr0
169.254.0.0 * 255.255.0.0 U 0 0 0 vzbr0
default 192.168.0.230 0.0.0.0 UG 0 0 0 vzbr0

これでct101とct102から、それぞれ別の子サーバへのpingが通るようになります。

2009年6月17日水曜日

OpenVZ #1

CentOS 5の上でOpenVZを導入するにあたって、vethを使ってネットワークを構築するときに得たノウハウを公開しておきます。

用語解説
HN:OpenVZが稼働しているホストマシン(ハードウェアノード)
CT:vzctl createで作成した仮想マシン(コンテナ)

まずは、HN上でvzctl createを実行してCTを作成し、vzctl enterでCTにログインできる状態までたどり着いてください。そこまでの道のりについては
http://wiki.openvz.jp/index.php/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
あたりが参考になります。


HN上に一つのCTを構築する

HNのeth0のアドレスは192.168.0.101/24とします。
CTに新規に作成するeth0のアドレスは10.0.0.101/24で作成します。

[root@hn ~]# vzctl create 101 --ostemplate centos-5-x86
Unable to get full ostemplate name for centos-5-x86
Creating container private area (centos-5-x86)
Performing postcreate actions
Container private area was created

[root@hn ~]# vzctl set 101 --hostname ct101 --save
Set hostname: ct101
Saved parameters for CT 101

[root@hn ~]# vzctl set 101 --netif_add eth0 --save
Saved parameters for CT 101

[root@hn ~]# vzctl start 101
Starting container ...
Container is mounted
Setting CPU units: 1000
Configure meminfo: 65536
Set hostname: ct101
Configure veth devices: veth101.0
Container start in progress...

[root@hn ~]# ifconfig veth101.0
veth101.0 Link encap:Ethernet HWaddr **:**:**:D4:49:6C
inet6 addr: ****::****:****:fed4:496c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

[root@hn ~]# echo 1 > /proc/sys/net/ipv4/conf/veth101.0/forwarding
[root@hn ~]# echo 1 > /proc/sys/net/ipv4/conf/veth101.0/proxy_arp
[root@hn ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/forwarding
[root@hn ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
※上記四行のコマンドは、HN上でsysctlコマンドの実行状況によっては不要かもしれない

[root@hn ~]# vzctl enter 101
entered into CT 101

[root@ct101 ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr **:**:**:26:E2:55
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

[root@ct101 ~]# ifconfig eth0 0
[root@ct101 ~]# ifconfig eth0 netmask 255.0.0.0
[root@ct101 ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr **:**:**:26:E2:55
inet addr:10.0.0.101 Bcast:10.255.255.255 Mask:255.0.0.0
inet6 addr: ****::****:****:fe26:e255/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:384 (384.0 b)

ここまでの作業でCTにネットワークインターフェイスを作成することが出来ました。
しかし、CTからHNにpingを打っても返事が返ってきません。

[ve101]# ping 192.168.0.101
connect: Network is unreachable

これは、CTとHNの双方に適切なルーティングの設定をしていないのが原因です。
つまり、CT上には10.0.1.0/24ネットワークに対するルーティングの定義しかないので出ることができず、HN上には192.168.0.0/24ネットワークに対するルーティングの定義しかないので帰ってくることができないのです。だからCTとHNの双方にお互いのネットワークへのルーティングを定義します。

[root@ct101 ~]# ip route add default dev eth0
[root@ct101 ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.0.0 * 255.0.0.0 U 0 0 0 eth0
default * 0.0.0.0 U 0 0 0 eth0

[root@ct101 ~]# exit
[root@hn ~]# ip route add 10.0.0.101 dev veth101.0
[root@hn ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.0.101 * 255.255.255.255 UH 0 0 0 veth101.0
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
default 192.168.0.230 0.0.0.0 UG 0 0 0 eth0

これでpingが通るようになりました。

[root@hn ~]# ping 10.0.0.101 -c 4
PING 10.0.0.101 (10.0.0.101) 56(84) bytes of data.
64 bytes from 10.0.0.101: icmp_seq=1 ttl=64 time=0.095 ms
64 bytes from 10.0.0.101: icmp_seq=2 ttl=64 time=0.112 ms
64 bytes from 10.0.0.101: icmp_seq=3 ttl=64 time=0.112 ms
64 bytes from 10.0.0.101: icmp_seq=4 ttl=64 time=0.116 ms

--- 10.0.0.101 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 0.095/0.108/0.116/0.015 ms

2009年6月6日土曜日

mission imposibble

さくらの専用サーバで、OpenVZを使って仮想化環境を作る話は、結局完成しませんでした。

・第1の失敗
OpenVZでカーネルを差し替えるときに、差し替え用のカーネルがCPUの種類やメモリの使用量などによって何種類かに分かれます。
cat /proc/cpu
で確認したところマルチコアCPUだったので、まずはマルチCPU用のカーネルに差し替えて再起動を行ったところ、再起動せず。どうやらカーネルパニックになってしまった様子。

→ サポートに再起動依頼。5,250円支払いました。

・第2の失敗
おそらくは一番安全なシングルCPU用のカーネルを使えばいいだろうと思うも、再び有料の再起動をしたくはないので手を考えることにしました。方法としては、カーネルを差し替えて再起動するときにパニックになったら次のカーネルを使うよう、fallback設定をgrubに対して行います。こんな感じです。

default=0
fallback 1
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS_OpenVZ (2.6.xx-xxstub.x.xx.el5) ←xxのところは、もう設定が残っていない
root (hd0,0)
kernel /vmlinuz-2.6.18-xx.xstub.xx.el5 ro root=/dev/sda2
initrd /initrd-2.6.18-128.1.10.el5.img
title CentOS (2.6.18-128.1.10.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-128.1.10.el5 ro root=/dev/sda2
initrd /initrd-2.6.18-128.1.10.el5.img

しかし再起動すると、再び反応なし。想定通りなので再起動してもらうと、やはり反応なし。おかしいなと思ってサポートに再び電話。その結果、カーネルは正常に起動しているが、ネットワークインターフェイスがダウンしているということ。

→といわれてもどうしようもないので、再び再起動依頼。5,250円


その後、Xenを一度動かしてその上でOpenVZを動かそうとも考えましたが、Xenもカーネル差し替えが必要だということがわかり、あきらめモードです。
まあ、仮想化ができなくてもそれなりにやりたいことはできるので、次の一手に進みたいと思います。

次はOpenVPNです。

2009年6月1日月曜日

最初の設定

さくらの専用サーバ上に、OpenVZを使って仮想環境を作り、Webアプリケーションなどの公開を行えるようにする。各仮想環境にはOpenVPNを使って入れるようにする。

★グローバルIPを持ったGWの設定

■ホスト名の修正
デフォルトのホスト名はlocaldomain.localhostとなっていた。これを修正する。修正ファイルは次の通り。
/etc/hosts
/etc/sysconfig/network

■セキュリティホールの可能性をふさぐ
chkconfig --list | grep 3:onでOS起動時に合わせて起動するサービスの確認
→sendmailが動いていた。

chkconfig sendmail offでサービスを起動しないようにする。
/etc/init.d/sendmail stopでサービスを停止する。

その他のサービスは、動いていてもよいようだ。

これで基本的な設定は完了とする。