OpenVZとは、フリーの仮想マシンのひとつで、同一のカーネルを使用する方式だ(Xenとは違う実装)。商用版は、Virtuozzoという名前で、いろいろ便利な機能が使用できるようだが、基本的な機能は変わらないらしい。
 ここでは、用語をOpenVZに習い、仮想マシンのことをVE、ホストマシンのことをVE0と記述する。

問題点

 自分で実際に運用した限りでは、以下のような問題があった。

 サーバマシンとしては致命的なので、ほかの仕組み(UML?VServer?)を検討中。

 と思ったけど、どうやら「kernel: eth0: excessive work at interrupt.」のエラーが出ているときに処理が引っかかるようだ。
 NICが腐っているようなので、高いけど3comのものを買うことにする。

iprouteを使用たVE別のデフォルトゲートウェイの設定

 ここでは、192.168.0.100を使用するVEだけ、192.168.0.200のゲートウェイを通ってインターネットに出て行く場合の方法を記述する。
 まずは、振り分け用のルールテーブルを作成する。テーブル名ではなく番号を直接使用する場合には必要ない。

VE0# echo 100 ve >> /etc/iproute2/rt_tables

 作成したテーブルを使用する条件(ルール)を指定する。

VE0# ip rule add from 192.168.0.100 table ve

 条件にあったパケットの、ローカルアドレスとデフォルトゲートウェイのルート情報を指定する。

VE0# ip route add 192.168.0.0/24 dev eth0 table ve
VE0# ip route add default via 192.168.0.200 dev eth0 table ve

 念のため、ルーティングのキャッシュをクリアする。

VE0# ip route flush cache

 起動時に自動的にこれらの設定をするには、/etc/network/interfaces に以下のように記述するとできる(最後の3行)。

VE0# vi /etc/network/interfaces
iface eth0 inet static
    address 192.168.0.50
    gateway 192.168.0.254
    netmask 255.255.255.0
    up sysctl -w net.ipv4.conf.eth0.proxy_arp=1
    up ip rule add from 192.168.0.100 table ve
    up ip route add 192.168.0.0/24 dev eth0 table ve
    up ip route add default via 192.168.0.200 dev eth0 table ve

参考:
http://www.linux.or.jp/JF/JFdocs/Adv-Routing-HOWTO/lartc.rpdb.simple.html

VEから見えるネットワークデバイス名をeth0にする

 まずは、venet用のIPアドレスを削除する。その後、veth用にMACアドレスを割り当てる。(MACアドレスの割り当て方は、OpenVZのバージョンによって異なる)

VE0# vzctl set 1001 --ipdel all --save
VE0# vzctl set 1001 --veth_add veth1001,00:FF:FF:FF:FF:01,eth0,00:FF:FF:FF:FF:02 --save

 VEを起動し、VE上のネットワーク設定を追加する。

VE0# vzctl start 1001
VE0# vzctl enter 1001
VE# vi /etc/network/interfaces.template
auto eth0
iface eth0 inet static
    address 192.168.0.53
    netmask 255.255.255.0
    gateway 192.168.0.254

 ネットワークの設定を反映させるためVEを再起動すると、先ほど指定したネットワークデバイス(veth1001)がVE0に追加されるので、それを有効にする。

VE0# vzctl restart 1001
VE0# ifconfig veth1001 0

 VE0から出て行く物理NICと、VEとやり取りする仮想NICのforwardingとproxy_arpを有効にする。
#この環境では、仮想NICのproxy_arp以外はすでに有効になっていた。

VE0# sysctl -w net.ipv4.conf.veth1001.forwarding=1
VE0# sysctl -w net.ipv4.conf.veth1001.proxy_arp=1
VE0# sysctl -w net.ipv4.conf.eth0.forwarding=1
VE0# sysctl -w net.ipv4.conf.eth0.proxy_arp=1

 VE用の設定をルーティングテーブルに追加する。

VE0# ip route add 192.168.0.53 dev veth1001

 VEから、VE0やほかのマシンにpingが届けば設定完了だ。

VE# ping 192.168.0.62
VE# ping 192.168.0.254
VE# ping www.google.ne.jp

 当初は、この方法でVEべつにデフォルトゲートウェイを変えれると思っていたが、この方法では無理だった。そのため、iprouteを使用たVE別のデフォルトゲートウェイの設定?をすることにした。

デバイスを直接扱う

 VEから、VE0のデバイス(/dev/hdaなど)を直接扱うには、vzctl の devices オプションを使用する。このオプションに指定する情報は、/dev/ 配下を参考にするとよい。
 たとえば、/dev/md0 は以下のようになっている。

VE0# ls -l /dev/md/0
brw-rw---- 1 root disk 9, 0 2007-05-15 00:26 /dev/md/0

 VEに /dev/md0を見せるには、以下のように行う。

VE0# vzctl set 1001 --devices b:9:0:rw --save

 これだけではVEからデバイスが見えなかったので、VEにデバイスを作成する。

VE# mknod /dev/md0 b 9 0

VEに接続するネットワークデバイスを明記する

 VE0をpppoeでルータにしていると、VE0からVEにつないだときに、VEからはpppoeで取得したグローバルアドレスからアクセスしているように見えることがある。これでは都合が悪いので、VEにつなぐネットワークデバイスを明記する。これにより、そのネットワークデバイスのIPアドレスから接続されているように見える。

メモリ制限の仕組み

 VEで使用するメモリは設定ファイルで指定するが、メモリ使用の基準となるのは実際に使用しているサイズではなく、確保したサイズとなるようだ*1

参考

http://wiki.openvz.org/Installation_on_Debian
http://wiki.openvz.jp/
http://www.ne.jp/asahi/open/gallery/virtuozzo/virtuozzofc4/virtuozzofc4.htm
http://kano.feena.jp/?Debian%2FOpenVZ
https://jpy.swsoft.com/manuals/VZ/Linux/3.0/VzLinuxUG_Japanese.pdf
http://www.thomas-krenn.com/upload/documentbox/VzLinuxResourcesMgmt.pdf


*1 Linuxでは、メモリ使用効率の面からデフォルトではメモリ確保だけでは実メモリを消費せず、アクセスをしたときにはじめてメモリを割り当てる仕組みになっている。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-01-22 (木) 21:05:38 (3924d)