VirtualBox のゲスト OS をウィンドウ非表示で実行させる方法

virtualbox-scripts-01

VirtualBox はなかなか素敵なのですが、VMware Server のようにコンソール画面などの GUI を非表示にして実行できないのが不満でした。が、WSH と付属のコマンドラインツールを使えば、GUI を表示させずに実行できる様子。

(2011/05/14 追記)
VBoxHeadlessTray というフリーソフトを使えば、この記事よりもっと楽に実現できます。「If a VBoxHeadlessTray machine is running when Windows is shutdown, it will automatically save the machine’s state and on Windows restarting, VBoxHeadlessTray will restart itself automatically and resume the VM.」だそうです。素晴らしい。

付属のコマンドラインツール VBoxHeadless.exe と VBoxManage.exe を使います。WSH のスクリプトで実行すると、コマンドラインプロンプトが表示されないのでより良い感じ。以下のようなスクリプトを作成して利用します。

起動用スクリプト centos_start.vbs

CreateObject("WScript.Shell").Run """C:\Program Files\Oracle\VirtualBox\VBoxHeadless.exe"" -s ""CentOS 5.5""",0,True

一時停止用スクリプト centos_suspend.vbs

CreateObject("WScript.Shell").Run """C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"" controlvm ""CentOS 5.5"" savestate",0,True

シャットダウン用スクリプト centos_shutdown.vbs

CreateObject("WScript.Shell").Run """C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"" controlvm ""CentOS 5.5"" acpipowerbutton",0,True

※上記いずれも、『CentOS 5.5』 とある部分は、仮想マシン名です。

起動用スクリプトでも VBoxManage.exe を使って、controlvm –type headless オプションでいけるかと思ったのですが、コマンドプロンプトが開いてしまいます。ということで、起動用スクリプトでは VBoxHeadless.exe を使いました。起動用スクリプトは、仮想マシンの電源オフ状態からでも一時停止状態からでも利用可能です。

一時停止用スクリプトを実行すると、仮想マシンがサスペンドされます。このスクリプトを Windows のログオフ時の実行スクリプトに設定しておけば、Windows シャットダウン前にいちいちシャットダウン(またはサスペンド)する手間が省ける…はずなんですが、思った通りに動作してくれません。Windows をシャットダウンまたは再起動すると、仮想マシンがサスペンド状態(保存)にならず、電源オフ状態となってしまいます

ログオフ時の実行スクリプトへの設定は諦めて、以下のようなスクリプトを実行することで Windows のシャットダウン・再起動を行うようにしました。

Widnows シャットダウン用スクリプト windows_shutdown.vbs

Option Explicit

Dim objShutdown, objOS, objSystem
  
' VirtualBox のゲスト OS をサスペンド
CreateObject("WScript.Shell").Run """C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"" controlvm ""CentOS 5.5"" savestate",0,True

'シャットダウンオブジェクト
Set objShutdown = GetObject("winmgmts:{impersonationLevel = impersonate, (Shutdown)}")
 
'オペレーティングシステムオブジェクト
Set objOS = objShutdown.InstancesOf("Win32_OperatingSystem")
 
' シャットダウン実行
For Each objSystem In objOS
    objSystem.Win32Shutdown 8
Next

Widnows 再起動用スクリプト windows_restart.vbs

Option Explicit

Dim objShutdown, objOS, objSystem
  
' VirtualBox のゲスト OS をサスペンド
CreateObject("WScript.Shell").Run """C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"" controlvm ""CentOS 5.5"" savestate",0,True

'シャットダウンオブジェクト
Set objShutdown = GetObject("winmgmts:{impersonationLevel = impersonate, (Shutdown)}")
 
'オペレーティングシステムオブジェクト
Set objOS = objShutdown.InstancesOf("Win32_OperatingSystem")
 
' 再起動実行
For Each objSystem In objOS
    objSystem.Win32Shutdown 2
Next

以下を参考にしました。多謝!