Linux ハイパーバイザーの徹底調査

KVM と Lguest の紹介

最近 Linux® に対して行われた革新のなかで最も重要なものの 1 つとして挙げられるのは、Linux がハイパーバイザー (他のオペレーティング・システムのためのオペレーティング・システム) へ変身したことです。この革新により、Linux をコアに使用した多くのハイパーバイザー・ソリューションが登場しています。この記事では、ハイパーバイザーの背後にある概念と、Linux をプラットフォームとして使用する具体的なハイパーバイザーとして KVM と Lguest の 2 つを探ります。

M. Tim Jones (mtj@mtjones.com), Consultant Engineer, Emulex Corp.

M. Tim JonesM. Tim Jones は組み込みソフトウェアのエンジニアであり、『Artificial Intelligence: A Systems Approach』、『GNU/Linux Application Programming』(現在、第 2 版です) や『AI Application Programming』(こちらも現在、第 2 版です)、それに『BSD Sockets Programming from a Multilanguage Perspective』などの著者でもあります。技術的な経歴は静止軌道衛星用のカーネル開発から、組み込みシステム・アーキテクチャーやネットワーク・プロトコル開発まで、広範にわたっています。また、コロラド州ロングモン所在のEmulex Corp. の顧問エンジニアでもあります。


developerWorks 貢献著者レベル

2009年 5月 31日

ハイパーバイザーがオペレーティング・システムに対して果たす役割は、オペレーティング・システムがプロセスに対して果たす役割とおおよそ同じです。ハイパーバイザーは、仮想マシンを実行するための独立した仮想ハードウェア・プラットフォームを提供し、それによってそのベースにあるマシンにフルアクセスしているかのような幻想を与えます。しかし、すべてのハイパーバイザーがまったく同じというわけではありません。これは良いことですが、そうなったのは柔軟性のある Linux がハイパーバイザーのベースとして選ばれているからです。この記事では最初に仮想化とハイパーバイザーについて簡単に紹介した後、Linux をベースとした 2 つのハイパーバイザーについて詳しく見て行きます。

仮想化とハイパーバイザー

まずは少し時間を割いて、仮想化がなぜ重要なのか、そしてハイパーバイザーが果たす役割について説明します (この両方についての詳細は、「参考文献」のセクションを参照してください)。

この記事で説明する仮想化とは、そのベースにある物理ハードウェアを隠蔽し、複数のオペレーティング・システムがハードウェアを透過的に使用および共有できるようにするプロセスのことです。このようなアーキテクチャーは一般にプラットフォーム仮想化として知られています。典型的な階層型アーキテクチャーでは、プラットフォーム仮想化を提供する層はハイパーバイザーと呼ばれます (仮想マシン・モニター (VMM: Virtual Machine Monitor) と呼ばれることもあります)。ゲスト・オペレーティング・システムのそれぞれのインスタンスは仮想マシン (VM: Virtual Machine) と呼ばれます。ハードウェアはこれらの VM の専用ハードウェアとして見えるように仮想化されるためです。図 1 に、この階層型アーキテクチャーの単純な形を示します。

図 1. 共通のハードウェアを仮想化する単純な階層型アーキテクチャー
共通のハードウェアを仮想化する単純な階層型アーキテクチャー

プラットフォーム仮想化の利点は数多くありますが、なかでも米国環境保護庁 (EPA) の報告による興味深い統計が示す利点は際立っています。サーバーとデータ・センターのエネルギー効率に関する EPA の調査では、実際に使用されたサーバー能力は約 5% だけで、残りの時間、サーバーは休止状態であることが判明しました。1 台のサーバーで複数のプラットフォームを仮想化するとサーバーの使用率を改善できますが、それにも増してサーバー数を削減できるメリットは非常に大きいものがあります。なぜなら、サーバーの数が減ると、サーバーの設置に必要なスペースや、電力消費量、冷却設備 (エネルギー・コストの削減)、そして管理コストも減ることになるからです。さらにハードウェアが少ないということは、信頼性も高くなることを意味します。全体として見ると、プラットフォーム仮想化は技術上のメリットをもたらすだけでなく、コストやエネルギーの面でもメリットをもたらします。

図 1 に示されているように、ハイパーバイザーはそのベースにあるマシンを仮想化するソフトウェアの層です (場合によっては、プロセッサーをサポートすることもあります)。仮想化ソリューションはすべて同じというわけではないので、各種の仮想化スタイルについて詳しく学ぶには「参考文献」を参照してください。プロセスという本来の主題に関して言えば、オペレーティング・システムはプロセスに対し、ベースにあるマシン・リソースへのアクセスを仮想化します。ハイパーバイザーもこれと同じことを行いますが、仮想化はプロセスに対してではなく、ゲスト・オペレーティング・システム全体に対して行います。

