QEMU によるシステムのエミュレーション

マシンのなかのもう 1 つのマシン

QEMU は、PC システム全体を対象としたオープンソースのエミュレーターです。QEMU ではプロセッサーをエミュレートするだけでなく、必要なすべてのサブシステム (ネットワーク用ハードウェアやビデオ・ハードウェアなど) もエミュレートすることができます。さらに、対称型マルチプロセッシング・システム (最大 255 基の CPU) やその他のプロセッサー・アーキテクチャー (ARM、PowerPC など) といった高度なシステムをエミュレートすることも可能です。この記事では、QEMU とそのアーキテクチャーについて探り、Linux® ホストでゲスト・オペレーティング・システムをエミュレートする方法を紹介します。

M. Tim Jones, Consultant Engineer, Emulex

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



2007年 9月 25日

QEMU とは何か

仮想化が最近注目を浴びている最新技術だという発言は、控えめな表現です。仮想化という言葉を Google で検索すると、その検索結果はおよそ 2千2百万件にものぼります。例えば、ほんの 1 ヶ月のうちに、EMC Corporation が VMware の IPO (新規株式公開) を発表し、Citrix Systems が XenSource の買収計画を発表し、そして仮想化の新規事業が至るところで出現しました。新たな隙間市場は今でも続々と見つかっていて、それは計り知れないほど巨大な 1 つの市場となっています。しかし、近頃盛んに仮想化の IPO と買収が話題になっている一方で、仮想化の技術については忘れられがちです。

この記事では、興味深い仮想化アプリケーションでありながら、今日のニュースで見出しを飾ることはないアプリケーション、QEMU について説明します。QEMU はさまざまな設定で使用できるアプリケーションで、ゲスト・オペレーティング・システムを仮想化するために使用することも、ホスト CPU やその他の CPU アーキテクチャーを対象にオペレーティング・システムで動作する完全なマシン・エミュレーターとして使用することもできます。


仮想化の概要

まず始めに、仮想化について簡単に説明してから QEMU の舞台を設定することにします。

この記事で説明する仮想化は、実際にはプラットフォームの仮想化です。物理ハードウェアでは、制御プログラムをホスト・オペレーティング・システムまたはハイパーバイザーにすることができます (図 1 を参照)。ホスト・オペレーティング・システムがハイパーバイザーを兼ねる場合もあります。ゲスト・オペレーティング・システムはハイパーバイザーに常駐します。ゲスト・オペレーティング・システムのターゲットが制御プログラムと同じ CPU であることもありますが、そうでない場合もあります (x86 ハードウェアで動作する PowerPC ゲストなど)。

図 1. プラットフォーム仮想化の基本アーキテクチャー
プラットフォーム仮想化の基本アーキテクチャー

仮想化を実現する方法はさまざまですが、たいていは 3 つの主要な方法が使用されます。まず 1 つは、ネイティブ (完全) 仮想化と呼ばれる手法です。この手法ではハイパーバイザーが分離のための基本要素を実装し、物理ハードウェアをゲスト・オペレーティング・システムから切り離します。1966年に初めて IBM® CP-40 仮想マシン/仮想メモリー・オペレーティング・システムでデモンストレーションが行われたネイティブ仮想化は、VMware ESX Server でも使用されています。

疑似仮想化もよく使われる手法です。疑似仮想化では、制御プログラムが実装するハイパーバイザーのアプリケーション・プログラム・インターフェース (API) をゲスト・オペレーティング・システムが使用します。疑似仮想化は、Xen および Linux KVM (Kernel-based Virtual Machine) の両方で使用されています。

そして 3 つ目の便利な手法として挙げられるのが、エミュレーションです。エミュレーションとは、その名前が示すように、ハードウェア環境全体をシミュレートすることによってゲスト・プラットフォームを仮想化するという手法です。エミュレーションは同じ 1 つのソリューションのなかでも、さまざまな方法で実装されます。QEMU と Bochs は、エミュレーションによる仮想化の例です。


QEMU のアーキテクチャー

QEMU がどのようにエミュレーションを行うかを見ていくことにしましょう。このセクションでは、QEMU の 2 つの動作モード、そして QEMU の動的変換プログラムならではの興味深い側面について説明します。

QEMU の基本動作

QEMU がサポートする動作モードは、ユーザー・モード・エミュレーションとシステム・モード・エミュレーションの 2 つです。ユーザー・モード・エミュレーションでは、ある CPU を対象にビルドされたプロセスを別の CPU で実行することができます (ホスト CPU に対する命令を動的に変換し、それに応じて Linux システム呼び出しを変換するという方法)。一方のシステム・モード・エミュレーションでは、プロセッサーと各種周辺装置を含め、システム全体をエミュレートすることができます。

