コマンドラインに隠されたVirtualBoxのチューニング法

 少し前にSunからリリースされたVirtualBox 2は、デスクトップユーザに最適な仮想化アプリケーションの1つと評していいだろう。これは非常に低コストで取得可能な2つのバージョンで提供されており、このうちクローズソース版にはいくつかの機能追加が施されている。そして同ソフトウェアは完成度の高いグラフィカルユーザインタフェース(GUI:Graphical User Interface)で操作するのが基本であるため気づいているユーザーは少ないだろうが、実際にはコマンドラインからの完全な制御にも対応しているのだ。

 VirtualBoxの強力なコマンドラインインタフェース(CLI:Command-Line Interface)を必要とするユーザー像としては、モニタやキーボードを接続しないヘッドレス形態でサーバを運用する人間を考えればいいだろう。また通常のデスクトップユーザーであってもVirtualBoxのGUIでは不可能な、仮想ディスクの縮小やクローニング、BIOSロゴのカスタマイズ化、仮想マシン(VM:Virtual Machine)の各種動作情報の収集といった操作が、CLIを介して実行できるのである。

 VM作成についてはCLI操作からでも行えるが、ヘッドレスサーバ上でVirtualBoxを実行しているのでもない限りGUIを使う方が手間はかからないだろう。実際、一般的なVM作成オプションの大半はGUIでも利用可能であり、無理をしてCLI経由でVMを作成すると作業完了までにかえって長時間を要するはずだ。むしろCLI操作がその真価を発揮するのは、作成後のVMに対する各種の微調整なのである。

 CLIからのVirtualBox制御にはVBoxManageコマンドを利用する。その際にはVMに施す変更や操作の種類に応じて、VBoxManageに用意されている各種のサブコマンドとオプション類を使い分けなくてはならない。またCLIからの操作時には、対象とするVMや仮想ディスクなどのコンポーネントも特定する必要がある。その指定は、VMの名前あるいは固有の識別子(UUID)で行えるようになっており、前者はVM作成時にユーザーが指定する名称で、後者はVirtualBoxが自動で割り当てる識別番号だ。

 UUIDの確認はlistコマンドで行えるが、その際には対象となるデバイスのタイプを指定しなくてはならない。例えば下記の出力例のように、VMを対象とした「VBoxManage list vms」というコマンドを実行すると、VM本体のUUIDだけでなく、割り当てられたメモリ量、VMの現在の状態(実行中か電源オフか)、接続された仮想ディスク群のUUIDなど、各種の情報が表示される。

$ VBoxManage list vms
VirtualBox Command Line Management Interface Version 2.0.2
(C) 2005-2008 Sun Microsystems, Inc.
All rights reserved.

Name:            Fedora
Guest OS:        Fedora
UUID:            50da82bf-9c03-48d2-99ad-66f9885f30c1
Config file:     /home/bodhi/.VirtualBox/Machines/Fedora/Fedora.xml
Memory size:     128MB
VRAM size:       8MB
Boot menu mode:  message and menu
ACPI:            on
IOAPIC:          off
PAE:             off
Time offset:     0 ms
Hardw. virt.ext: off
Nested Paging:   off
State:           powered off (since 2008-10-15T20:29:41.000000000)
Monitor count:   1
Floppy:          empty
SATA:            disabled
Primary master:  /home/bodhi/.VirtualBox/VDI/eightgig (UUID: c00ef0b0-173a-4f10-aa9b-94f38a5306af)
NIC 1:           MAC: 0800273EBD00, Attachment: NAT, Cable connected: on, Trace: off, Type: Am79C973, Reported speed: 0 Mbps

 こうして確認したUUIDは、VMに対する設定変更コマンド中で使用する。例えばVMの割り当てメモリ量を512MBに増やすには「VBoxManage modifyvm 50da82bf-9c03-48d2-99ad-66f9885f30c1 -memory "512MB"」と指定すればいい。同様に「VBoxManage modifyvm 50da82bf-9c03-48d2-99ad-66f9885f30c1 -vram "16MB"」は、ビデオRAMを16MBに増やすための指定だ。

 このようにCLI操作時にUUID指定を用いるのは、開発プロジェクトからも推奨されている方式だが、本稿の解説では可読性を高めるために、VMの名前を用いた指定法を使うことにする。

 ブート処理に長時間を要するVMの場合、BIOSロゴの表示時間を切りつめることで、何秒かの時間短縮ができるはずだ。具体的には「VBoxManage modifyvm "Fedora" -bioslogodisplaytime 1000」とすることで、この時間を1000ms(1秒)に変更できる。あるいは、デフォルトで適用されるSunのBIOS画像を非圧縮の256色BMPファイルに置き換えるには「VBoxManage modifyvm "Fedora" -bioslogoimagepath path-to-the-image 」とすればいい。

 多くのBIOSがそうであるように、VirtualBoxのBIOSもブートプロセスを途中でインタラプトして、他の起動用デバイスに一時的に切り換えるという処理が行える。しかしながらUSBデバイスからの起動に対応したコンピュータが普及した現在、この機能はセキュリティ上のリスクとなりかねない。こうしたユーザーによる起動デバイスの一時切り換えを禁止するには、「VBoxManage modifyvm "Fedora" -biosbootmenu disabled」としておけばいい。

 VMのブート順序の設定については、BIOS操作を介さずに変更することができる。例えば「VBoxManage modifyvm "Fedora" -boot1 dvd -boot2 disk -boot3 floppy -boot4 net」は、VMからのアクセス順をDVDドライブを1番目にして、その後を、ハードディスク、フロッピードライブ、ネットワークという順番にするという指定だ。またブートデバイスをnoneに指定すると、スロットを空にできる。

 VM設定の中には、すべてのネットワークトラフィックに関するログを残すという機能も用意されている。例えば「VBoxManage modifyvm "Fedora" -nictrace1 on -nictracefile1 /tmp/nictraffic.log」を実行すると、1番目の仮想ネットワークカードにおける全トラフィックが指定のファイルにログとして記録されるはずだ。

仮想ディスクとリムーバブルデバイスの操作法

 VirtualBoxの仮想化環境では、プライマリマスター、プライマリスレーブ、セカンダリスレーブという3つの仮想ディスクをVMに接続でき、セカンダリマスターはリムーバブルデバイス用に予約されている。またVirtualBoxのGUI操作にてVMを作成すると、ビルトインのVirtual Disk Managerツールを用いた仮想ディスクの追加を行うようユーザーに求められる。例えば先に見たFedoraのVMでは、プライマリマスターとして“eightgig”という名称の容量8GBディスクが使用されている。

 CLI操作でのディスク作成にはcreatevdiコマンドを使用するが、その際には名前とサイズ(MB単位)を指定しなくてはならない。またVMで使用するディスクは事前に登録しておく必要があるが、「VBoxManage createvdi -filename fourgig -size 4096 -register」というコマンド指定を用いると、サイズ4GB(4096MB)のディスク作成とVirtualBoxへの登録が一括で処理できる。

 ディスクの新規作成と登録が終了したら、次にVMへの割り当てを行わなくてはならない。例えば「VBoxManage modifyvm "Fedora" -hdb fourgig」というコマンドは、先に作成したディスクをFedora VMのプライマリスレーブ用ディスクとするための指定だ。

 VirtualBoxのリムーバブルデバイスに関しては、登録したISOイメージまたは物理ドライブを仮想CD/DVDドライブとして使用できるようになっている。ホスト上の物理ドライブである/dev/hdcをVMに接続するには「VBoxManage modifyvm "Fedora" -dvd host:/dev/hdc」とすればいい。ただしデフォルト設定下のVirtualBoxでホストドライブに許可されるのは、読み取り専用アクセスだけだ。なお実験的な機能だが、「VBoxManage modifyvm "Fedora" -dvdpassthrough on」というコマンドにより、DVDへの書き込みサポートを有効にすることもできる。

 実行中のVMからイメージファイルを一時的に利用する場合は、事前の登録を必要としない。そうした処理に関しては「VBoxManage controlvm "Fedora" dvdattach path-to-ISO-image 」というコマンドを実行するだけで、指定したVMにISOイメージが接続されるのである。

