2010/08/24

MacでVirtualBoxをコマンドラインから操作してみる

MacOS X 10.6上のVirtualBoxをコマンドラインから操作してみようと、VirtualBox SDKを触り始めました。

SDKのリファレンスにあるサンプルを少し動かそうとしただけで、Macだと戸惑うところがでてきます。

サンプルプログラムの起動

SDK付属のPDFファイルにある「2.1 The object-oriented web servvice for JAX-WS」に従って進めていきます。

作業はコマンドラインが必要で、ターミナルでも良いと思いますが、 iTermを使いました。

JAX-WSを使うためにJDK 6の確認

MacOS X 10.6では普通にJDK 6が使えるので、確認だけしておきます。

$ java -version
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02-279-10M3065)
Java HotSpot(TM) 64-Bit Server VM (build 16.3-b01-279, mixed mode)
vboxwebsrvコマンドの起動

マニュアルではコマンドのある場所に移動して、$ ./vboxwebsrv -vとタイプするように書かれています。

ただ素直に場所を探そうとすると、地味に面倒だったりします。

MacOS Xの場合はFinderから起動するプログラムはディレクトリで、必要なリソースのパッケージになっています。 そのため普通に画面右上のspotlightウィンドウでコマンド名を検索しても隠されてしまい表示されません。

こんな場合は、linux同様にlocateコマンドですが、macの場合は最初にデータベースをアップデートするようにメッセージが表示されます。

$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

データベースが作成されるのを待ってから、locateコマンドを打ってみます。

$ locate vboxwebsrv
/Applications/VirtualBox.app/Contents/MacOS/vboxwebsrv
/Applications/VirtualBox.app/Contents/MacOS/vboxwebsrv-amd64
/Applications/VirtualBox.app/Contents/MacOS/vboxwebsrv-x86
/usr/bin/vboxwebsrv

マニュアルにはコマンドのある場所に移動するよう書かれているので、次のようなコマンドを実行しました。

$ cd /Applications/VirtualBox.app/Contents/MacOS
$ vboxwebsrv -v

ちなみにmdfindを使うとスポットライトと同じような出力になるはずですが、次のように少し違った結果になります。

$ mdfind vboxwebsrv
/Users/user01/Programming/VirtualBoxSDK/bindings/webservice/java/jax-ws/samples/metrictest.java
/Users/user01/Programming/VirtualBoxSDK/docs/SDKRef.pdf
/usr/bin/vboxwebsrv

どちらの結果でも、標準的な場所にvboxwebsrvコマンドを見つける事ができますが、後で実験したところ単純にホームディレクトリでvboxwebsrvを実行すると問題が起こりました。

コマンドの実行

マニュアルにある通り、makeコマンドを打つと、 show vms の結果が表示されるはずです。

しかし実際にはプログラムの中にユーザ名とパスワードの組が書かれているため、そのまま実行すると次のようなエラーメッセージで失敗します。

Exception in thread "main" javax.xml.ws.WebServiceException: org.virtualbox_3_2.InvalidObjectFaultMsg: VirtualBox error: Invalid managed object reference ""
        at com.sun.xml.ws.commons.virtualbox_3_2.IVirtualBox.getVersion(IVirtualBox.java:56)
        at clienttest.<init>(clienttest.java:47)
        at clienttest.main(clienttest.java:291)
Caused by: org.virtualbox_3_2.InvalidObjectFaultMsg: VirtualBox error: Invalid managed object reference ""
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:130)
        at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:108)
        at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
        at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
        at $Proxy33.iVirtualBoxGetVersion(Unknown Source)
        at com.sun.xml.ws.commons.virtualbox_3_2.IVirtualBox.getVersion(IVirtualBox.java:53)
        ... 2 more
make: *** [run16] Error 1

修正した部分の差分は次のようになりました。

--- clienttest.java.orig        2010-08-24 14:23:05.000000000 +0900
+++ clienttest.java     2010-08-24 14:24:49.000000000 +0900
@@ -43,7 +43,7 @@
     public clienttest()
     {
         mgr = new IWebsessionManager("http://localhost:18083/");
-        vbox = mgr.logon("test", "test");
+        vbox = mgr.logon("username", "password");
         System.out.println("Initialized connection to VirtualBox version " + vbox.getVersion());
     }

