Aug 28, 2006

VMware Server 1.0.1で遊んでみる

先週はいろいろあってVMware Serverばかりいじっていた。

(簡単に説明しておくと…)VMware ServerはVMware GSX Serverの後継で、サーバー向け仮想化ソフトウェアの一つ。もう少し噛み砕いて言うと、通常の仮想化ソフトウェアに、それをホストOSから操作するためのAPIと、そのAPIを使って実現された(と思しき)リモートコントロール用サービスを追加したような製品だ。先月上旬に正式にVMware Server 1.0.0の無償での提供が開始され、今月中旬に最初のアップデート版である1.0.1がリリースされたところ。VMware第五世代のVM間でのmobilityが保証されているので、VMware Workstation 5.xやPlayer 1.x、ESX Server 3.xとの間でほとんど変更なしにVMイメージを交換できる。

いやなんていうか、こんな便利なものが無償で公開されていていいのか、というくらい便利だ。

私は手持ちのノートPC上のWorkstation 5.5.2を開発環境として利用するか、適当なリモートマシンに開発環境を作ってVNCサーバを立ち上げておいてノートPCのVNCクライアントから接続して利用するか(sshで済ますことも多いが)してきた。前者だと2つ3つとVMを同時に立ち上げるのはリソース的に苦しい。後者だとリモートマシンの個数に制約される。もちろん、リモートマシン上でWorkstationやPlayerを動かす方法もあるにはあるが、ホストノードにVNCなりsshなりでログインして実行制御した上でゲストノードにログインして…というのは面倒過ぎて手を出すのが躊躇われた。

VMware Serverを使うと、手元のWindowsマシンにインストールしたVMware Server Consoleから、リモートマシン上のVMの制御がtransparentにできてしまう。つまりは、Workstation/PlayerではConsoleとVMが同じ手元のPCで動作するけれども、ServerではVMだけをリモートマシンにサービスさせて手元のWindowsマシンはThin Clientとして動作させられるということだ。サービスするリモートマシンを増やせばVMの数についてはスケールする。また、もちろんServer Consoleを動作させているマシン自体にVMをサービスさせることもできて、その場合はVMware Workstationと大差ない使用感となる。


さて、個人的に興味を持ってやっていたのは、多数のホスト上に複数のVMを立ち上げた環境下で、任意のVMをVLANでgroupingするという遊び。ESX ServerだとVMwareが実現するVirtual Switch自体が802.1Q taggingに対応しているので何も考える必要はないのだが、ServerやWorkstation/PlayerにおけるVirtual Switchは"dumb hub"に過ぎない。だから、vconfigコマンドを使って作ったVLAN interfaceをVirtual Switchにブリッジ接続してやる必要がある。ちょっと面倒くさいけれども、Xenでも同じようなVirtual Switch abstractionを実現しているのでやることは一緒なわけ。

例えば、こんな感じ。まず、ホストノードでVLAN interfaceを作ってupしておく。

/sbin/vconfig add eth0 100
/sbin/vconfig add eth0 101
/sbin/vconfig add eth0 102
...
/sbin/ifconfig eth0.100 0.0.0.0 up
/sbin/ifconfig eth0.101 0.0.0.0 up
/sbin/ifconfig eth0.102 0.0.0.0 up
...

次にVLAN interfaceがブリッジ接続するVMnet (Virtual Switch)を作る。

/usr/bin/vmnet-bridge -d /var/run/vmnet-bridge1.pid /dev/vmnet1 eth0.100
/usr/bin/vmnet-bridge -d /var/run/vmnet-bridge2.pid /dev/vmnet2 eth0.101
/usr/bin/vmnet-bridge -d /var/run/vmnet-bridge3.pid /dev/vmnet3 eth0.102
...

次にホストが接続するスイッチの設定をする。802.1Q対応のスイッチならたいてい同じことができるが、ここではDell PowerConnectの設定例を示す。

vlan database
 vlan 1 name DefaultVlan media ethernet state active
 vlan 100 name vmnet1 media ethernet state active
 vlan 101 name vmnet2 media ethernet state active
 vlan 102 name vmnet3 media ethernet state active
(snipped)
!
interface ethernet 1/1
 switchport allowed vlan add 1 untagged
 switchport native vlan 1
 switchport allowed vlan add 100-109 tagged
!
interface ethernet 1/2
 switchport allowed vlan add 1 untagged
 switchport native vlan 1
 switchport allowed vlan add 100-109 tagged
!
(snipped)

こうすると同じタグに対応付けられたVMnetを使用するVM間でしか通信できなくなる。あとは好きなように各VMの使用するVMnetを切り替えればよい。tagged frameは4バイト大きくなるのでその分MTUを調整したりする必要があると思うけれどそのあたりの説明は省略。

ついでに書いておくと、VMnetの切り替えは外部から行うことができる。VMが起動していない状態ならば、vmxファイルを以下のように書き換えれば、次回以降の起動ではその内容が反映される。

ethernet0.connectionType = "custom"
ethernet0.vnet = "vmnetX"

VMが動作している状態ならば(VMwareToolsがインストールされていてvmware-guestdが動作しているという条件付きだが)、より簡単にホストマシン上から切り替えることができる。私が気が付いている方法は2つ。

1つはsetconfigでパラメータを変更後、suspend & resumeする方法で、以下のコマンド列を実行すればよい。

$ /usr/bin/vmware-cmd /path/to/vm.vmx setconfig ethernet0.connectionType custom
$ /usr/bin/vmware-cmd /path/to/vm.vmx setconfig ethernet0.vnet vmnetN
$ /usr/bin/vmware-cmd /path/to/vm.vmx suspend
$ /usr/bin/vmware-cmd /path/to/vm.vmx start

suspendの代わりにstopでもよいが、shutdown & bootするのでとても時間がかかる。

もう1つは、やはりsetconfigで設定変更後、VMのEthernetデバイスをdetach & attachするという方法。これが一番速い。

$ /usr/bin/vmware-cmd /path/to/vm.vmx setconfig ethernet0.connectionType custom
$ /usr/bin/vmware-cmd /path/to/vm.vmx setconfig ethernet0.vnet vmnetN
$ /usr/bin/vmware-cmd /path/to/vm.vmx disconnectdevice Ethernet0
$ /usr/bin/vmware-cmd /path/to/vm.vmx connectdevice Ethernet0

また、vmware-cmdはネットワーク越しにVMwareServerを叩くこともできるので、ネットワーク上に分散するVM群のVMnetを「中央集中的に」切り替えることも当然できる。


他には、ホストにiSCSI initiatorを設定してVMのディスクイメージをやっすくでっち上げたiSCSIストレージサーバ上に置いて、general public向け"Boot from SAN"を実現するのとかどうよ、と思っている。大抵の場合、ブートシステム自体が高速なディスクアクセスを要求するわけではないので問題はないのではないか、と。高速・大容量なディスクが本当に必要ならSANを(どのみちVMであってもなくても必要なのだから)用意すればよいわけだから。

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com