スナップショット機能の活用法

 仮想化ソフトウェアの有す最も有用な機能の1つが、VMのスナップショット作成である。VMの構成に対して何らかの変更をする際には、事前にスナップショットを作成しておく習慣を付けておくといいだろう。正常動作時のスナップショットを残しておくと、ハードウェアレベルでは、ハードウェア設定の変更に起因して機能不全に陥ったシステムのリカバリが行えるし、ソフトウェアレベルでも、操作ミスやウィルスにより喪失したデータの復旧に役立つはずだ。

 VirtualBoxでのCLI操作によるスナップショット作成は非常に簡単である。例えば正常動作時のFedora VMのスナップショットを作成したければ、「VBoxManage snapshot "Fedora" take snap1-stable-system」とすればいい。スナップショット情報の保存終了までに要する時間はホストとなるVMおよび使用するリソースによって異なってくるが、スナップショット作成中のシステム変更は禁物なので、すべてのVMインタフェースはスナップショット保存が完了するまでVirtualBoxによりグレイアウトされるようになっている。

 正常動作時のスナップショットが手元にあれば、現状のシステム設定に様々な変更を安心して加えられるはずだ。その結果としてマシンが異常な挙動を示したりブート不可能になったとしても、スナップショットを用いて正常動作時のマシンに復元すればいい。具体的な復元手順としては、まず「VBoxManage controlvm "Fedora" poweroff」によりVMの電源をオフにし、次に「VBoxManage snapshot "Fedora" discardcurrent -state」によって最新のスナップショット状態に復帰させるだけである。なお複数のスナップショットを作成している場合は、-stateスイッチの代わりに-allと指定することで、最後から2番目のスナップショットに戻すことができる。

 ただし当然ながら、こうした復帰を行うとスナップショット作成後に施したすべての変更は失われることになる。そして、それはシステム設定だけに限られるのではなく、各種のファイル群に対しても当てはまる話である。こうした問題を回避するには、スナップショットの影響外に置かれる“writethrough”というディスクにデータを保存させればいい。これは機能的には通常のディスクだが、スナップショットへの復帰時にVirtualBoxはwritethroughディスクを無視するのだ。このディスクは重要なデータやファイルの保存先とすればいいが、あるいは/homeディレクトリ全体をここに置いてもいいだろう。

 writethroughディスクの追加は、createvdiによる新規ディスク作成時に「-type writethrough」オプションを指定することで行える。ただし作成済みディスクをwritethroughとすることも不可能ではない。そのための手順としては、まず「VBoxManage modifyvm "Fedora" -hdb none」によりVMへの接続を解除してから、「VBoxManage unregisterimage disk fourgig」により対象ディスクの登録自体も解除しておかなくてはならない(ここでのfourgigはサンプル名なので、実際には各自のシステム上のディスク名を指定する)。その後「VBoxManage registerimage disk "fourgig" -type writethrough」という指定により、writethroughディスクとして登録し直してから、最後に「VBoxManage modifyvm "Fedora" -hdb fourgig」によってVMへの再接続をする。

 以上の操作が完了すれば、writethroughディスク上にデータを保管できるようになっているはずで、ここに置かれたデータはVM状態の復元処理とは無関係に保持され続けることとなる。ただし、このディスク作成前の状態に復元させた場合は例外で、状態保存時に存在しなかったディスクとしてVirtualBoxにより削除されてしまう。また現行バージョンのVirtualBoxではwritethroughディスクを接続した状態のVMに対するスナップショット作成は行えないので、そうしたVMの状態保存をするには、いったんwritethroughディスクの接続を解除してから、スナップショット作成を実行し、その後で再度接続し直さなくてはならない。VirtualBoxの将来バージョンでは、writethroughディスクの有無がスナップショット操作に関係しないよう改善してもらいたいところである。

パフォーマンスの計測

 VirtualBoxには、ホスト側とVM側でのパフォーマンスおよびリソース使用量を計測する機能も設けられている。VirtualBoxがゲストおよびホストに対して計測可能なメトリックの一覧は、「VBoxManage metrics list」にて確認できるが、その一例を挙げると、CPU/Load/User(ゲストおよびVMでのユーザーモードにおけるプロセッサ使用時間の比率)、CPU/MHz(全プロセッサの平均速度)、RAM/Usage/Free(アプリケーション群が使用可能な物理メモリ量)、RAM/Usage/Used(メモリ上でVMプロセスの占めるサイズ)などが計測対象のメトリックだ。

 この機能の具体的な使用法としては「VBoxManage metrics setup -period 10 -samples 5 host」という形式のコマンドにて、データ収集の間隔(この場合は10秒)および保持させるサンプル数(この場合は5)を指定すればいい。ここでhostの代わりにVMの名前を指定すると、VM側が計測対象となる。またどのメトリックを計測するかの指定も可能で、例えば「VBoxManage metrics setup -period 10 -samples 5 "Fedora" CPU/Load/User, RAM/Usage/Used」と指定すると、Fedora VMにおけるプロセッサとメモリに関する使用状況を確認できる。

 収集したデータの取得はqueryコマンドにて行う。例えば「VBoxManage metrics query host CPU/Load/User」と指定すると、ホスト側のプロセッサ情報が表示されるが、その際にメトリック名を未指定にすると、すべてのメトリック情報が表示される。

 こうしたメトリック情報は、collectコマンドを用いた連続表示をさせることも可能で、例えば「VBoxManage metrics collect -period 3 -samples 5 "Fedora" CPU/Load/User,RAM/Usage/Used」というコマンドを実行すると、VM側のプロセッサとメモリに関する情報が3秒間隔で更新されるようになる。このモニタリングプロセスを停止させるには、Ctrl-Cキーを押し下げればいい。

まとめ

 VirtualBoxの構成は、GUIには使用頻度の高い機能だけを集めることでシンプル化し、より包括的な制御機能はCLIにて提示するようになっている。CLI操作はVirtualBoxのVM群をリモート管理する際に不可欠であるが、ローカルで使用する場合においても、パフォーマンス計測など一部の高度な機能にはCLIからしかアクセスできない。また複数のコマンドを繰り返し実行するタイプの作業は、CLIで一括処理させることで、かなりの負担を軽減できるはずである。例えば特定のVM状態への復帰を頻繁に実行するという開発者ならば、スナップショット復帰用のコマンド群を1つのスクリプトにまとめておけばいいだろう。いずれにせよVirtualBoxには強力なCLI機能が装備されているのであり、これを上手く使いこなせれば、作業効率を大幅に改善できるはずだ。

Linux.com 原文(2008年10月29日)