ハイパーバイザーの分類

ハイパーバイザーは 2 つの異なるタイプに分類することができます。一方はハードウェア上で直接動作するハイパーバイザーで、もう一方は、ハードウェア上で動作する別のオペレーティング・システムのコンテキストで動作するハイパーバイザーです。前者のハイパーバイザーの例には、KVM (Kernel-based Virtual Machine) があります (KVM 自体がオペレーティング・システム・ベースのハイパーバイザーです)。後者のハイパーバイザーの例としては QEMU、WINE などが挙げられます。


ハイパーバイザーの要素

前のセクションで説明したように、ハイパーバイザーは (タイプによらず) マシン・ハードウェアをそのゲストから抽象化する単なる階層型アプリケーションであり、それぞれのゲストからは実際のハードウェアではなく、VM が見えるようになります。このセクションでは、ハイパーバイザーの内部構造と、VM (ゲスト・オペレーティング・システム) に対してハイパーバイザーがどのように見えるかを全体的に説明します。

大まかに言えば、ゲスト・オペレーティング・システムを起動するためにハイパーバイザーに必要なのは、起動対象のカーネル・イメージ、構成 (IP アドレスや使用するメモリーの量など)、ディスク、およびネットワーク・デバイスです。ディスクとネットワーク・デバイスは通常、マシンの物理ディスクとネットワーク・デバイスにマッピングされます (図 2 を参照)。その他に必要となるのは、ゲストを起動し、その後ゲストを管理するための一連のゲスト・ツールです。

図 2. 仮想ハイパーバイザーでの最小限のリソース・マッピングの例
仮想ハイパーバイザーでの最小限のリソース・マッピングの例

単純なハイパーバイザーのアーキテクチャーでは、ゲスト・オペレーティング・システムをホスト・オペレーティング・システムと同時に実行できるようにするためのグルー・コードを実装します。この機能には、図 3 に示すいくつかの特定の要素が必要です。まず、ユーザー空間のアプリケーションとカーネル関数の橋渡しをするシステム・コールと同じように、通常はゲストがホスト・オペレーティング・システムに要求を行えるようにするハイパーコール層があります。入出力 (I/O) はカーネルで仮想化することも、ゲスト・オペレーティング・システムのコードによって支援することもできます。割り込みはハイパーバイザーが独自に操作し、実際の割り込みを処理するか、あるいは仮想デバイスに対する割り込みをゲスト・オペレーティング・システムにルーティングする必要があります。ハイパーバイザーはまた、ゲスト内で発生したトラップあるいは例外を処理する必要もあります (ゲスト内で障害が発生するとゲストの停止という結果になりますが、それによってハイパーバイザーやその他のゲストが停止することはありません)。ハイパーバイザーの中核となる要素はページ・マッパーです。このページ・マッパーによって、ハードウェアと特定のオペレーティング・システム (ゲストまたはハイパーバイザー) のページが対応するようになります。そして最後に、ハイパーバイザーとゲスト・オペレーティング・システムとの間で制御を転送するために高度なスケジューラーが必要になります。

図 3. Linux ベースのハイパーバイザーの略図
Linux ベースのハイパーバイザーの略図

Linux ハイパーバイザー

この記事では、2 つの Linux ベースのハイパーバイザー・ソリューションを検討します。最初に取り上げる KVM は Linux カーネルに初めて統合されたハイパーバイザー・モジュールで、完全仮想化を実装します。次に取り上げる Lguest は、驚くほどわずかな変更で準仮想化 (あるいは疑似仮想化) を実現する実験的なハイパーバイザーです。

KVM

KVM は、x86 ハードウェア上の Linux カーネルに常駐する仮想化インフラストラクチャーです。KVM はネイティブ Linux カーネル (2.6.20) に統合された初のハイパーバイザーであり、新興企業 Qumranet の Avi Kivity 氏によって開発されました。同社は現在、Red Hat が所有していますが、KVM の保守は引き続き彼が行っています。

x86 仮想化を実現するこのハイパーバイザーは、PowerPC® および IA64 へのポーティングが進行中です。さらに、KVM は最近になって対称型マルチプロセッシング (SMP) ホスト (およびゲスト) のサポートを追加し、物理サーバーの間でゲスト・オペレーティング・システムをマイグレーションできるようにするライブ・マイグレーションなどのエンタープライズ・レベルの機能もサポートします。

