VirtualBox

Oracle VM VirtualBox （オラクル ブイエム バーチャルボックス）とは、x86ならびにAMD64/Intel64にかかる仮想化ソフトウェアパッケージの一つ。当初はドイツのInnotekにより開発され、現在の開発は米国オラクルが行っている。

 概要 
既存のオペレーティングシステム（ホストOS）上にアプリケーションの一つとしてインストールされ、この中で追加のオペレーティングシステム（ゲストOS）を実行することができる。例えば、Microsoft Windowsが「ホストOS」として動作しているマシン上で、Linuxをゲストとすることができる。あるいは、Solarisが実行されているマシン上で、Microsoft Windowsを「ゲストOS」として実行することができる。

サポートされるホストOSはLinux、macOS、Microsoft Windows、そしてSolaris。また後述するようにソースコードが配布されているため、他のUnix系のオペレーティングシステムでも導入できる。例えばFreeBSDではportsで導入することができる。

ゲストOSとしてサポートされるのは、FreeBSD、Linux、OpenBSD、OS/2 Warp、Windows、Mac OS X Server、Solarisなど多岐にわたるが、x86/x64アーキテクチャのOSであれば基本的には動作する。

DesktopLinux.comの2007年の調査によると、VirtualBoxは、Linuxデスクトップ上でWindowsプログラム群を走らせる三番目に人気のあるソフトウェアパッケージであった。

 歴史 
当初はプロプライエタリライセンスで提供され、製品VirtualBoxのある版は、個人的あるいは評価の使用に対してのみ無料であり、「VirtualBox Personal Use and Evaluation Licence (PUEL)」が適用された。 2007年1月、数年の開発の後、VirtualBox OSE（Open Source Edition）が自由ソフトウェアとして、商用と個人的な使用のためにリリースされ、GNU General Public License (GPL) version 2が適用された。

VirtualBoxの開発元であったInnotekは、コネクティクスの仮想化製品（後にマイクロソフトにより買収）に対して、OS/2とLinuxの仮想化のサポートの開発や、OS/2への移植 にも貢献した。特に、InnotekはMicrosoft Virtual PCとMicrosoft Virtual Serverの両方に含まれる「付加」コードを開発し、これはホスト・ゲスト間の相互作用を大いに進歩させた。OS/2は拡張されたリングプロテクションが複雑であり、仮想化で実行するのは困難だった。

2008年2月にInnotekはサン・マイクロシステムズにより買収され、これに伴ってバージョン1.6より製品表記がSun xVM VirtualBoxに改められた。

その後、2010年1月にサンもオラクルに買収された。これに伴ってバージョン3.20より権利表記の変更が再び行われ、また製品表記がOracle VM VirtualBoxに改められ、現在に至っている。

 配布形態の変遷 
バージョン4.0以降のVirtualBoxはGNU General Public License (GPL) Version 2でライセンスされる完全なオープンソースソフトウェア (OSS) であるが、バージョン3.x以前ではプロプライエタリ版とOSS版の2つの配布形態があった。

プロプライエタリ版はバイナリのみの配布で、個人や教育あるいは評価目的の製品の利用は無料であった。商業目的のためのライセンスはサン及びオラクルから購入することができた。

OSS版はVirtualBox Open Source Edition (OSE) - オープンソース版と呼ばれ、GNU GPLの元に公開されている自由ソフトウェアであった。4.x以降はこちらがベースとなっている。プロプライエタリ版と比較すると、特許等の都合でソースが非公開となっている機能が欠けていた。

バージョン4.0よりOSS版にプラグイン機能が搭載され、機能の追加が可能となった。これに伴い、オラクルにより提供されていた上記二つの版は統合され、本体をオープンソースで、追加機能をプラグイン（ライセンスは提供元の都合でプロプライエタリでもオープンソースでも良い）として提供する形態となった。3.x以前でプロプライエタリ版のみに含まれていた機能はオラクルから「Oracle VM VirtualBox Extension Pack」として提供されている（詳細は後述）。

 機能 

VirtualBox本体により提供される基本機能は次の通り。

 スナップショット
 シームレス・モード
 クリップボード
 共有フォルダ
 シリアルデバイスと、システム間の切替えを支援するユーティリティ
 コマンドラインからの操作（GUIに追加）
 GUIでサポートされていない機能が一部ある。
 リモート・ディスプレイ（ヘッドレス：モニターのないホストマシンの場合に有用）

 64ビットゲスト
 AMD-VとVT-xのための、入れ子（ネステッド）・ページング
 3Dアクセラレーション（ゲストOSが32ビットのWindows XPおよびVistaの場合）

3Dアクセラレーションはバージョン2.0で追加され、3.0で実験的にDirectX 9のサポートがなされている。ただし、では32ビットのWindows XPおよびVistaゲスト環境に限定されており、64ビット環境ではサポートされない（Windows 7の64bit版から起動した場合はWindows XPのゲスト環境でDirectX 9が一応動作する）。また、4.0系まではWindowsゲスト環境におけるビデオドライバがWDDMのものではないため、Windows Vista以降のDesktop Window Managerによるデスクトップコンポジション機能やAeroテーマを動作させることはできなかったが、4.1系から実験的にWDDMドライバサポートが開始されている。

 エミュレートされる環境 
複数のゲストOSを管理・起動することができ、同時に起動することもできる。それぞれのゲストOSは、独立して開始、稼働の一時停止、起動したままの状態を保っての保存と復帰（後述のGuest Additions(ゲストがXP以降)を入れないと時間同期の問題が生じる場合がある）、終了することができる。

複数のオペレーティングシステムを同時に走らせる場合、使用可能なメモリ量が重要な要素となる。理論上の割り当て限界はホストOS側のメモリ容量までとなるが、実際はシステムやホストOS側で動作しているアプリもあるので、そのぶんを計算して割り当てる必要がある。割り当て論理CPUコア数やメモリ割り当て容量は仮想マシン停止中であれば容易に調整可能である。

※ただしWindows XPと2000の場合、OSインストール後はCPUコア数は通常の方法では変更できないので、OSインストール時にあらかじめCPUコア数を設定してインストールを行うのが最も簡単な方法である。（ちなみにインストール後の変更には適切なドライバのインストールやboot.iniの編集などいくらかの手間のかかる方法で行う必要がある。）

 ハードウェアエミュレーション 
VirtualBoxは、ハードウェアによる仮想化支援機能として、VT-x（インテル）と、AMD-V（AMD）への対応を含む。対応当初はデフォルトでどちらも有効となっていなかったが、現在のバージョンで提供される機能の一部（x86_64対応、マルチコア対応）には、これらの仮想化支援機能を必要とするものがある。バージョン5.0よりKVMが選択可能になり、Linuxにおいてハードウェアエミュレーションのオーバーヘッドが削減可能になった。なお、VirtualBox用のチップセットのエミュレーションにはインテルの82441FXチップセットが用いられている。

 ハードディスク 
ハードディスクドライブは、通常「仮想ディスクイメージ (Virtual Disk Images)」と呼ばれる他の仮想化ソリューションとは互換性のない特別なコンテナフォーマットとしてエミュレートされる。これらは、ホストOS上のシステムファイル（拡張子 .vdi）として格納される。別の方法として、VirtualBoxはiSCSIターゲットとの接続が可能で、それらを仮想ハードディスク群として使用することが出来る。

この他、他の仮想マシンソフトウェアで用いられる、vmdk形式 (VMware)、vhd形式 (Microsoft Virtual PC)、hdd形式 (Parallels) などの仮想ディスクイメージにも対応する。ただし、これらディスクイメージは本来VirtualBox向けのフォーマットではない為、フォーマットのバージョンとVirtualBoxのバージョンの対応など、利用に当たっては互換性の面における注意が必要であるが、有志によりコンバートユーティリティがいくつか開発されており、（当然無保証となるが）これらの仮想ディスク形式において相互変換可能な環境がそろいつつある。

 光学ドライブ 
CDやDVDドライブとしてISOイメージが使用できる。例えば、LinuxディストリビューションのDVDイメージをダウンロードして、直接VirtualBoxで使用することが出来る。その場合、ISOイメージをCD-RやDVD-RWといった物理メディアに焼き込む必要がない。また、物理的ディスクを仮想マシンから直接的にマウントすることも可能である。

 グラフィック機能 
標準で16MBのVRAMを搭載するVESAカードをグラフィック機能として提供する（VRAMの値は128MBを上限として調節可能）。ゲストOSとしてWindows XP以降、macOS、Linux あるいはSolarisを使用する場合、Guest Additionsとして提供される追加のグラフィック・ドライバにより、描画性能の向上と機能の追加が可能である(VRAMは128MB推奨)。例として、ホストOS上で仮想マシンのウインドウサイズを変更した場合、ゲストOSの解像度が動的に変更される。また、バージョン2.1以降においては、追加のグラフィック・ドライバにより、OpenGLやDirectX 9などの3D描画に対応する（停止中に3D/2Dアクセラレーションフラグを有効にする必要がある）。

 ネットワーク機能 
