VirtualBox + Linux brige

VirtualBox(on Debian)のゲストOSのネットワーキングで、 標準ではNATしか動かんので bridged network は面倒臭そうで諦めていた。 が、よく考えたらVMware3 on NetBSDを使っていたときに、ホストOS(NetBSD)の ブリッジ機能で bridged network を使っていたから原理はいっしょと 思ってちらっとみたら、
http://superlinux.blog50.fc2.com/blog-entry-18.html
などがみつかって、やってみた。

基本的にはLANにつながってるインタフェース(例: eth0)を ブリッジに繋いで、そこにVirtualBoxのモジュールによるネットワーク インタフェースを繋ぐ、という感じ。NetBSDのブリッジとの 違いは、Linuxの bridge-utils ではブリッジ化インタフェースを使うなら eth* じゃなくてそっちのインタフェースを主に使うようになるって辺り。 通じるけ。

さてDebianの場合。結論から先に書くと、

ホストOSのLANのI/F(例)eth0
eth0のIP設定192.168.1.2/24 (gateway=192.168.1.1)
ブリッジ化するI/F名(任意名)bridge0
ゲストOSに割り当てるブリッジI/F名(任意名)vbox0

だとすると、おそらく /etc/network/interface は こんな風になっている。

auto eth0
iface eth0 inet static
 address 192.168.1.2
 netmask 255.255.255.0
 gateway 192.168.1.1

そしたら、それをブリッジインタフェースに変えちゃう。そして、 それがブリッジであることを示すキーワードを付加する。

auto bridge0
iface bridge0 inet static
 address 192.168.1.2
 netmask 255.255.255.0
 gateway 192.168.1.1

bridge_ports eth0

iface eth0 inet static
 address 0

これでOS側の設定おしまい。すぐ起動したきゃ /etc/init.d/networking restart だが、ネットワークが 切れるので次の設定をしてからリブートした方がよい。

次、VirtualBoxのゲストOS用ネットワークI/Fの生成。これは /etc/init.d/vboxnet がしっかり作ってくれるので /etc/vbox/interface にこんな風に書いておく。

vbox0 UserName bridge0
vbox1 UserName bridge0
vbox2 UserName bridge0
    :
 (以下好きなだけ列挙)

このファイルを自動生成してくれるのが VBoxAddIF, VBoxTunctl コマンド で、このファイルを手で作りたくなければコマンドラインで

VBoxAddIf vbox0 UserName bridge0
VBoxTunctl -t vbox0 -uUserName

を繰り返す。

はい、リブート。vbox0とかが使える。VirtualBoxのゲストOS設定の 「ネットワーク」タブのアダプタ設定の割り当て(A)の種類を 「ホストインタフェース」にして、インタフェース名のところに vbox0などと書き込めばよい。

VMwareやXenだとブリッジインタフェースにつなぐゲストOS用の インタフェースは内部で勝手に作ってくれるんだけどね。

VirtualBoxゲストOS遠隔(自動)起動/停止

VirtualBoxはGUIがものすごくいいからリモート管理・自動起動停止管理に 向いてなさそうなんだが、実はCUIインタフェースがVMwareよりずっと充実して いる。ゲストOSをサーバとして起動したい場合、ホストマシンが起動したときに ゲストも自動で上がって欲しいし、ホストマシンをシャットダウンするとき ゲストを自動で落として欲しい。GUIでいちいち上げ下げしてられっかってんだ。

てことで、既に設定済みのゲストOSの起動。ゲストOSの名前が たとえば hoge だとすると、

VBoxHeadless -s hoge -w 1152 -h 864 -p 3999

などとする(VirtualBoxを起動すべき一般ユーザのままでよい)と、 画面サイズ 1152x864 で待ち受けVRDPポート3999の Virtual Machineが上がる。これフォアグラウンドで起動するから daemontools化しやすいねえ。ゲストOSが起動したら、 ほっといてもいいし、どうしても画面を見たければ rdesktopをインストールしてある別の端末から

rdesktop -g 1152x864 VBoxHost:3999

とか、オプションはお好みで。でもコンソール画面より実際は そのゲストで起動するネットワークサービスが重要だからあんまり コンソール画面要らんと思う。

さて、ホストマシンをシャットダウンするから停めたい。これは 「状態を保存」でいいと思う。これは VBoxManage コマンドで行なう。 引数なしで起動すると詳しすぎるくらいヘルプが出てくる。「状態保存」 でゲストOSを停めるならこんな感じ。

VBoxManage controlvm hoge savestate

これも自分ユーザ権限のままでOK。VirtualBoxの状態保存は速いので ホストOSの shutdown hook に入れても間に合いそう。

ほかにも VBoxManage 経由でほとんど全ての操作ができるので スクリプトに入れて自動化しやすい。やー、なんかXenで頑張る 気分が落ちて来た。

VirtualBoxとVMware Server 1.x 軽い比較

単純に古いiozoneで比較。

まあ大差ないか。それはともかく、VirtualBoxのほうがホストOSの CPUを食いまくるのが気になる。VirtualBoxとVMwareServerで 各々2個ずつゲストを起動しているときの様子をtopで見るとこんな感じ。

top - 13:13:56 up 19:14,  3 users,  load average: 5.18, 3.81, 2.52
Tasks: 138 total,   1 running, 136 sleeping,   1 stopped,   0 zombie
Cpu(s):  8.6%us, 90.7%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.7%hi,  0.0%si,  0.0%st
Mem:   2075940k total,  2021884k used,    54056k free,     2604k buffers
Swap:  2719736k total,   282572k used,  2437164k free,  1088492k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 5939 yuuji     20   0  171m 105m  13m S 50.5  5.2  71:15.65 VirtualBox
 5704 yuuji     20   0  715m 599m  15m S 31.9 29.6  48:17.37 VirtualBox
 5766 yuuji     10 -10  375m 282m 275m S  7.0 13.9  19:39.05 vmware-vmx
 3315 yuuji     10 -10  811m 421m 410m S  3.0 20.8  37:16.00 vmware-vmx

VirtualBoxはUbuntuとFreeBSD6、VMware ServerはWindowsとFreeBSD6。 VMwareの方がゲストがidle状態になると%CPUが落ち着くのだが、 VirtualBoxのほうは全然落ちて来ない。なんでだ。

同じ VirtualBox 1.6.4 も CentOS 5.2/x86_64 Core2Duo のほうは %CPUは低く安定しているのにな。むむー。