必要な修正をして準備が出来たら、次のように実行します。

$ make run16
java -cp ../lib/vboxws_java16.jar:./gen16 clienttest show vms
Initialized connection to VirtualBox version 3.2.8
Machine 0:  [a2c4fdbc-86c1-4480-806d-fbe6b77005b7] - ubuntu804.x86_64
Machine 1:  [d1b95e67-3005-4279-bb9b-f723433fbe0b] - CentOS
Logged off.

もしホームディレクトリでvboxwebsrvを起動してしまうと、次のようなエラーが表示されます。

$ make run16
java -cp ../lib/vboxws_java16.jar:./gen16 clienttest show vms
Exception in thread "main" javax.xml.ws.WebServiceException: org.virtualbox_3_2.InvalidObjectFaultMsg: VirtualBox error: Invalid managed object reference ""
        at com.sun.xml.ws.commons.virtualbox_3_2.IVirtualBox.getVersion(IVirtualBox.java:56)
        at clienttest.<init>(clienttest.java:47)
        at clienttest.main(clienttest.java:291)
Caused by: org.virtualbox_3_2.InvalidObjectFaultMsg: VirtualBox error: Invalid managed object reference ""
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:130)
        at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:108)
        at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
        at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
        at $Proxy33.iVirtualBoxGetVersion(Unknown Source)
        at com.sun.xml.ws.commons.virtualbox_3_2.IVirtualBox.getVersion(IVirtualBox.java:53)
        ... 2 more
make: *** [run16] Error 1

この時のvboxwebsrv側のエラーメッセージは次のとおりです。

2010-08-24 14:05:47 [ P ] Request 1 on socket 9 queued for processing (1 items on Q)
2010-08-24 14:05:47 [  1] New SOAP thread started
2010-08-24 14:05:47 [  1] Processing connection from IP=127.0.0.1 socket=9 (0 out of 1 threads idle)
2010-08-24 14:05:47 [  1] -- entering __vbox__IWebsessionManager_USCORElogon
2010-08-24 14:05:47 [M  ] Pumping COM event queue
2010-08-24 14:05:47 [M  ] Pumping COM event queue
2010-08-24 14:05:47 [  1] external authentication library is 'VRDPAuth'
2010-08-24 14:05:47 [  1] authenticate() Failed to load external authentication library. Error code: VERR_FILE_NOT_FOUND
2010-08-24 14:05:47 [  1] Could not resolve VRDPAuth2 or VRDPAuth entry point2010-08-24 14:05:47 [  1] -- leaving __vbox__IWebsessionManager_USCORElogon, rc: 0x0
2010-08-24 14:05:47 [  1] -- entering __vbox__IVirtualBox_USCOREgetVersion
2010-08-24 14:05:47 [  1]    findRefFromId(): looking up objref 
2010-08-24 14:05:47 [  1] -- leaving __vbox__IVirtualBox_USCOREgetVersion, rc: 0xFFFFEF33 (-4301)

エラーメッセージのポイントはauthentication()の呼び出しで VERR_FILE_NOT_FOUND が発生しているところかと思われます。

その他のサンプル

PDFには$ java clienttestの引数を変えて実行すると、コマンドの振舞いが変ると書かれていますが、細かい実行方法には振れられていません。 まぁそれぐらい分かる人が相手なんでしょうけどね。

ここでは$ make run16の出力をコピーして、必要なクラスパス(-cp)の設定を使って、試す事にします。

$ java -cp ../lib/vboxws_java16.jar:./gen16 clienttest list hostinfo
Initialized connection to VirtualBox version 3.2.8
Processor count: 2
Processor #0 speed: 2260MHz
...
Logged off.

さいごに

目的はコマンドラインでkickstartを使ってCentOSを導入するところなのですが、長くなったのでとりあえず次回にすることにします。

0 件のコメント: