QEMU を使ってクロスプラットフォームの開発を行う

マルチプラットフォームの開発を 1 台のコンピューターで行う

Linux の強みの 1 つはクロスプラットフォームという性質にあります。Linux は、x86、x86-64、SPARC、PowerPC、その他多くの CPU (Central Processing Unit) 上で実行することができます。しかし、このようにハードウェアの選択肢が多いため、ソフトウェア開発者は大きな困難に直面します。すべてのプラットフォームでソフトウェアを適切にコンパイルできるように、そして実行できるように保証することは困難です。QEMU パッケージを利用すると、この負担を軽減することができます。

QEMU は広範な種類の CPU をサポートするマシン・エミュレーターです。そのため、PowerPC のソフトウェアを x86 コンピューター上で実行したり、x86-64 ソフトウェアを SPARC コンピューター上で実行したりすることができます。この機能は、ソフトウェアのエンディアンネスに関する整合性のテストや、その他 CPU 特有の機能のチェックをする必要があるプログラマーには特に重宝します。また QEMU を使用すると、さまざまなオペレーティング・システムを完全に実行することができます。そのため、FreeBSD やSolaris、さらには Microsoft® Windows® の下でプログラムをコンパイルして実行できるかどうかを、Linux を終了せずにテストすることができます。

Roderick W. Smith, Consultant and author

author photo-Rod SmithRoderick W. Smith はコンサルタントであり、『The Definitive Guide to Samba 3』、『Linux in a Windows World』、『Linux Professional Institute Certification Study Guide』など、UNIX や Linux に関する数々の著作もあります。彼は現在、ロードアイランドのウーンソケットに住んでいます。



2010年 2月 09日

仮想化のメリットは、コンピューターのハードウェアをさまざまな用途で使用するために拡張できることです。そのため、1 台のコンピューター (ホスト) で複数のゲスト・オペレーティング・システムを実行することで、複数の役割を果たすことができます。しかし現在よく使われている仮想化ツールの多くは、相変わらずアーキテクチャー上の制約があります。つまり、これらの仮想化ツールは同じ CPU アーキテクチャーに対して複数のオペレーティング・システムを実行できるにすぎません (例えば 1 台の x86-64 コンピューター上で複数の x86-64 対応オペレーティング・システムを実行する、など)。QEMU ではそれも可能ですが、QEMU はクロスプラットフォームの環境でオペレーティング・システムを実行することもできるのです。この機能のおかげで、新たにコンピューターを用意しなくても、プログラムに含まれるプラットフォーム固有の機能をテストすることができます。

クロスプラットフォームの開発に QEMU を使うためには、まず QEMU をセットアップし、その上にゲスト・オペレーティング・システムをインストールする必要があります。場合によると、クロスプラットフォーム開発のために余分な作業が必要かもしれません。エミュレーターを起動して稼働状態になると、クロスプラットフォームの開発作業を行う上で役立つ QEMU の機能 (例えばエミュレーターとホストとの間でのファイル転送やファイル共有など) について調べることができます。

QEMU をインストールする

QEMU のインストールはパッケージ・マネージャーを使えば簡単にできるかもしれませんが、クロスプラットフォームのソフトウェア開発に QEMU を使おうとする場合には、少し追加の作業が必要かもしれません。例えば QEMU のインストール・オプションを理解する必要や、ファームウェアなどの必要なサポート・ファイルのインストールについても理解する必要があります。また、システム・エミュレーションとユーザー空間のエミュレーションとの違いも理解する必要があります。それぞれのエミュレーションでは専用のソフトウェアを追加でインストールする必要があるからです。

QEMU パッケージとサポート・ソフトウェアを入手する

Linux の大部分のソフトウェア・パッケージの場合と同様、QEMU のインストール方法は主に 2 つあります。1 つはディストリビューションのパッケージ・マネージャーを使う方法、そしてもう 1 つはソース・コードからコンパイルする方法です。コマンドとして、apt-get install qemu (Debian または Ubuntu の場合)、yum install qemu (Red Hat または Fedora の場合)、emerge qemu (Gentoo の場合) を使用すると、一般的なディストリビューションの中にある QEMU のメイン・パッケージをインストールすることができます (詳細についてはディストリビューションのドキュメントを参照してください)。

ディストリビューションに提供されている QEMU パッケージは適切に動作しますが、最新リリースではないことや、重要なファイル (x86 以外のシステム用のファームウェアなど) が含まれていないことなどがあります。そのため、QEMU をソース・コードからインストールする必要があるかもしれません。ソース・コードは QEMU の Web サイトから入手することができます (「参考文献」のリンクを参照)。ソース・ディレクトリーで ./configure --help と入力すると、構成オプションの一覧が表示されます。このオプションを利用して、必要に応じて QEMU をカスタマイズすることができます。それが終わると、通常の make コマンドと make install コマンドを使って QEMU をコンパイルし、インストールすることができます。

この記事の執筆時点での QEMU の安定バージョンは 0.11.1 でしたが、0.12 のリリース候補バージョンも入手することができます。この記事では 0.11.1 を基準として使用します。

x86 または x86-64 コンピューター上で QEMU を使用して x86 または x86-64 コンピューターをエミュレートする場合には、KQEMU を試してみるとよいかもしれません。KQEMU は Xen や KVM (Kernel-based Virtual Machine) と同様に CPU 仮想化を高速化する Linux カーネル・モジュールです。ただし KQEMU は標準的な Linux カーネルには含まれておらず、QEMU の Web サイトからダウンロードするか、あるいは別のパッケージでインストールする必要があります。KQEMU を使用する場合は、必ず QEMU のバージョンに対応したバージョンを使用する必要があります。KQEMU 1.3 は QEMU 0.9.1 あるいはそれ以前のバージョンと組み合わせ、KQEMU 1.4 は QEMU の最新バージョンと組み合わせる必要があります。

QEMU のメイン・サイトには、そのまま使用できる QEMU のディスク・イメージ・ファイルがいくつか提供されています。これらのファイルには、さまざまなプラットフォーム上で動作する Linux や、FreeBSD、FreeDOS などの必要最小限のインストール・ファイルが含まれています。これらのファイルをダウンロードすることで、基本的なインストールをテストすることができます。システムが動作している状態で、提供されたシステムを拡張することや、新しいシステムをゼロからインストールすることができます。

0.11.1 の QEMU パッケージには、x86、x86-64、PowerPC、SPARC 32、SPARC 64 プラットフォーム用のファームウェアと、それとは別に、ビデオ・カードや PXE (Preboot Execution Environment) ブート、その他のオプションをエミュレーションするためのファームウェア・ファイルが同梱されています。特定のファイルを調べるためには、メイン・パッケージの pc-bios サブディレクトリー、またはインストールされたシステムの /usr/share/qemu を見てください。

場合によると、QEMU に付属しているファームウェアが不適切なことがあります。例えば、x86 システムと x86-64 システム用のファームウェアは従来の BIOS (Basic Input/Output System) です。もっと新しい EFI (Extensible Firmware Interface) や少し変わったファームウェアを利用するソフトウェアを開発またはテストしたい場合には、そうしたファームウェアをどこか他の場所で見つける必要があります。EFI のイメージは QEMU のサイトに用意されているため、EFI のファームウェアが必要な場合の対応は容易です。それ以外の場合は簡単ではありません。特定のタイプのファームウェアを実行する必要がある場合には、関係するキーワードを使って Web を検索する必要があるかもしれません。

システム・エミュレーションとユーザー空間のエミュレーション