KVM はカーネル・モジュールとして実装されるため、Linux はモジュールをロードするだけでハイパーバイザーになることができます。KVM は、ハイパーバイザー命令をサポートするハードウェア・プラットフォーム (Intel® VT (Intel Virtualization Technology) や AMD-V (AMD Virtualization) オファリングなど) で完全仮想化を提供します。また、Linux および Windows® を含め、準仮想化されたゲストもサポートします。

この技術は 2 つのコンポーネントとして実装されます。そのうちの 1 つは KVM ローダブル・モジュールです。このモジュールは、Linux カーネルにインストールされると、仮想化ハードウェアの管理を行い、その機能を /proc ファイルシステムを介して公開します (図 4 を参照)。もう 1 つのコンポーネントは PC プラットフォームのエミュレーターで、これは QEMU の変更バージョンによって提供されます。QEMU はユーザー空間のプロセスとして実行され、ゲスト・オペレーティング・システムからの要求をカーネルと調整します。

図 4. KVM ハイパーバイザーの概要
KVM ハイパーバイザーの概要

新しいオペレーティング・システムが (kvm という名前のユーティリティーによって) KVM 上で起動されると、そのオペレーティング・システムはホスト・オペレーティング・システムのプロセスとなるため、他のプロセスと同じようにスケジューリングすることができます。ただし、Linux での従来のプロセスとは異なり、ゲスト・オペレーティング・システムはハイパーバイザーによって (カーネルおよびユーザー・モードとは独立した)「ゲスト」モードとして識別されます。

それぞれのゲスト・オペレーティング・システムは /dev/kvm デバイスによってマッピングされ、ホスト・カーネルの物理アドレス空間にマッピングされる固有の仮想アドレス空間を持ちます。前述したように、KVM はそのベースにあるハードウェアの仮想化サポートを利用して完全 (ネイティブ) 仮想化を行います。I/O 要求はホスト・カーネルにより、ホスト (ハイパーバイザー) で実行される QEMU プロセスにマッピングされます。

KVM は Linux のコンテキストではホストとして動作しますが、そのベースにあるハードウェアの仮想化サポートを利用すれば、多数のゲスト・オペレーティング・システムをサポートすることができます。サポートされているゲストのリストについては、「参考文献」を参照してください。

Lguest (旧称 lhype)

IBM オーストラリアの Rusty Russell 氏によって開発された Lguest ハイパーバイザーは、全く異なる仮想化の手法を取ります。Lguest は、任意のオペレーティング・システムを実行するための完全仮想化を行う代わりに、Lguest 対応の x86 Linux ゲストに対して軽量の準仮想化 (別名、Linux-on-Linux 仮想化) を行います。つまり、ゲスト・オペレーティング・システムは、ゲスト・オペレーティング・システム自身が仮想化されていることを認識するので、この認識によってパフォーマンスの向上がもたらされます。ただし Lguest は、KVM で必要とされていたプラットフォーム仮想化を行う QEMU がなくても、かなりのパフォーマンスを達成します。さらに、Lguest の手法はコードの要件全体を単純化するので、ゲストとホスト・オペレーティング・システムでは薄い層を必要とするだけです。ここからは、こうして準仮想化のために Lguest によって行われる変更点について詳しく調べ、Lguest 環境のアーキテクチャーの概要について説明します。

図 5 に示されているように、ゲスト・オペレーティング・システムには Lguest コードの薄い層 (定義の上では、準仮想化) があり、このコードが多数のサービスを提供します。この薄い層の最上位レベルには、起動中のカーネルが仮想化されているかどうかを判断するコードがあります。また、ハイパーコールによって特権操作をホスト・オペレーティング・システムにルーティングするための抽象化層もあります (paravirt_ops により実装)。このルーティングの一例として、ゲストは割り込みを無効にできないため、割り込みの要求はホスト・オペレーティング・システムで実行されます。他にも、ゲストに対するデバイス抽象化を実装するバス、コンソールを実装する一連の単純なドライバー、仮想ブロック・ドライバー、そして仮想ネットワーク・ドライバー (他のゲストとの通信を許可) もあります。

図 5. Lguest による x86 準仮想化の構成
Lguest による x86 準仮想化の構成

カーネル側は、lg.ko というローダブル・モジュールとして実装されます。このモジュールにはホスト・カーネルに対するゲスト・オペレーティング・システムのインターフェースが含まれます。このモジュールの重要な要素としては、ゲスト・オペレーティング・システムのコンテキストを実行時に切り替えるためのメソッドを実装するスイッチ機能があります。また、このモジュールには /proc ファイルシステムのコード (/dev/lguest 用) も実装されており、このコードがハイパーコールを含め、カーネルとドライバーに対するユーザー空間のインターフェースを実装します。さらに、シャドウ・ページ・テーブルを使用して x86 セグメントを管理することにより、メモリーをマッピングするためのコードもあります。

そして、カーネルの Documentation サブディレクトリーには新しいゲスト・オペレーティング・システムのインスタンスを起動するためのランチャー・ユーティリティー (lguest) が含まれます。このファイルはユーティリティーと文書化という 2 つの役割を果たします。

Rusty Russell 氏によって開発された Lguest は 2.6.23 (2007年10月) から主流のカーネルとなっていて、同氏により保守されています。Lguest を構成するコードは、ユーザー空間ユーティリティーも含め、約 5000 行です。Lguest は (伝えられているところによると) 単純ですが、正真正銘の準仮想化を提供します。その一方で、この単純さには制約も伴います。例えば、Lguest が仮想化するのは Lguest 対応のゲスト・オペレーティング・システムのみで、現在は x86 アーキテクチャー専用です。このような制約はあるものの、Lguest は Rusty のコードを喜んで学ぼうという人には誰でも使用できる興味深い仮想化手法となります。


Linux ハイパーバイザーの利点

Linux をコアとしたハイパーバイザーの開発には、まさに実際的な利点があります。Linux をベースとしたハイパーバイザーの最も明らかな利点は、Linux は着実に進化していること、そしてそのために大量の作業が行われていることです。一般的な最適化からバグの修正、スケジューリング、そして異なるプロセッサー・アーキテクチャーをサポートするためのメモリー管理の技術革新に至るまで、Linux プラットフォームは絶えず進化を続けています (Salisbury の John の言葉を引用すると、「巨人の肩の上に立っている」ということです) 。

カーネル・モジュールの追加によって Linux カーネルをハイパーバイザーに変換できることを KVM が証明したのは、それほど昔のことではありません。Lguest ハイパーバイザーはこれを一歩進め、準仮想化という制約によってハイパーバイザー・ソリューションをさらに最小化しました。

Linux をプラットフォームとして使用する利点としてもう 1 つ興味深いのは、プラットフォームをハイパーバイザーとしてだけでなく、オペレーティング・システムとしても利用できることです。そのため、複数のゲスト・オペレーティング・システムを Linux ハイパーバイザー上で実行する一方、従来の他のアプリケーションを Linux オペレーティング・システム上で実行することが可能になります。つまり、(監視アプリケーションやハイパーバイザー管理アプリケーションが必要とされる場合に) 新しい API (Application Programming Interface) を備えた新しいプラットフォームのことを気に病むことなく、アプリケーションの開発には標準的な Linux プラットフォームを使用できるということです。標準プロトコル (TCP/IP) やその他の便利なアプリケーション (Web サーバー) はゲストと同時に使用することができます。KVM の説明のなかで記載した図 4 を思い出してください。ゲスト・オペレーティング・システムの他に、kvm という修飾子が付いた QEMU があったはずです。標準プロセスであるこの kvm-QEMU が、ハイパーバイザーとしての Linux を背後で支えています。KVM はプラットフォーム仮想化に QEMU を利用し、Linux をハイパーバイザーとして使用することで、ゲスト・オペレーティング・システムが他の Linux アプリケーションと協調して動作するという概念に素早く対応しました。


まとめ

現在進められているハイパーバイザーの開発には、明らかな事実が 1 つあります。それは、ハイパーバイザーが新しい競争分野であるということです。30 年前はオペレーティング・システムに焦点が置かれ、少数のオペレーティング・システムが優位を占めていました。現在、この競争の場はハイパーバイザーに移り、ハイパーバイザーという分野では Linux が果たす明確な役割があります。

ハイパーバイザーとしての Linux に対して、批判がないわけではありません。その批判のほとんどは、肥大化の論争に端を発するものです。組み込みドメインにもこれと同じ論争が持ち込まれたのは、そう何年も前の話ではありません。それでも現在、組み込みオペレーティング・システムとしての Linux は最強の座にあり、その地位を保ち続けています。しかしだからといって、ハイパーバイザーとしての Linux に対する批判のすべてが妥当でないというわけではありません。優れた普遍的なオペレーティング・システムをさらに柔軟にするためには、おそらくアーキテクチャーの変更が多少は必要になるでしょう。

参考文献

学ぶために

製品や技術を入手するために

  • developerWorks から直接ダウンロードできる IBM ソフトウェアの試用版を使用して、Linux で次の開発プロジェクトを構築してください。

議論するために

  • My developerWorks コミュニティーに加わってください。自分個人のプロファイルとカスタム・ホーム・ページを作成して、自分の興味に合わせて developerWorks をカスタマイズしたり、他の developerWorks ユーザーと対話したりできます。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Rational
ArticleID=405338
ArticleTitle=Linux ハイパーバイザーの徹底調査
publish-date=05312009