VirtualBox設定備忘録

メインマシン(ThinkPad X61 Tablet)のSSDIntel X25-M Mainstream SATA SSD (80GB)から IO-DATA SSDN-ST256Bに交換しました*1

I-O DATA Serial ATA対応内蔵2.5インチSSD 256GB SSDN-ST256B

I-O DATA Serial ATA対応内蔵2.5インチSSD 256GB SSDN-ST256B

OSは(リカバリーではなく)Windows Vista Professional (64bit)のクリーンインストールです*2。研究上のほとんどの作業をDebian GNU/Linux上で行う私にとって*3、ホストOSにWindowsを選ぶ理由は、モバイル運用の際に、ネットワーク接続とマシンの頻繁なスリープで悩まないためです。

そこで必要となるのは仮想マシン環境でして、以前から、VMware Workstation, coLinux, VMware Player, VMware Server, そして今回のVirtualBoxと一通り利用してきました。これまでは、64bitホストでも動き、さらにゲストをホストと同期して起動/シャットダウンするために、仮想マシンWindowsのサービスとして設定できるVMware Serverをずっと使用してきました。しかし、VMware Serverには、いくつか解決されそうにない問題があります。

  1. 2008年以来アップデートがない*4
  2. NATがよく切れる*5
  3. ゲストの時間の同期がいまいちである*6

VMware ServerをノートPCで運用する、というのは想定外の利用法であるとはわかっているので、理解できますが,結構ストレスが溜まっていました。
VMware Serverの売りである、Web AccessVMware Server Consoleを利用することで、リモートホストからもゲストの管理ができるという点は、ノートPCで運用するにあたっては不要でした。

VirtualBoxの情報も増えてきたので調べてみると、VirtualBoxコマンドラインからほとんどすべての設定・操作をすることができるため*7、簡単に自動起動/自動シャットダウンスクリプトを書くことができます。そのため、SSDの入れ替えを機に乗り換えてみました。また、VirtualBoxだとWindows 7ホストにも対応していますし、定期的にアップデートもされています*8

インストールしたのは、リモートデスクトップ接続が使えるPUELなVirtualBox 3.2.6です。ネットワークをどうするかは迷いましたが,ホストのネットワーク接続の頻繁な変更への対応と、ホストからゲストへのアクセスを共存することを目的として、結局以下のように2つ接続を考えることにしました。

  1. ネットワークアダプタ1(eth0)-NAT
  2. ネットワークアダプタ2(eth1)-ホストオンリーネットワーク

なお、VirtualBoxのNATではDNS変換もしてくれるのですが、とても遅いので、ゲストではGoogleDNS(8.8.8.8)を利用することにしました*9。平均的にはこちらが早いです。ゲストにDNSキャッシュサーバとしてunboundを立てるのも選択肢にのぼるかと思います。

自動起動スクリプトと自動シャットダウンスクリプト

バッチファイルやVBScriptのサンプルはいろいろありますが、コマンドプロンプトを出さないようにしたい、という希望と、JavaScriptの時代がきていると勝手に思っているため、JScriptで書きました。これらをWeb上の他の多くのスクリプトと異なり、エスケープをきちんと行ってLong File Nameを使っています。
自動起動スクリプトは次のとおりです。Runの最後の引数にfalseを与えることで、waitせずにホストに制御を戻しています。このスクリプト仮想マシン名はDebianにしています。

var WshShell = new ActiveXObject("WScript.Shell");
WshShell.Run("\"C:\\Program Files\\Oracle\\VirtualBox\\VBoxHeadless.exe\" --startvm \"Debian\"", 0, false);
WshShell = null;

自動シャットダウンスクリプトは次のとおりです。ゲストがACPIによる自動シャットダウン可能にしておく必要があります。Runの最後の引数をtrueにすることで、シャットダウン終了までスクリプト終了をwaitさせることができます。

var WshShell = new ActiveXObject("WScript.Shell");
WshShell.Run("\"C:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe\" controlvm \"Debian\" acpipowerbutton", 0, true);
WshShell = null;

ファイル共有

Windows側にはPUELなVirtualBoxをインストールしたのですが、ゲスト側のモジュール群は、アップデートが面倒なため、Debianオフィシャルに存在するvirtualbox-ose-guest-dkmsを入れました。だいたいの操作に問題はなかったのですが、ファイル共有を利用しようとしたところ、ゲスト側でmountした瞬間にカーネルパニックでゲストが落ちました。詳しく追うのは面倒なので、ファイルはいつもどおりsambaで共有しています。

細かな点

  1. VirtualBoxGUIを開いたときにHeadlessなゲストが電源OFF状態と誤認されることがある
    1. PuTTYリモートデスクトップで作業する上では無問題
    2. 電源Onボタンは機能しない(のでやはり無問題)

*1:メインマシンの主記憶容量には80GBでは足りませんでした

*2:Lenovo System Updateを利用するとLenovoオリジナルのソフトウェアも簡単に導入できます

*3:ブラウザはFlashで悩まないためにWindows

*4:このままだと2011年にはEOL

*5:ノートPCなのでいろいろなネットワーク環境で利用する

*6:ノートPCではCPUのクロックが可変

*7:VBoxManage.exe

*8:SunがOracleに買収されて、VirtualBoxも先行き不透明ですが、少なくともGPLOSEがあります

*9:ホストのネットワークが変わるごとにゲストのresolv.confを書き換えるのは非現実的