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 件のコメント:
コメントを投稿