x86 コードを x86 ホスト・システムでエミュレートしている場合、QEMU アクセラレーターという機能を使って、ほぼネイティブなパフォーマンスを実現することができます。これにより、エミュレートしたコードを Linux 上のホスト CPU で (カーネル・モジュールを介して) 直接実行することが可能になります。

一方、技術的な点から QEMU を興味深いものにしているのは、その高速で移植可能な動的変換プログラムです。この動的変換プログラムは、実行時にターゲット (ゲスト) CPU に対する命令をホスト CPU 用に変換することによってエミュレーションを行います。このような変換は強引に行うことも可能ですが (命令を CPU 間でマッピングするという方法)、必ずしも単純にマッピングできるわけではなく、場合によっては複数の命令が必要になったり、変換対象のアーキテクチャーに基づいて振る舞いを変更しなければならないこともあります。

QEMU は動的変換を行う手段として、まずターゲット命令をマイクロ・オペレーションに変換します。これらのマイクロ・オペレーションは小さな C コードで実装されており、オブジェクトにコンパイルされます。その上でコア変換プログラムがビルドされ、ターゲット命令とマイクロ・オペレーションを動的変換用にマッピングします。この変換プログラムは効率的であるだけでなく、移植することも可能です。

また、QEMU の動的変換プログラムは変換プログラムのオーバーヘッドを最小限にするために、変換されたコードのブロックをキャッシュします。ターゲット・コードのブロックが検出されると、そのブロックが変換され、変換済みブロックとして保管されます。QEMU は最後に使用された変換済みブロックを 16MB のブロックにキャッシュします。さらに、QEMU はキャッシュ内の変換済みブロックを無効にして自己書き換えコードをサポートすることもできます。

QEMU の仕組みとその動的変換プログラムについてさらに詳しく学ぶには、「参考文献」セクションに記載している Fabrice Bellard (QEMU の作成者) による興味深い記事を読んでください。

サポートされる周辺装置

QEMU を PC システム・エミュレーターとして使用すると、多種多様な周辺装置がエミュレートされます。エミュレート対象の標準的な周辺装置としては、ハードウェアの VGA (Video Graphics Array) エミュレーター、PS/2 マウスおよびキーボード、ハード・ディスクと CD-ROM インターフェース、そしてフロッピー・ディスクなどがあります。さらに、QEMU は NE2000 PCI (Peripheral Controller Interconnect) ネットワーク・アダプター、シリアル・ポート、各種のサウンド・カード、PCI UHCI USB (Universal Host Controller Interface Universal Serial Bus) コントローラー (仮想 USB ハブを搭載) のエミュレーションにも対応します。プロセッサーの対称型マルチプロセッシング (SMP) でも、255 基までの CPU がサポートされます。

標準 PC または ISA PC (PCI バス未使用) をエミュレートするだけでなく、QEMU ではその他の PC 以外のハードウェア、例えば ARM Versatile ベースボード (926E を使用) や MIPS (Malta million Instructions Per Second) ボードなどもエミュレートします。また、Power Macintosh G3 (Blue & White)、Sun-4u をはじめとするさまざまなプラットフォームに対応させるための取り組みも現在進行中です。


QEMU のビルドとインストール

QEMU をビルドしてインストールするのは、標準 GNU ツールを使用する場合と同じくらい簡単です。QEMU ディストリビューションをダウンロードして tar ファイルを展開した後、configuremake、続いて make install を実行すれば完了です (リスト 1 を参照)。

リスト 1. QEMU エミュレーターのビルド
$ wget http://fabrice.bellard.free.fr/qemu/qemu-0.9.0.tar.gz
$ tar xfvz qemu-0.9.0.tar.gz
$ cd qemu-0.9.0
$ ./configure
$ make
$ make install
$

このプロセスでは、現行のターゲット・アーキテクチャーの実行可能 qemu イメージだけでなく、ARM、MIPS、PowerPC、68k、SPARC などの他のアーキテクチャーのイメージも作成されます。これらのイメージを使えば、ビルドした Linux カーネルを別のターゲット・アーキテクチャーを対象にブートすることができます。

ホストとゲスト・オペレーティング・システムの対象が同じプロセッサー・アーキテクチャーの場合、QEMU アクセラレーター (KQEMU) を使ってほぼネイティブなパフォーマンスにまで高速化をすることができます。KQEMU は、ユーザー・モード・コードとカーネル・コードをホスト CPU で直接実行することを可能にするドライバー (Linux 対応カーネル・モジュール) です。QEMU アクセラレーターのビルド手順は、QEMU 自体をビルドする場合と同じです (リスト 2 を参照)。

