PythonからVirtualBoxを操作する ~インサイト~ (関連設定の取得・設定変更)

別記事の続きです。
ここではポートフォワードの設定や仮想メディアの情報取得について書いておきます。完成形のサンプルは最後に掲載します。

もくじ:

1. ポートフォワードの設定

IPアドレスの数が限られている環境ではNATを使って、ホストのアドレスを各VMで共用すると便利です。サーバ用途など外側からのアクセスが必要な場合は、ポートフォワードで特定のポートに接続させる構成が可能です。というか、私がVirtualBoxを使う理由はこのポートフォワードが比較的簡単に構成できるためです。

VirtualBoxではいわゆるNAT(NAPT, IPマスカレード)が構成できるネットワークは2種類あります。つまり、VM間通信用のセグメントがない”NAT”(VM作成時のデフォルト)と、専用のセグメントを仮想的に作成しVM間がローカルなアドレスで通信できる”NATNetwork”の2種類です。

複数のVMで同じセグメントを共有する必要がない場合、例えばpingは疎通させなくてもいい、とか固定のアドレスを持つ必要がないなど、であれば前者の”NAT”で十分です。
私も特にVM間通信が不要な使い方ばかりなので、”NATNetwork”は使わず、専ら”NAT”を使っています。一般的な用語としてのNATではなく、VirtualBoxの仮想NICの構成種別としての”NAT”です。

外からのアクセスを待ち受けるには、ポートフォワードを設定し、ゲスト側とホスト側のポートを関連付けます。

APIでは、”NAT”向けのポートフォワードをredirect、”NATNetwork”向けのポートフォワードをportforwardと名称を分けているようです。redirectは各VMに対して、portforwardはホスト単位に設定可能なNATネットワーク(仮想セグメント)と呼ばれる仮想ネットワーク毎に設定されます。いずれもiptablesのような高度なパケットフィルタではなく、単にゲストとホストのListenポートの組に対してTCP/UDPのフォワードを定義できるといった基本的なアドレス変換機能になっています。

今回はredirect(NAT, GUIでは下記の画面)のみ扱いますが、メソッドの使い方はportforward(NATNetwork)でも似た感じになっているようなので、参考になると思われます。

なお、ホスト側でファイヤウォールを利用している場合(大抵は利用していると思いますが)には当該ポートの受信許可も設定する必要があります。

1.1 一覧の取得

redirectはINATEngine.redirectsから参照できます。
IMachine.getNetworkAdapter()に仮想アダプタの番号を指定すると、INetwrokAdapterのプロパティからINATEngineを参照できます。
また、”NAT”の仮想アダプタを期待しているので、種類をチェックしています。

リダイレクトの各ルール毎の設定を表す文字列の配列となっており、フォーマットはこんな感じになっています。

仮想アダプタはデフォルトの設定を使っていると0番のものになると思います。まあPCで使っているレベルなら複数使うケース自体そうないと思いますので0番を設定できれば十分かも知れません。
仮想アダプタの最大数はホスト側のハードウェア設定に依存していますがおそらく8くらいの環境が多いと思います。GUIからは4つまで参照でき、以降の設定は設定ファイル経由で設定できます。

1.2 リダイレクトの追加

種類に”NAT”を指定したアダプタの場合、ゲスト側(NAT内側)のアドレスは自動的に割り振られる(10.0.2.15)ので、今回は指定せず自動とします。
リダイレクトを追加するには、INATEngine.addRedirect()を使います。

また、設定変更のために対象のロックIMachine.lockMachine()、設定保存IMachine.saveSettings()を呼んだうえで明示的にセッションを終了closeMachineSession()します。

1.3 リダイレクトの削除

リダイレクトを削除するには名前を指定してINATEngine.removeRedirect()を呼びます。ロック取得から設定変更の流れは追加の場合と同じです。

2. 仮想メディアの取得

vbox APIでは、仮想ハードディスクや仮想DVDドライブはメディアmediumとして定義されています。
単に設定を調べる場合のほか、可変仮想HDDを縮小する際など、IDを取得できると便利です。

VMごとに接続されているメディアをIMachine.mediumAttachmentsから取得します。

取得した結果はこんな感じになります。

3. サンプル

前回分と合わせてサンプルは下記のようにしました。

おわり。