QEMU には 2 つのエミュレーション・モードが用意されています。一方の、システム・エミュレーションでは完全な仮想マシンをセットアップします。このシステムの中で実行するソフトウェアからコンピューターを見ると、そのコンピューターはホスト・システムとはまったく異なったものになる場合があります。例えば、実際には x86-64 で openSUSE を実行しているコンピューター上で、PowerPC による Debian システムを実行することができます。ユーザー・モード・エミュレーションは、そこまで完全な仮想化ではなく、QEMU のエミュレーション・ライブラリーを個々のバイナリーに適用します。すると個々のバイナリーにはホスト・コンピューターがそのバイナリー専用のものに見えます。そのため、PowerPC のバイナリーからホストの x86-64 openSUSE システムの /etc ディレクトリーや他の構成ファイルを見ることができます。ユーザー・モード・エミュレーションでは、ローカル・リソースやネットワークなどに容易にアクセスすることができます。

それぞれのエミュレーション手法には独自のセットアップ要件があります。システム・エミュレーションの場合には、あたかも別のコンピューターをセットアップするかのようにクライアント・オペレーティング・システムをインストールする必要があります。(そうする代わりに、構成済みのディスク・イメージをダウンロードして使用する方法もあります。) ユーザー空間のエミュレーションの場合には完全なシステムをセットアップする必要はありませんが、対象のソフトウェアで必要なサポート・ライブラリーをすべてセットアップする必要があるかもしれません。また、テスト対象のバイナリーを生成するためにクロスコンパイラーを構成する必要があるかもしれません。

この記事のポイントは QEMU を使用してクロスプラットフォームのソフトウェアを作成、テストすることであり、ハードウェアとのやりとりが少し必要なので、ここではシステム・エミュレーションに焦点を絞ります。ユーザー空間のエミュレーションの方が要求に合っていると思える場合には、ユーザー空間のエミュレーションを詳細に検討した方が適切です。


ゲスト・オペレーティング・システムをインストールする

システム・エミュレーション・モードで QEMU を使用できるようにするには、ゲスト・オペレーティング・システムをインストールする必要があります。先ほど触れたように、インストール済みのディスク・イメージを使用する方法と、新規インストール用にディスク・イメージを用意する方法があります。新規にインストールする場合には、最初にインストール用のディスク・イメージを用意する必要がありますが、インストールのプロセス自体は通常のコンピューターにインストールする場合と似ています。いずれにせよ、システムのインストールと使用に影響する、QEMU の重要な起動オプションを知っておく必要があります。

ディスク・イメージを用意する

通常、QEMU を使用する場合にはハードディスクの代わりにディスク・ファイルを使用します。あるいは、別のパーティションまたはネットワーク・マウントを一部またはすべてのストレージ用に使用する方法もありますが、ディスク・ファイルは便利で柔軟性があるので、私はディスク・ファイルを使用することをお勧めします。QEMU はディスク・エミュレーション用のファイル・フォーマットをいくつかサポートしており、その中で最も便利なものは、Raw ディスク・イメージと VMware 3/4 フォーマット、そして QEMU ネイティブの QCOW (Copy-On-Write バージョン 1) フォーマットと QCOW2 (Copy-On-Write バージョン 2) フォーマットです。

qemu-img コマンドによってディスク・イメージが作成されます。このコマンドには多くのオプションがありますが、このコマンドの基本的な使い方は非常に単純であり、このコマンドに対して、create パラメーター、フォーマット設定用の -f fmt パラメーター、ファイル名、そしてイメージのサイズを渡せばよいだけです。Raw イメージ (-f raw) は他のエミュレーターとデータを交換する際に便利です。ただし QCOW2 (-f qcow2) は圧縮をサポートしているため、一見大容量のディスクを比較的小さなスペースで作成することができます。

一例として、以下のコマンドによって 200GB のディスク・イメージ・ファイルが作成されます。このファイルがホスト上で使用するディスク・スペースは、最初はわずかです (256KB のみ)。しかしこのファイルを使用するにつれ、ファイルのサイズは大きくなります。

qemu-img create -f qcow2 linuxppc.qcow2 200G

ハードディスクのイメージを作成する他に、インストール・メディアを含むイメージ・ファイルを作成する必要があるかもしれません。QEMU で実際の光学ドライブを指定することも、光ディスクのイメージを含むファイル (例えばインターネットからダウンロードしたファイルや実際の光ディスクから作成されたファイル) を指定することもできます。

QEMU の起動オプション

QEMU のインストールを始めたり、QEMU を使い始めたりするためには、適切なオプションを使って QEMU を起動し、エミュレーターを使用できるようにする必要があります。QEMU のドキュメントには、使い方がわかりにくい数多くのオプションについての説明がありますが、重要なオプションはほんの数個です。特に重要なオプションとして、ハードディスクのイメージと、インストールのメディアまたはイメージを指定する必要があります。また、ファームウェア・ファイルを選択するためのオプションや、さまざまなハードウェア機能を設定するオプションなどもあります。最初は単純な構成で始め、徐々に複雑な構成にしていくとよいでしょう。

QEMU の完全なインストールにはいくつかのバイナリー・ファイルが含まれ、それぞれのバイナリー・ファイルは異なる CPU アーキテクチャーをエミュレートします。これらのバイナリー・ファイルの名前は qemu-system-arch という形式であり、arch はアーキテクチャーのコードです (アーキテクチャーのコードの例として、ppc は PowerPC を表し、x86_64x86-64 を表します)。例外として x86 システムは qemu バイナリー・ファイルによってエミュレートされます。qemu-arch という形式の名前のバイナリー・ファイルは、各アーキテクチャーをユーザー・モードでエミュレーションします。

ハードディスクを指定する場合、-hda-hdb-hdc-hdd を使って PATA (Parallel ATA) ハードディスクを参照し、CD または DVD のイメージ・ファイルまたはデバイスを指定するには -cdrom を使います。いずれのオプションを指定する場合でもファイル名をパラメーターに取ります。光学ドライブは -hdc で指定することになるため、-hdc でハードディスク用と光学ドライブ用の両方のオプションを同時に使用することはできません。

もう 1 つ、QEMU の重要な起動オプションは、ブート機器を指定する -boot です。-boot c を使用すると最初のハードディスクからブートし、-boot d を使用すると CD-ROM デバイスからブートします。

QEMU はデフォルトで、ゲスト・オペレーティング・システムに 128MB の RAM しか提供しません。ほとんどの場合、-m オプションを使用して、利用可能なメモリーを増やす必要があるでしょう (-m オプションではメガバイト単位の数値を指定します)。

これらのオプションを組み合わせ、Debian を実行する PowerPC システムを QEMU を使ってインストールする場合には、下記のようになります。

qemu-system-ppc -hda linuxppc.qcow2 -cdrom debian-ppc.iso -boot d -m 512

この例では、debian-ppc.iso ファイルには Debian/PowerPC のインストール・ディスクのコピーが含まれ、そのファイルをデフォルトのファームウェアでブートできるものとしています。これらのオプションは私のように QEMU 0.11.1 と Debian 5.02a を使用している場合には動作しますが、QEMU は簡単には動作しない場合があるため、そうした問題への何らかの対策が必要になるかもしれません。システムがインストールされると、ほとんど同じコマンドを使うことで (-boot d-boot c に変えるだけで)、実際に動作するシステムを起動することができます。

QEMU を扱う上での注意点と対策

遭遇しがちなトラブルとして、使い慣れないアーキテクチャーをブートしようとする場合は特に、インストール・ディスクがブート可能ではない場合があります。この問題に対する 1 つの対策として、-bios オプションを使って別のファームウェア・ファイルを指定する方法があります (-bios オプションはファームウェアのファイル名をオプションとして指定することができます)。/usr/local/share/qemu (あるいは、ディストリビューションのパッケージを使用してインストールした場合には /usr/share の中の類似のディレクトリー) の中でファームウェア・ファイルを探してみてください。あるいは Web を検索すれば他のファームウェアの選択肢を見つけられるかもしれません。

同様の対策として、-M オプションを使用してアーキテクチャーのサブタイプを指定する方法があります。qemu-system-arch -M ? と入力すると、使用しているアーキテクチャーに適した値を知ることができます。

もう 1 つの方法として、-kernel オプションを使用する方法があります。ホスト・ディスク上のゲスト・プラットフォームの Linux カーネル・ファイルの名前を -kernel オプションに指定すると、QEMU はそのカーネル・ファイルをロードして実行し、問題の原因となっているプラットフォーム専用のブート・ローダーやファームウェア機能をすべてバイパスします。

QEMU はターゲット・プラットフォームの CPU をエミュレートするため、動作は極めて低速です。そのため、ゲスト・オペレーティング・システムのインストールには通常以上の時間がかかることを覚悟する必要があります。可能であれば、最小限のインストール要件にとどめ、X ウィンドウ・システムをインストールせずにおくとよいでしょう。

QEMU が起動されると、ローカル・システムのウィンドウに QEMU がテキスト・モードまたグラフィックス・モードで実行されます。図 1 は、3 つの QEMU セッションを実行中のデスクトップを示しています (Windows XP が x86 エミュレーションで実行され、FreeBSD が x86-64 エミュレーションで、そして Debian Linux が PowerPC エミュレーションで実行されています)。

図 1. QEMU を利用すると、エミュレートされた複数のプラットフォーム上で複数のオペレーティング・システムを実行することができる
3 つの QEMU セッションを実行中のデスクトップの画像が示されています。その 3 つとは Windows XP が x86 エミュレーションで実行され、FreeBSD が x86-64 エミュレーションで、そして Debian Linux が PowerPC エミュレーションで実行されています。

QEMU を効果的に使う

ゲスト・オペレーティング・システムをインストールすると、そのゲスト・オペレーティング・システムをソフトウェアの開発やテストに使用することができます。しかしそのためには、ゲストとホストの間でファイルを転送できなければなりません。その方法はいくつかありますが、通常はネットワークをエミュレートする方法が最も柔軟性の高い方法になります。また、ソフトウェア開発でエミュレーターを最大限活用するためには、QEMUによるエミュレーションの機能と制約も考慮する必要があります。

ファイル転送を管理する

QEMU にはいくつかのネットワーク構成方法があります。デフォルトはユーザー・モードのネットワーク構成であり、これは NAT (Network Address Translation) の構成と似ています。つまりゲスト・オペレーティング・システムはネットワーク・クライアントを使用して他のコンピューター (ホスト・オペレーティング・システムと他のネットワーク・サーバーの両方を含みます) と通信することができますが、他のシステムからは特別な構成をしない限りゲスト・オペレーティング・システムと通信することはできません。QEMU は独自の DHCP (Dynamic Host Configuration Protocol) サーバーと DNS (Domain Name System) サーバーをゲスト・オペレーティング・システム専用に用意しています。ゲスト・オペレーティング・システムにとってはホストがゲートウェイ・システムのように見えます。

このデフォルトの構成は、NFS (Network File System) クライアントや SMB (Server Message Block)/CIFS (Common Internet File System) クライアント、SSH (Secure Shell) クライアント、あるいはその他のクライアントを使用して、ゲストから接続を開始し、ゲストとホストとの間でファイルを転送するには適しています。ただしホスト上で適切なサーバーを実行する必要があります。逆方向の接続を開始したい場合には、-redir オプションを使用してホスト・システムのポートをゲスト・オペレーティング・システムにリダイレクトする必要があります。例えば以下のコマンドはホストのポート 2222 をゲストのポート 22 にリダイレクトします。

qemu-system-ppc -hda linuxppc.qcow2 -boot c -m 512 -redir tcp:2222::22

このコマンドを実行すると、ssh localhost -p 2222 と入力すればホストからゲストに SSH を使ってログインすることができます。またネットワーク上の他のコンピューターからゲストにアクセスすることができます。そのため、新しいファイアーウォール・ルールを設定する必要があるかもしれません。当然ですが、ゲスト・オペレーティング・システム上で SSH サーバーを実行させる必要があります。同様の方法で NFS や SMB/CIFS、その他のポートもリダイレクトすることができます。

ソフトウェア開発に関するヒント

QEMU をセットアップして、ゲスト・オペレーティング・システムが実行されるようになると、ソフトウェアの開発を始めることができます。エミュレーターの下でネイティブ・コンパイラーを実行することも、ホスト上でクロスコンパイラーを実行することもできます。ゲスト・オペレーティング・システム上で繰り返しソフトウェアのコンパイルやテストを行う大規模な開発プロジェクトの場合には、クロスコンパイラーを使った方が高速ですが、その場合の構成の設定についてはこの記事では説明しません。小規模なプロジェクトや、頻繁にソフトウェアをコンパイルする必要のない場合には、エミュレーターの下で実行するコンパイラーを使うのが適しています。

ソフトウェアから見ると、エミュレートされたコンピューターは事実上、純粋なターゲット・プラットフォームのように見えます。

ソフトウェアから見ると、エミュレートされたコンピューターは、ほとんどの実用的な用途で使用する上では、実際のターゲット・プラットフォームのように見えます。

エンディアンネスや、CPU の識別などを始めとする、ハードウェアに関する基本機能は、実際のコンピューターの場合とまったく同じように動作します。私は実際に PowerPC を使用する Apple iMac と QEMU ベースの PowerPC システムの両方を使用して、GUID (Globally Unique IDentifier) パーティション・テーブル (GPT) を利用する fdisk プログラムの PowerPC バージョンを作成し、テストしました。このプログラムでは CPU のエンディアンネスを知る必要があります。この目的の場合には、QEMU ベースのシステムの方が少し遅いことを除けば、QEMU ベースのシステムを実物の iMac と区別することはできません。

とは言え、詳しく見ると違いがあります。例えば、QEMU によってエミュレートされたハードディスクは、実際のハードディスクのメーカーとモデルではなく「QEMU HARDDISK」というモデル・ストリングを返します。また QEMU による仮想ハードウェアは概して少し古くなっています。ディスクはすべて、(プラットフォームにより) PATA あるいは SCSI (Small Computer System Interface) デバイスのように見え、またビデオ用のハードウェアは非常に古いものです。仮想ハードウェアの詳細については QEMU のドキュメントを参照してください。これらの詳細がゲスト・プラットフォームごとに異なることにも注意してください。

Linux で使用する場合、ゲスト・オペレーティング・システムが動作する時を除き、QEMU セッションはほとんど CPU 時間を使用しません。ただし QEMU セッションは割り当てられた量の RAM を実際に消費します。つまり現実的な問題として、1 つか 2 つを超える QEMU セッションを同時に実行しようとする場合は特に、ホスト・システムに大量のメモリーが必要になる場合があります。


さらに別の使い方

QEMU は大量のオプションを含む大きなパッケージであり、そうしたオプションの多くは少なくとも一部の開発者にとっては興味深いものかもしれません。例えば、エミュレートされたネットワーク・カードのモデルを変更し、実際のネットワーク上の IP (Internet Protocol) アドレスをゲスト・マシンに指定し、さまざまなハードウェア・ポートをゲスト・オペレーティング・システムにリダイレクトし、多種多様なハードウェア・オプションを微調整することができます。そうした機能が重要な場合には、QEMU のドキュメントが非常に貴重な資料となるでしょう。

参考文献

学ぶために

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

  • QEMU の Web サイトを訪れ、QEMU や関連ツールをダウンロードし、充実したドキュメントを読み、そして他のリソースへのリンクを見つけてください。
  • developerWorks から直接ダウンロードできる IBM ソフトウェアの試用版を利用して、皆さんの次期 Linux プロジェクトを構築してください。

議論するために

  • My developerWorks community に参加してください。そして他の 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, Open source
ArticleID=475643
ArticleTitle=QEMU を使ってクロスプラットフォームの開発を行う
publish-date=02092010