2010/09/14

MacOS X上のVirtualBox SDKでAPIの動きを調べてみた

Ubuntu LTS上にVMWare Workstationがあるのに、なぜかMacOS XでVirtualBoxを動かしています。

さて、VirtualBoxのAPIにはIStorageController::minPortCountというメソッドについての記述があります。

9.38.1.3 minPortCount (read-only)
unsigned long IStorageController::minPortCount
Minimum number of ports that portCount can be set to.

portCountに指定できる最小の数が定義されているはずなのですが、SATA以外の(SCSI, SAS, etc)オブジェクトでは初期化時点でportCountの戻り値はmaxPortCountと同じになります。

VirtualBoxのフロントエンドのコードを合せて読んでいくと、いろいろ小手先でやっている事があるようです。

portCount関連について、もう少し

minPortCountの値について、psude codeを使うとこんな感じでしょうか。

If controllerType == SATA, IStorageController::minPortCount == 1,
else, IStorageController::minPortCount == IStorageController::maxPortCount.

portCount自体もAPIに定義されている数とは違うように思われるので、「SATAバスに30までのストレージを順番に追加していく」みたいな処理は、空いているポート番号や(連番と仮定しても)総ポート数を知る必要がありますが、毎回ぶら下っているディスクを調べてあげなければなりません。

もっともフロントエンドでもmaxPortCountとportCount変数のみを参照していて、minPortCountは使われていないようです。

そもそもSATAの場合を特別扱いしているコードが散見され、portCountはAPI上ではmaxPortCount(30)に初期化されますが、フロントエンドではSATAだと 1 に再度設定してしまいます。

SCSIやIDEデバイスではportCountの数字が変動しないので、いろいろ不思議です。

処理の途中でportCount, minPortCount, maxPortCountを表示させると、SATAを使わない場合には全てaxPortCountと同じ値になっているのがわかります。

minPortCountメソッドの定義自体はmaxPortCountとほぼ同じで、対称性を維持するためには必要かもしれませんが、アジャイルな考え方になると不要なものに分類されそうな勢いです。

バスの使用状況を調べるといったニーズはあるだろうけれど、portCount周りは不要じゃないかなという印象でした。

Web APIを使ったVirtualMachineの追加の流れ

もともとはVM作成の処理を自動化したかったので、ここからが本題になります。

フロントエンドを使ってVMを新規に作成した場合には、ディスクの追加などの各種デバイスは自動的に準備されますが、APIを使う場合には、ほぼ空っぽのVM定義だけが準備されます。

HDDだけでなく、インストールに必要なDVDメディアの登録なども必要になります。

インストールまでのおおまかな処理は次のようになります。

  • IVirtualBoxインスタンスを通して、IMachineオブジェクトの作成 (IVirtualBox::createMachine())
  • 作成したVM定義の登録(IVirtualBox::registMachine()によるクローズ処理)
  • IVirtualBox::openSession()を通して、変更可能なIMachineインスタンスの再取得
  • IStorageControllerオブジェクトの登録 (IMachine::addStorageController())
  • 別途IVirtualBoxインスタンスを通して作成したIMediumオブジェクトのIStorageControllerへの割り当て (IMachine::attachDevice())
  • 以下、同様にIStorageControllerオブジェクトの取得と、メディアの登録をDVD, Floppyなどに対して繰り返す
  • メモリ割り当てや起動メディア順の入れ替えなど、定義情報の修正
  • IVirtualBox::openRemoteSession()によるVMの起動とインストール作業の開始

VMを作成した直後にはストレージコントローラは追加できないので、セッションを開かないといけないなど、いろいろと細かい手続きが必要になりました。

ここら辺のプロトタイプを作成した経験を踏まえて、すっきりとした内部構造を持つアプリケーションを設計して行こうとしています。

とりあえずは、ステータスのまとめまで。

0 件のコメント: