OpenVZとは、フリーの仮想マシンのひとつで、同一のカーネルを使用する方式だ(Xenとは違う実装)。商用版は、Virtuozzoという名前で、いろいろ便利な機能が使用できるようだが、基本的な機能は変わらないらしい。~
 ここでは、用語を[[OpenVZ:http://wiki.openvz.org/Main_Page]]に習い、仮想マシンのことをVE、ホストマシンのことをVE0と記述する。
#contents
*問題点 [#xa375135]
 %%自分で実際に運用した限りでは、以下のような問題があった。%%
-%%VE0、VEともにCPU使用率が低いにもかかわらず、たまに数秒程度処理が引っかかる。%%
-%%処理が引っかかるせいか、システム時刻が不定期に狂う。%%

 %%サーバマシンとしては致命的なので、ほかの仕組み([[UML>Debian/User Mode Linux]]、[[VServer>Debian/VServer]])を検討中。%%

 と思ったけど、どうやら「kernel: eth0: excessive work at interrupt.」のエラーが出ているときに処理が引っかかるようだ。~
 NICが腐っているようなので、高いけど3comのものを買うことにする。
*iprouteを使用たVE別のデフォルトゲートウェイの設定 [#icb276b9]
 ここでは、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にする [#db77fea4]
 まずは、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別のデフォルトゲートウェイの設定>Debian/OpenVZ#icb276b9]]をすることにした。
*デバイスを直接扱う [#wd874b55]
 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に接続するネットワークデバイスを明記する [#b19f655b]
 VE0をpppoeでルータにしていると、VE0からVEにつないだときに、VEからはpppoeで取得したグローバルアドレスからアクセスしているように見えることがある。これでは都合が悪いので、VEにつなぐネットワークデバイスを明記する。これにより、そのネットワークデバイスのIPアドレスから接続されているように見える。~
-/etc/vz/vz.conf (18行目あたり)
 VE_ROUTE_SRC_DEV="eth0"
*メモリ制限の仕組み [#pacb6dc1]
 VEで使用するメモリは設定ファイルで指定するが、メモリ使用の基準となるのは実際に使用しているサイズではなく、確保したサイズとなるようだ((Linuxでは、メモリ使用効率の面からデフォルトではメモリ確保だけでは実メモリを消費せず、アクセスをしたときにはじめてメモリを割り当てる仕組みになっている。))。~
*参考 [#uaed72b3]
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
h

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS