今年は仮想化技術の転機を迎える。米Intelと米AMDはそれぞれVT,Pacificaと呼ぶ仮想化支援命令をプロセッサに搭載し,VMwareやXenなどの仮想化ソフトも対応を始めている。今後も,I/O周りの仮想化が予定されているなど,目が離せない状況だ。

 今回から始まるこの連載では,これらのベースとなる技術について解説していく。仮想化ソフトの使い方や応用についても多少は触れるかもしれないが,あくまで技術の本質を追求するのが主眼である。VMwareやXenなどの仮想化ソフトがどのような仕組みで仮想化を行っているのか,プロセッサに仮想化支援命令を搭載するとどんな利点があるのか,などをきちんと説明していく予定だ。

 仮想化と一口に言っても,仮想化するもの,仮想化するレベルによって使われる技術が異なる。すなわち,「何を」「どこで」仮想化するかである。今回はまずこれらを分類し,どのような仮想化技術があるのかざっと眺めてみる。個々の技術については次回以降に詳しく解説するので,細かい部分にとらわれずに読み進めていただきたい。

異なるOS向けのアプリケーションを同時に動かす

 仮想化と言えば最初に思い浮かぶのが,異なるOS向けのアプリケーションを同時に動かすことではないだろうか。この「アプリケーションから見た仮想化」を実現するには,アプリケーションとOS(カーネル)とのインターフェースであるシステム・コールのレベルで互換性があればよい。この要件を満たす方法としては,(1)カーネル・エミュレータ,(2)PCエミュレータ,(3)仮想マシン・モニターによる論理分割,の3つが挙げられる。それぞれ代表的なソフトウエアをまとめたのが 表1だ。

表1 アプリケーションから見た仮想化技術の分類

種類 名前 説明
カーネル・
エミュレータ
Cygwin Windows上で動作するUnix環境。アプリケーションを動作させるには再コンパイルが必要
Solaris BrandZ Solaris上で動作する仮想Linux環境
FreeBSD jail FreeBSD上で動作する仮想FreeBSD環境
UserMode Linux Linux上で動作する仮想Linux環境
coLinux Windows上で動作する仮想Linux環境
PCエミュ
レータ
QEMU Linux,Windows,Mac OSなどで動作するPCエミュレータ。x86だけでなく,PowerPCやSPARCなどのシステムをエミュレートするものもある
Bochs SSE2やAMD64などのエミュレートも可能なPCエミュレータ
PearPC PowerPCエミュレータ。Windows/Linuxマシン上でMac OS Xなどを動作させることができる
仮想マシン・
モニター
Xen オープンソースの仮想マシン・モニター
VMware 米VMwareが開発した仮想マシン・モニター
lilyVM NetBSD,FreeBSD,Linuxを実行できる軽量な仮想マシン・モニター

(1)カーネル・エミュレータ
 カーネル・エミュレータは,アプリケーションが発行した特定のOS(のカーネル)向けのシステム・コールを受け取り,別のOS(ホストOS)のシステム・コールに置き換えるなどするソフトウエアである。別のOSのカーネルをエミュレートしていれば,そのOS向けのアプリケーションを動かすことができる。また同じカーネルの場合でも,デバッグが容易になる,アプリケーション実行環境の独立性が高まりセキュリティが強化される,といったメリットがある。

 カーネル・エミュレータは基本的にシステム・コールの付け替え(Linux-->Win32など)やchrootによるディレクトリの仮想化などで実装されている。表面的なインターフェースのマッピングが中心なので,ほかの仮想化の手法に比べて高速である。ただし,実装によっては単なるマッピングではなく,一部の機能がホストOSのカーネルのレベルで動作するものもある。高速化のためにカーネルの支援を受けるUserMode Linuxのskasモードや,固有ドライバを必要とするcoLinuxなどがその例である。これらはカーネル・エミュレータではあるが,実装上は仮想マシン・モニターに属する。

(2)PCエミュレータ
 PCエミュレータは,ハードウエアとしてのPCを完全にエミュレートするソフトウエアだ。ビデオ・カードやネットワーク・カードなどのデバイスはもちろん,CPUの命令セットさえも仮想化する。このおかげで,x86プロセッサを搭載したPC上でPower Macintosh用のOSやアプリケーションを動作させるといったことが可能になる。

 また,ハードウエアを完全に仮想化するので,仮想化ソフト上で動作させるOS(ゲストOS)に手を加えたりする必要もない。ゲストOSの独立性が高く,セキュリティ的に封じ込めが可能になるのもメリットの一つだ。

 半面,CPUの命令単位でエミュレートする非常にプリミティブな仮想化方式のため,オーバーヘッドが大きくパフォーマンスが低下するのは避けられない。この欠点をカバーするため,QEMUでは命令の変換の際にあらかじめ用意した命令列をつなぎ合わせたり,変換結果をキャッシュに格納したりして高速化を図っている。