リスト 2. QEMU アクセラレーターのビルド
$ wget http://fabrice.bellard.free.fr/qemu/kqemu-1.3.0pre11.tar.gz
$ tar xvfz kqemu-1.3.0pre11.tar.gz
$ cd kqemu-1.3.0pre11
$ ./configure
$ make
$ make install

KQEMU は、Microsoft® Windows®、FreeBSD®、Linux をはじめ、さまざまなオペレーティング・システムでコンパイルしたり、インストールしたりすることができます。ビルドし終わった QEMU アクセラレーターを例えば Linux にインストールするには、以下のコマンドを実行します。

$ insmod kqemu.ko
$

QEMU の使用方法

次に、典型的なデスクトップ GNU/Linux 環境で QEMU を使用して別のマシンを仮想化する方法を取り上げます。別のマシンをエミュレートする方法は、まったく新しいコンピューターを扱う場合とそれほど変わりません。最初のステップは、オペレーティング・システムをインストールすることです。新しいコンピューターにはまず、オペレーティング・システムをインストールする場所が必要なので、マシンをエミュレートする場合にもハード・ディスクを用意します。

QEMU にはハード・ディスクを作成する特殊なコマンド、qemu-img があります。このユーティリティーではさまざまなフォーマットでイメージを作成できますが、最善のフォーマット (qemu の場合) は qcow (qemu copy-on-write) というものです。このフォーマットには、ディスク・イメージとそのイメージを表す物理ファイルのサイズが同じではないという利点があります。言い換えれば、このフォーマットでは hole が許容されるため、ディスク・イメージがよりコンパクトになります。例えば、空の 4GB ディスク・イメージに必要なのはわずか 16KB だけです。

qemu-img コマンドに指定するのは、オペレーション (新規ディスク・イメージを作成する create)、フォーマット (qemu イメージ・フォーマットの場合は qcow)、サイズ、そしてディスク・イメージの名前です。この例では、Flash で使用する軽量の Linux ディストリビューションを目的としてマシンをエミュレートします。そこで、以下のコマンドで、128MB のディスク・イメージを作成します。

$ qemu-img create -f qcow disk.img 128M
Formating 'disk.img', fmt=qcow, size=131072 kB
$

Windows、Linux、または FreeBSD などの汎用オペレーティング・システムをインストールする場合には、これより遥かに大きなディスク・サイズが必要になりますが、このオペレーションで作成される disk.img というファイルはエミュレーションでは 128MB のディスクとして表示されます。

ハード・ディスクは作成できたので、今度はこのディスクに新しいオペレーティング・システムをインストールします。この説明で使用するのは、cfLinux という小さなサイズの Linux ディストリビューションです。小型の組み込み Linux システムとして使用されるよう意図された cfLinux は、ゲートウェイ、無線アクセス・ポイント、ファイアウォール、あるいはルーターに適しています。ISO フォーマットのこのディストリビューションは、以下のように wget を使ってダウンロードすることができます。

wget ftp://ftp.cflinux.fu/pub/cflinux/iso/cflinux-1.0.iso

ISO イメージは共通 CD-ROM フォーマットです (ISO 9660 ファイル・システムとしても知られています)。

エミュレートされたディスク (disk.img)、そしてインストールするオペレーティング・システムが含まれる CD-ROM が用意できたら、次のステップとしてオペレーティング・システムをハード・ディスクにインストールします。インストールするために必要なのは以下の qemu コマンドだけです。

$ qemu -hda disk.img -cdrom /root/cflinux-1.0.iso -boot d
$

qemu コマンドでは、ハード・ディスク・イメージを hda オプションで指定し、cdrom (ISO イメージが常駐するファイル) を cdrom オプションで指定します。boot オプションで CD-ROM からブートするように指定します。上記のように引数を d とすると CD-ROM からブートされる一方、引数が a の場合はフロッピーから、c の場合はハード・ディスクから (デフォルト)、そして n の場合はネットワークからブートされることになります。このコマンドを実行すると、エミュレートされたマシンを表す新規 QEMU ウィンドウが表示されます (図 2 を参照)。

図 2. QEMU でエミュレートしたディスクに cfLinux をインストールするための準備
QEMU でエミュレートしたディスクに cfLinux をインストールするための準備

