エンジニアなら知っておきたい仮想マシンのしくみ

第2回Linux KVMで知る仮想マシンの概要

第1回では、仮想マシンとは何か、その生い立ちや機能について簡単に紹介しました。今回から、x86システム仮想マシンがどのように実現されているのかを解説していきたいと思います。

x86システム仮想マシンには、VMwareによる仮想化製品をはじめHyper-V、Linux KVM、Xenなどがあることは、すでにご紹介したとおりです。この連載では、その中でも最近とくに注目を浴びているLinux KVMを中心に、x86仮想マシンの実装を見ていきましょう。今回は、Linux KVMの概要、および構成するソフトウェアについて解説します。

コンピュータを構成する3大要素

仮想マシンを理解するために、まず実際のコンピュータがどのような構成になっているかを知っておくと良いでしょう。コンピュータは、CPU、システムメモリ、I/Oデバイスの3つの要素から構成されています。

図1 コンピュータを構成する3大要素
図1 コンピュータを構成する3大要素

CPU

CPU(中央演算装置)は、プログラムを実行するための回路です。CPUはプログラムを解析して、命令に従って演算したり、CPUのまわりにあるハードウェアとデータを入出力したりします。

システムメモリ

CPUが直接データの読み書きできるメモリであり、実行中のプログラムやデータを記憶するメモリをシステムメモリ(主記憶装置)と呼びます。

I/Oデバイス

CPUの周辺に接続されたハードウェアをI/Oデバイス(入出力装置)と呼びます。たとえばキーボードやマウス、ビデオアダプタ、ディスクやネットワークのコントローラなど、いろいろな種類のI/Oデバイスが存在します。

これら3要素は、仮想マシンの世界でも通用します。つまり仮想マシンとは、これらの要素をひとつひとつソフトウェア的に実現するプログラムを集めたものだと言えます。では、これらの要素がLinux KVMでどのように実現されているのかを見ていきましょう。

Linux KVMとは

これから本連載で扱っていくLinux KVMは、Kernel-based Virtual Machineの略で、Linux自体を仮想マシンの実行基盤として機能させるタイプのソフトウェアです。

Linux KVMは、Linux用のカーネルモジュールとして実装されており、OSが持つメモリ管理やプロセススケジューリングの機能などを積極的に利用します。このため、一般的には仮想マシンソフトウェアが個別に実装しているスケジューラなどの実装が簡潔になっている(Linuxのスケジューラを利用しているため、Linux KVM自体に実装されているコードは最低限となっている)といった点も特徴的です。

Linux KVMは2006年にQumranetが中心となり開発を開始したオープンソースソフトウェアであり、2007年にはLinuxカーネルのソースツリーにマージされました。さらに2008年にはRed HatがQumranetを買収し、以後RedHatからLinux KVMを活用したRed Hat Enterprise Virtualization (RHEV)やRed Hat Enterprise Linux 6(RHEL6)などがリリースされています。

このような状況から考えて、Linux KVMは現在もっとも勢いがあるオープンソースの仮想マシンソフトウェアと言っても過言ではないでしょう。

Linux KVMの動作要件

Linux KVMを動作させるためには、Linuxが動作するハードウェアであることに加え、下記の条件を満たす必要があります。

  • 仮想化支援機能(Intel VTもしくはAMD-V)を搭載したプロセッサ
  • プロセッサの仮想化支援機能に対応したBIOSを持つマザーボード
  • ホストOS、ゲストOSを実行するために十分な容量のシステムメモリ
  • 64bit対応プロセッサを強く推奨(ディストリビューションによっては32bit非対応)
  • Intel EPT/AMD RVI搭載プロセッサの利用を強く推奨

このように、仮想化支援機能を搭載したプロセッサおよびマザーボードに注意すれば、Linux KVMの動作の最低動作要件を満たすことはそれほど難しくありません。Linux KVMはLinux対応のハードウェアをほぼそのまま使えますので、Linuxがハードウェアを認識していればほぼ「利用できる」と考えて差し支えありません。仮想化支援機能が利用でき、かつLinuxが動作するコンピュータであれば、ネットブックなどのノートパソコンでも仮想マシンを実行できます。

Linux KVMを構成するソフトウェア

Linux KVMは、複数のプログラムの組み合わせで仮想マシンの機能を実現しています。Linuxカーネルはもちろんのこと、KVMのカーネルモジュール、そしてqemu-kvmと呼ばれるユーザモードのプログラムで構成されています。

Linux KVMカーネルモジュール

Linux KVMのカーネルモジュールには、ユーザモードのプロセスの要求に応じて、仮想マシンにメモリを割り当てて、実行する機能を持っています。Linux KVMカーネルモジュールはIntel VTやAMD-Vの仮想化支援機能を使用して仮想マシンを作成し、その仮想マシン環境上に作り出した仮想CPU上でプログラムを実行する機能を持っています。これは、コンピュータの3大要素のうちCPUに相当する、と考えればよいでしょう。