イーサネットアダプタとして、AMD PCnet-PCI II (Am79C970A), AMD PCnet-FAST III (Am79C973), Intel PRO/1000 MT Desktop (82540EM), Intel PRO/1000 T Server (82543GC), Intel PRO/1000 MT Server (82545EM) のいずれかを仮想化する。これらの仮想化されたアダプタによる外部との接続手段として、NAT（ホストOSによるNAPT機能）、ブリッジアダプタ（ホストOSの物理インタフェースとのブリッジ機能）、内部ネットワーク（ゲストOS同士を接続する内部的なネットワーク）、ホストオンリーアダプタ（ホストOS上の仮想Ethernetアダプタと直接的に接続する）が提供される。
新規作成される仮想マシンは、いずれかのアダプタとNATの組み合わせが設定される。ゲストOS上のアプリケーションは、これによりホストOSを経由して外部との通信が可能となる。NATを提供するホストOSは、一般的なブロードバンドルータと同様の動作を行う。

バージョン5.0から準仮想化機能が搭載され始め、準仮想化ネットワーク (virtio-net) が選択可能になった。この仮想ネットワークインタフェースを利用することで、VirtualBoxがvirtio-netのドライバを持つOSのカーネルと協調してVirtualBox上のゲストOSと物理ネットワークインタフェースの間で直接データを受け渡しすることが可能になり、ネットワークにおけるエミュレーションのオーバーヘッドを削減することが可能になる。

 オーディオ機能 
オーディオ・カードとして、VirtualBoxは、Intel HDオーディオ、ICH AC'97（デフォルト）、SoundBlaster 16カードのいずれかを仮想化する（ただし、Intel HDオーディオは、対応するゲストOSに制限がある）。

 転送 
7.0以降はデフォルトでUSB 2.0 コントローラ （EHCI）、USB 3.0 コントローラ （xHCI）をサポートするようになった。

 追加の機能 
バージョン4.0より、Extension Packageと呼ばれる機能拡張プラグインが導入された。これは、4.0よりVirtualBox本体がGPLライセンスとなったために、プロプライエタリソフトウェアによる機能を標準で実装することができなくなったために設けられたものである。

Oracleから「Oracle VM VirtualBox Extension Pack」と呼ばれる機能拡張プラグインを配布しており、これにより以下の機能が提供される。

 Remote Desktop Protocol（RDP）による遠隔制御機能（マイクロソフトおよびシトリックスにより開発された、プロプライエタリな遠隔制御プロトコル。つまりWindowsのリモートデスクトップクライアントやrdesktopソフトウェアから接続することが可能）
 ホストのウェブカメラのパススルー機能（ゲスト側からホストのウェブカメラを透過的に使用できるようにする機能、バージョン4.3から追加）
 LinuxホストにおけるPCIバスパススルー機能（バージョン6.0まで。ゲスト側からPCIデバイスを透過的に使用可能にする機能、実験的機能）
 IntelカードによるPXEブート機能
 シームレスモード （ホストOSとゲストOSのデスクトップの操作を統合する機能）
 ゲスト仮想ディスクの暗号化（バージョン5.0から追加）

初回のみ別途ダウンロード及びインストールが必要。一度インストールすればVirtualBox本体をアップデートしたあとの初回起動時にExtension Packのアップデートをするか聞かれ、応じればそのままアップデート作業に入るため別途ダウンロードの必要はない。またインストール後はパッケージを削除するか聞かれるので、応じれば自動的に削除される仕様となっている。

 phpVirtualBox 
phpVirtualBoxとは、VirtualBoxをWebブラウザで操作するためのウェブサービスソフトウェア。その名のとおりサーバサイトはPHPで記述されている他、インタフェースまわりにAjaxが用いられている。動作にはPHP動作をサポートするWebサーバ、PHP、VirtualBoxが必要。GUIでできることはほぼすべてできるようになっている。

 技術解説 
VirtualBoxはIntel VTかAMD AMD-Vかいずれかのハードウェア仮想化をサポートするCPU上で効率的かつ安全な仮想化を実現する。
その一方で、これら2つの仮想化技術のいずれもサポートしていないCPUについてはソフトウェア的な仮想化を行う（バージョン6.0まで。6.1からはハードウェア仮想化必須）。
高性能なソフトウェア仮想化を実現するために、VirtualBoxはゲストコードの実行時分析や実行時改変を含む複雑なメカニズムを実装する。
性能上の大きな問題となるのは、最高の特権レベルであるリング0で実行されるべき特権命令のエミュレーションである。
ハードウェア仮想化を使用しない場合、ゲストコードをリング0で実行できないので代替実行手段が必要になる。
特権命令が不適切な特権レベルで実行される度に発生するトラップを捉えて対応するナイーブな対策は、性能低下が著しく現実的ではない。
そこで、VirtualBoxは実行時に必要に応じてリング0で実行されるべきコード片を分析し、特権命令をエミュレーション用コードで置き換えた効率的に実行可能なコード片を用意する。
この改変済みコード片は再利用可能なので、実行時コード改変のコストは多くの状況で償却し、全体的な性能向上が実現する。

macOS版では、ネットワークブリッジ（ホストインタフェース）がサポートされていなかったが、バージョン2.0でサポートされた。

と干渉し、起動しなくなることがある。