CD-ROM の場合のインストール手順に従って、エミュレートされたハード・ディスクに ISO をインストールしてください。この手順が完了すると、リブートするよう要求されます。この時点でエミュレーションを終了することができます (qemu ウィンドウで Ctrl-C を押下)。これで、新しくインストールしたオペレーティング・システムを以下のコマンドでブートすることができます。

上記のコマンドラインはただ単に、disk.img イメージ・ファイルが表すハード・ディスクを使って標準 PC (デフォルト・オプション) をエミュレートするように指示しているだけです。これにより、Linux イメージがエミュレートされたハード・ディスクからブートし、QEMU ウィンドウが表示されます (図 3 を参照)。

図 3. エミュレートされたハード・ディスクから新規にインストールした cfLinux がブートされる様子
エミュレートされたハード・ディスクから新規にインストールした cfLinux がブートされる様子

手順はこのように、至って簡単です。実際、上記と同じ手順であらゆる種類のオペレーティング・システム (実動用 Linux ディストリビューション、Windows など) をインストールし、ブートすることができます。


その他のエミュレーター

QEMU は素晴らしいエミュレーション環境ですが、他にも検討する価値のある環境はあります。例えば、Windows API のオープン・ソース実装である Wine を使えば、Windows オペレーティング・システムなしで Windows プログラムを実行することができます。ただし、その頭字語から明らかなように、Wine (Wine Is Not an Emulator) はエミュレーターではありません。Wine はエミュレーションを行う代わりに、x86 アーキテクチャーに対応したアプリケーションを実行できるようにする一連の API を実装します。したがって、Wine 上でアプリケーションを実行すると優れたパフォーマンスを実現できます。

QEMU と同様のエミュレーターとしては、Bochs が挙げられます。Bochs はマシン・エミュレーターで、Intel® の i386™、i486™、Pentium®、Pentium Pro、そして Advanced Micro Devices の AMD64 CPU、さらにはディスク、メモリー、ディスプレイ、ネットワーク・デバイスといった一般的な PC 周辺装置もエミュレートします。Bochs は Linux、DOS、Windows 95/98/XP/2000/NT® オペレーティング・システムのエミュレーションに使用されてきました。


さらに詳しく学ぶために

QEMU をマシン・エミュレーターとして使用すると、利用できる予備のマシンがないとしても、数多くのオペレーティング・システムを試してみることができます。その一例は、オープン・ソースの Windows XP 互換オペレーティング・システム、ReactOS です (このオペレーティング・システムをエミュレートしたのが、図 4 です)。ReactOS は Windows XP とのバイナリー互換性を目指しているため、Windows XP 用にビルドされたアプリケーションを ReactOS 上で直接実行することができます。現時点でのアプリケーションの互換性に関する詳細は、「参考文献」セクションを参照してください。

図 4. ReactOS を対象とした標準 PC のエミュレーション
ReactOS を対象とした標準 PC のエミュレーション

Free Operating Systems Zoo には、ReactOS やその他多くのオペレーティング・システムの QEMU イメージが用意されています (詳細は「参考文献」セクションを参照)。これらのイメージには、ライブ CD イメージ、フロッピー・イメージ、またはディスク・イメージが含まれます (qcow フォーマット)。インストールに時間をかけずに新しいオペレーティング・システムを試すには、QEMU は理想的な手段です。

参考文献

学ぶために

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

  • Fabrice Bellard の Web サイトから、オープン・ソースの QEMU プロセッサー・エミュレーターと QEMU アクセラレーターをダウンロードしてください。このサイトでは、QEMU の資料、API、そして現在の状況も調べられます。
  • cfLinux の詳細を学んでください。著者はこの軽量のディストリビューションを使用して、オペレーティング・システムを QEMU マシンにインストールする手順を説明しました。
  • 時間を節約するには、Free Operating Systems Zoo からパッケージ化されたイメージを入手してください。このサイトでは、標準の Linux ディストリビューションから特異なオペレーティング・システム (Plan 9、OpenSolaris、MINUX、ReactOS、Darwin、MenuetOS など) に至るまで、さまざまなオペレーティング・システムのイメージを用意しています。ここからダウンロードしたディスク・イメージは、そのまますぐにブートできます。
  • Wine は、非ネイティブ Windows オペレーティング・システム (Linux など) で Windows アプリケーションを実行することを可能にします。
  • Bochs はシステム全体をエミュレートするという点で QEMU と似ています。
  • developerWorks から直接ダウンロードできる IBM トライアル・ソフトウェアを使用して、Linux で次の開発プロジェクトを構築してください。

議論するために

コメント

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, Open source
ArticleID=263961
ArticleTitle=QEMU によるシステムのエミュレーション
publish-date=09252007