qemu-kvm

ユーザモードプロセスとして動作するqemu-kvmには、x86システムを構成するI/Oデバイスのエミュレータ、つまりCPUの周辺にあるI/Oデバイスの動きを再現するソフトウェアが含まれています。

たとえば、ゲストOSが画面にメッセージを表示しようとすると、KVMカーネルモジュールがqemu-kvmに「ゲストOSが何かしようとしている」と伝えます。qemu-kvmは、ゲストOSが何をしようとしているのかを判断して、本物のビデオアダプタのように振る舞い、結果をゲストOSに返します。qemu-kvmには、ビデオアダプタだけでなく、Linux KVMによる仮想マシン上で使われる一通りのI/Oデバイスエミュレータが含まれています。

また、qemu-kvmには、物理マシンが持っているシステムメモリから、仮想マシンが必要とする容量のメモリを確保する役割も持っています。このため、コンピュータの3大要素のうちシステムメモリ、I/Oデバイスに相当する機能を提供していると言えます。

図2 Linux KVMのしくみ
図2 Linux KVMのしくみ

QEMUとは

Linux KVMで使われるqemu-kvmは、Linux KVMが開発される前から存在するPCエミュレータのひとつであるQEMUがベースとなっています。QEMUはオープンソースで開発されている仮想マシンソフトウェアであり、x86システムをはじめ、いろいろな種類のシステムの仮想マシンとして利用できます。

QEMUには、x86システムを構成するために必要となる周辺ハードウェアのほか、x86プロセッサ自体がソフトウェア的に実装されておりカーネルレベルのデバッグなどにも利用しやすいことから、OSの開発環境としても利用されることも多いようです。

QEMUとkqemu、KVMの違い

QEMUは原則としてCPUをソフトウェア的に実装した仮想マシンソフトウェアですが、CPUの処理を全てソフトウェア的に再現すると、性能が劇的に低下してしまいます。これは、本来なら実際のCPU上では1つの命令として実行できるはずのものが、ソフトウェアCPUを使うと何十もの命令に置き換えられて実行されることになるためです。

この問題を回避するため、ただのソフトウェアCPUではなく、実CPUに仮想マシン上のプログラムを直接実行させることで、仮想マシンの実行速度を向上させる改善が行われてきました。

kqemuによる高速化

kqemuは、QEMUのソフトウェアCPU機能を高速化するもので、KVMと同様カーネルモジュールとして実装されたものです。QEMUのソフトウェアCPUを使う代わりにkqemuカーネルモジュールを用いることで、実CPUで仮想マシン上のプログラムを直接実行できるようになります。

kqemuはIntel VTやAMD-Vが無くても、ある程度高速に仮想マシンを実行できるものですが、x86プロセッサの命令セットの都合上、ソフトウェアだけで仮想マシンを実現することは非常に難しく、結果kqemuは複雑なプログラムとなっています。

Linux KVMによるハードウェア機能の活用

その後、Intel VTやAMD-Vなどの仮想化支援機能がプロセッサに搭載されるようになりました。これらの仮想化支援機能を利用すると、kqemuがソフトウェア的に行っていた複雑な処理がハードウェアレベルで行えるようになりました。このため、これら仮想化支援機能を活用したKVMカーネルモジュール、および対となるqemu-kvmが開発されました。

図3 QEMUの高速化の歴史
図3 QEMUの高速化の歴史

Linux KVMの登場、そしてその後の度重なる改良の結果、性能・開発コスト面でメリットが少なくなったkqemuの開発は中断されました。このため、最新のQEMUでサポートされるのは、QEMUのソフトウェアCPUによる実行、およびLinux KVMによる実行のどちらかとなっています。

QEMU由来の仮想マシンソフトウェア

QEMUの成果を活用したオープンソースの仮想マシンソフトウェアは、Linux KVM以外にも複数存在します。Xenでも同様に仮想マシンのハードウェアエミュレータとしてqemu-dmと呼ばれるプログラムが含まれており、仮想マシンを完全仮想化で実行するために用いられています。そのほか、Sun Microsystems(現Oracle)が提供する仮想マシンソフトウェアであるVirtualBoxにも、いくつかQEMUに由来するハードウェアエミュレータが含まれています。

次回は

今回はLinux KVMの概要について簡単に解説しました。
しかし、まだ「Linux KVMを未体験でイメージが沸かない」といった方もいらっしゃると思いますので、次回はLinux KVMの導入例を簡単に紹介したいと思います。お楽しみに。

おすすめ記事

記事・ニュース一覧