QEMU CPUエミュレータユーザードキュメント


Table of Contents


QEMU CPUエミュレータユーザードキュメント

1. はじめに

1.1 特徴

QEMUは、速い!プロセッサエミュレータです。ダイナミックトランスレーションを使って、良好なスピードでエミュレーションをします。 QEMUは2つの動作モードを持っています:

QEMUを動かすために、ホストにカーネルドライバを必要としません。しかし、満足なパフォーマンスが得られます。 システムエミュレーションでは、次のようなハードウエアに対するものがサポートされています。

ユーザーモードでは、x86、PowerPC、ARM、SPARC32/64といったCPUがサポートされています。

2. Installation

もし、自分でQEMUをコンパイルする場合は、section 6. ソースコードからのコンパイルセクションを見てください。

2.1 Linux

もし、あなたのディストリビューションにコンパイル済みのパッケージがあるなら、インストールするだけです。そうでなければ、see section 6. ソースコードからのコンパイル.

2.2 Windows

実験的な実行ファイルのインストーラをこちらからダウンロードしてください。 http://www.freeoszoo.org/download.php.

2.3 Mac OS X

実験的な実行ファイルのインストーラをこちらからダウンロードしてください。 http://www.freeoszoo.org/download.php.

3. QEMU PCシステムエミュレータの起動

3.1 はじめに

QEMUシステムエミュレータは次のような周辺機器をシミュレートします。

SMPは、255個までのCPUをサポートしています。 adlibは、QEMUが-enable-adlibオプションでコンパイルされているときだけ利用可能です。 QEMUは、BochsプロジェクトのPC BIOSと、Plex86/Bochs LGPL VGA BIOSを使っています。 QEMUは、Tatsuyoshi SatohさんのYM3812エミュレーションを使っています。

3.2 クイックスタート

Linuxイメージ(<TT>`linux.img'</TT>)をダウンロードして、展開します。そして、以下のようにタイプします:

qemu linux.img

Linuxが起動し、プロンプトが現れるはずです。

3.3 起動

使い方: qemu [options] [disk_image]

disk_image は IDEハードディスク0として使うraw ハードディスクイメージです。 一般的なオプション:

`-M machine'
エミュレーションするマシンを選択します。(リストを得るには、-M ?)
`-fda file'
`-fdb file'
フロッピーディスク0/1イメージ (See section 3.6 ディスクイメージ) として file を使います。 ファイルネームとしてホストのフロッピーを `/dev/fd0' で使うことができます。
`-hda file'
`-hdb file'
`-hdc file'
`-hdd file'
ハードディスクイメージ0,1,2,3として file を使います。(See section 3.6 ディスクイメージ).
`-cdrom file'
CD-ROMイメージとして file を使います。( `-hdc'`-cdrom' を同時に使うことはできません。)ホストのCD-ROMは、`/dev/cdrom' をファイルの名前として使えます。
`-boot [a|c|d]'
フロッピー (a, b), ハードディスク (c) CD-ROM (d) から起動します。ハードディスクがデフォルトです。
`-snapshot'
ディスクイメージファイルのかわりに一時ファイルに保存します。この場合、使っているrawハードディスクイメージには書き込まれません。しかし @keys{C-a s} を押すことで書き戻すことができます。(See section 3.6 ディスクイメージ).
`-m megs'
仮想RAMサイズを megs メガバイトにします。デフォルトは128MBです。
`-smp n'
n個のCPUのSMPシステムをシミュレートします。255までのCPUをサポートしてします。
`-nographic'
通常は、QEMUはVGAの出力としてSDLを使います。このオプションによってすべてのグラフィックの出力を止めることができます。これで、QEMUは簡単なコマンドラインアプリケーションになります。エミュレートされるシリアルポートはコンソールにリダイレクトされます。これにより、QEMUを使ってシリアルコンソール内でLinuxカーネルをデバッグすることができます。
`-k language'
キーボードレイアウトt language を使います。(たとえば、フランス語には、 fr 。) このオプションは、PCキーコードが簡単に得られないときに使われます。(たとえば、MacやX11サーバーで)。 PC/LinuxやPC/Windowsホストでは、必要ありません。 利用可能なレイアウトは:
ar  de-ch  es  fo     fr-ca  hu  ja  mk     no  pt-br  sv
da  en-gb  et  fr     fr-ch  is  lt  nl     pl  ru     th
de  en-us  fi  fr-be  hr     it  lv  nl-be  pt  sl     tr
デフォルトは、 en-usです。
`-audio-help'
オーディオサブシステムのヘルプを表示します。:ドラバーや、調整できるパラメータのリストを示します。
`-soundhw card1,card2,... or -soundhw all'
オーディオをイネーブルにし、サウンドのハードウェアを選択します。すべてのサウンドのハードウェアを表示するには、?を使ってください。
qemu -soundhw sb16,adlib hda
qemu -soundhw es1370 hda
qemu -soundhw all hda
qemu -soundhw ?
`-localtime'
リアルタイムクロックをローカルに設定します(デフォルトはUTCです)。このオプションは、MS-DOSもしくはWindowsで正しい日時を設定するのに必要です。
`-full-screen'
フルスクリーンモードで起動します。
`-pidfile file'
QEMUのプロセスIDを fileに書き込みます。QEMUをスクリプトから起動するのに便利です。
`-win2k-hack'
Disk full バグを回避するために、Windows 2000 をインストールするときに使ってください。Windows 2000 をインストールした後は、もはやこのオプションは必要ありません。(このオプションは、IDEの転送速度を遅くします。)

USBオプション:

`-usb'
USBドライバーを使用可能にします。(まもなくデフォルトになります。)
`-usbdevice devname'
USB デバイス devnameを付けます。情報は、モニターのコマンドusb_addを見てください。

ネットワークオプション:

`-net nic[,vlan=n][,macaddr=addr]'
新しいネットワークインターフェースカードを作成し、VLAN nn = 0がデフォルトです。)に接続します。NIC(ネットワークインターフェースカード)は、現在PCターゲットでは、NE200です。オプションで、MACアドレスが変更可能です。もし、`-net'オプションが1つもなければ、NICが1つ作られます。
`-net user[,vlan=n]'
ユーザーモードのネットワークスタックが使われます。使用するのに管理者権限が必要ありません。-netオプションが1つも使われないとき、これがデフォルトになります。
`-net tap[,vlan=n][,fd=h][,ifname=name][,script=file]'
ホストのTAPインターフェースに接続します。名前はnameで、VLAN番号n、ネットワークスクリプトfileです。デフォルトのスクリプトは、`/etc/qemu-ifup'です。もし、nameが指定されないとき、OSは、自動的に1つを作成します。オプション fd=h は、既にオープンされているTAPインターフェースを指定するのに使います。
qemu linux.img -net nic -net tap
もっと複雑な例(2つのNIC、それぞれがTAPデバイスに接続)は、
qemu linux.img -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \
               -net nic,vlan=1 -net tap,vlan=1,ifname=tap1
`-net socket[,vlan=n][,fd=h][,listen=[host]:port][,connect=host:port]'
TCPソケットによる接続を通して、VLAN n をもう1つのQEMU仮想マシンに接続します。 もし、listenが指定されると、port番号で、QEMUは接続を待ち受けます。hostはオプションです。connectは、listenを使用しているもう1つのQEMUに接続するのに使われます。fd=hオプションは、すでにオープンされているTCPソケットを指定します。 例:
# 最初のQEMUを起動
qemu linux.img -net nic,macaddr=52:54:00:12:34:56 -net socket,listen=:1234
# VLAN 0 を最初のQEMUのVLAN 0に接続
qemu linux.img -net nic,macaddr=52:54:00:12:34:57 -net socket,connect=127.0.0.1:1234
`-net socket[,vlan=n][,fd=h][,mcast=maddr:port]'
UDPマルチキャストソケットを通じてVLAN nをもう1つのQEMUと分け合います。効率的に同じマルチキャストアドレスmaddrとポートportで、すべてのQEMUが同じバスを共有します。 注意:
  1. いくつかのQEMUが、異なったホスト上で同じバスを共有することができます。(ホストがマルチキャストを適切に設定しているならば)
  2. mcastサポートはUser Mode Linuxと互換性があります。(引数 `ethN=mcast') こちらを見てください。 http://user-mode-linux.sf.net.
  3. `fd=h' をすでにオープンしているUDPマルチキャストソケットに使ってください。
例:
# QEMUを1つ起動します。
qemu linux.img -net nic,macaddr=52:54:00:12:34:56 -net socket,mcast=230.0.0.1:1234
# 同じ”バス”でもう1つQEMUを起動します。
qemu linux.img -net nic,macaddr=52:54:00:12:34:57 -net socket,mcast=230.0.0.1:1234
# 同じ”バス”でさらに1つQEMUを起動します。
qemu linux.img -net nic,macaddr=52:54:00:12:34:58 -net socket,mcast=230.0.0.1:1234
例(User Mode Linux互換):
# QEMUを起動します。(選んでいるmcastアドレスは、UMLのデフォルトのアドレスです。)
qemu linux.img -net nic,macaddr=52:54:00:12:34:56 -net socket,mcast=239.192.168.1:1102
# UMLを起動します。
/path/to/linux ubd0=/path/to/root_fs eth0=mcast
`-net none'
ネットワークデバイスを1つも使わないことを指定します。`-net'を使用しないときのデフォルトを書き換えるのに使います。
`-tftp prefix'
ユーザーモードでのネットワークを使用しているとき、装備されているTFTPサーバを有効にします。 名前が<VAR>prefix</VAR>で始まるすべてのファイルがホストからゲストへTFTPクライアントを用いてダウンロード可能です。ゲスト上のTFTPクライアントは、バイナリモードでなくてはなりません。(UnixのTFTPクライアントでは<CODE>bin</CODE>コマンドを使います。) ゲスト上でのホストのIPアドレスは、通常10.0.2.2です。
`-smb dir'
ユーザーモードでネットワークを使用しているとき、装備されているSMBサーバを有効にします。Windows OSは`dir'を使ってホストのファイルにアクセスできます。 ゲストのWindows OSでは、次の行:
10.0.2.4 smbserver
を、`C:\WINDOWS\LMHOSTS'というファイルに加えなければなりません。 (windows 9x/Meに対して) もしくは、`C:\WINNT\SYSTEM32\DRIVERS\ETC\LMHOSTS' (Windows NT/2000)。 そして、`dir' が、`\\smbserver\qemu'内で、使えます。. SAMBAサーバがホストOSの`/usr/sbin/smbd'にインストールされていなければならないことにに注意してください。QEMUは、Red Hat 9のバージョン2.2.7aとFedora Core 3のバージョン3.0.10-1.fc3のsmbdでのテストは成功しました。
`-redir [tcp|udp]:host-port:[guest-host]:guest-port'
ユーザーモードでネットワークを使用しているとき、入ってくるTCPもしくはUDPの接続をホストのポートhost-portからゲストのポートguest-portにリダイレクトします。もし、guest-hostが指定されない場合は、その値は10.0.2.15(装備されたDHCPサーバのデフォルトのアドレス)になります。 たとえば、ホストのX11コネクションをスクリーン1からゲストのスクリーン0へリダイレクトするには、次のようにします。:
# on the host
qemu -redir tcp:6001::6000 [...]
# this host xterm should open in the guest X11 server
xterm -display :1
telnetのホストのポート5555からのコネクションをゲストのtelnetのポートにリダイレクトするには、次のようにします。:
# on the host
qemu -redir tcp:5555::23 [...]
telnet localhost 5555
これで、ホストで、telnet localhost 5555を使うと、ゲストのtelnetサーバに接続することができます。

Linuxの起動に関すること。このオプションを使うことで、ディスクイメージにインストールすることなく、与えられたLinuxのカーネルを扱うことができます。いろいろなカーネルを容易にテストすることができます。

`-kernel bzImage'
bzImage をカーネルのイメージとして使います。
`-append cmdline'
cmdline をカーネルのコマンドラインとして使います。
`-initrd file'
file を初期化ラムディスクとして使います。

デバッグ/エクスパートオプション:

`-serial dev'
仮想シリアルポートをホストのデバイスdevにリダイレクトします。利用可能なデバイスは:
vc
仮想コンソール
pty
[Linux のみ] 擬似 TTY (新しい PTY は、自動的に割り当てられます)
null
空のデバイス
/dev/XXX
[Linuxのみ] ホストのttyを使います。つまり、`/dev/ttyS0'を使います。ホストのシリアルポートのパラメータはエミュレートされるものに合わせてセットされます。
/dev/parportN
[Linuxのみ、パラレルポートのみ] ホストのパラレルポートNを使います。現在、SPPパラレルポート機能のみ使うことができます。
file:filename
出力をfilenameに書きます。キャラクター文字は使えません。。
stdio
[Unix のみ] 標準入出力
pipe:filename
[Unix のみ] ネームパイプ filename
デフォルトのデバイスは、グラフィックモードではvc、グラフィックモードでなければstdioです。 このオプションは、4つのシリアルポートをシミュレートするまで何回か使えます。
`-parallel dev'
仮想パラレルポートをホストのデバイスdev(シリアルポートと同じデバイス名)にリダイレクトします。Linuxホストでは、`/dev/parportN'が対応するホストのパラレルポートに接続されたハードウェアデバイスを使うために使われます。 このオプションは、3つのパラレルポートをシミュレートするまで何回か使うことができます。
`-monitor dev'
モニターをホストのデバイスdevにリダイレクトします(シリアルポートのように同じデバイスです)。 デフォルトのデバイスは、グラフィックモードではvc、グラフィックモードでなければstdioです。
`-s'
ポート1234でgdbの接続を待ちます。(See section 3.10 GDBの使い方).
`-p port'
gdbの接続ポートを変更します。
`-S'
スタートアップ時にCPUをスタートしません(モニターで'c'を入力する必要があります)。
`-d'
ログを /tmp/qemu.log に出力します。
`-hdachs c,h,s,[,t]'
ハードディスク0の物理ジオメトリを強制します。(1 <= c <= 16383, 1 <= h <= 16, 1 <= s <= 63) そして、オプションとして、BIOSのトランスレーションモードを強制します。(t=none, lba or auto). 通常QEMUは、これらすべてを推定することができます。このオプションは、古いMS-DOSディスクイメージを使う時に便利です。
`-std-vga'
BochsのVBE拡張をサポートした標準VGAカードをシミュレートします(デフォルトは、Cirrus Logic GD5446 PCI VGAです)。
`-loadvm file'
セーブされた状態からすぐにスタートします(モニター内でloadvmしてください)。

3.4 キー操作

グラフィックモードでのエミュレーションでは、次のようなキーがつかえます。

Ctrl-Alt-f
フルスクリーンとの切り替え
Ctrl-Alt-n
仮想コンソール'n'に切り替えます。標準的なコンソールは:
1
ターゲットシステムの画面
2
モニター
3
シリアルポート
Ctrl-Alt
マウスとキーボードのゲストOSとの切り替え

仮想コンソール内ではCtrl-Up, Ctrl-Down, Ctrl-PageUpCtrl-PageDownをつかって、前の入力に戻ることができます。 エミュレーション時に `-nographic'オプションを使っている場合、 Ctrl-a hオプションをターミナルコマンドを入力するのに使って下さい。

Ctrl-a h
このヘルプを表示します。
Ctrl-a x
エミュレータを終了します。
Ctrl-a s
ディスクデータをファイルに書き戻して保存します。( -snapshot の場合)
Ctrl-a b
breakを送信します。(Linuxでは、magic sysrqです)
Ctrl-a c
コンソールとモニターをスイッチします。
Ctrl-a Ctrl-a
Ctrl-aを送信します。

3.5 QEMUモニター

The QEMUモニターは、QEMUエミュレータに複雑なコマンドを与える時に使います。このようなことができます。:

3.5.1 コマンド

次のようなコマンドが使えます:

`help or ? [cmd]'
すべてのコマンドもしくは、cmdのヘルプを表示。
`commit'
ディスクイメージに変更点を書き込みます。(もし、-snapshotが使われている場合)
`info subcommand'
システムの状態についていろいろな情報を表示します。
`info network'
ネットワークの状態を表示します。
`info block'
ブロックデバイスを表示します。
`info registers'
CPUレジスタを表示します。
`info history'
コマンド履歴を表示します。
`info pci'
エミュレートされているPCIデバイスについて表示します。
`info usb'
仮想USBハブに接続されているUSBデバイスについて表示します。
`info usbhost'
すべてのUSBホストデバイスについて表示します。
`q or quit'
エミュレータを終了します。
`eject [-f] device'
リムーバブルメディアを取り出します。(強制的にするには'-f'オプションを使ってください。)
`change device filename'
リムーバブルメディアを入れ替えます。
`screendump filename'
filenameという名前で画面をPPMイメージに保存します。
`log item1[,...]'
`/tmp/qemu.log'に指定したものについてログを作成します。
`savevm filename'
すべてのバーチャルマシンの状態を filenameに保存します。
`loadvm filename'
すべてのバーチャルマシンの状態をfilenameから、元に戻します。
`stop'
エミュレーションをストップします。
`c or cont'
エミュレーションを再開します。
`gdbserver [port]'
gdbserverのセッションをスタートします。(デフォルトでは port=1234です。)
`x/fmt addr'
addrから、仮想メモリをダンプします。
`xp /fmt addr'
addrから、物理メモリをダンプします。 fmtにより、コマンドの出力のデータのフォーマットを指定します。 シンタックスは `/{count}{format}{size}'です。
count
は、ダンプする数を指定します。
format
は、 x (16進数), d (符号つき10進数), u (符号なし10進数), o (8進数), c (文字) or i (アセンブラ命令)です。
size
は、b (8 bits), h (16 bits), w (32 bits), g (64 bits)です。x86では、 hw は、i フォーマットとともに指定し、16ビットと32ビットの命令のサイズを選択することができます。
例:
`p or print/fmt expr'
式の値を表示します。 fmtで表されるフォーマット部分だけが使われます。
`sendkey keys'
keysをエミュレータに送ります。 -を使って、いくつかのキーを同時に押すことができます。 例:
sendkey ctrl-alt-f1
このコマンドは、ローレベルでグラフィカルユーザーインターフェースに割り込みをかけるキーを送るのに便利です。たとえば、X Windows のctrl-alt-f1などのように。
`system_reset'
システムをリセットします。
`usb_add devname'
USBデバイスdevnameをQEMUバーチャルハブに接続します。devnameは、仮想デバイス名(たとえばmouse)もしくは、ホストのUSBデバイス識別子です。ホストのUSBデバイス識別子は、次のようなシンタックスを持っています。host:bus.addrもしくは、host:vendor_id:product_id
`usb_del devname'
USBデバイスdevnameをQEMU仮想USBハブから取り除きます。devnameは、bus.addrというシンタックスを持ちます。モニターコマンドのinfo_usbというコマンドで、取り除くデバイスを確認してください。

3.5.2 整数の表現方法

モニターでは、すべての整数の引数について整数の表現方法を使うことができます。 $というプレフィックスをつけることで、レジスタの名前を使って、特定のCPUのレジスタの値を得ることができます。

3.6 ディスクイメージ

バージョン0.6.1から、QEMUは多くのディスクイメージをサポートします。 増加するディスクイメージ(空でないセクターが書き込まれるごとに大きくなる)や、圧縮された、暗号化されたディスクイメージを含みます。

3.6.1 ディスクイメージ作成のクイックスタート

次のコマンドを使ってディスクイメージをつくれます。

qemu-img create myimage.img mysize

ここで、myimage.imgは、ディスクイメージのファイルの名前で、mysizeは、そのキロバイトでの大きさです。 Mを後ろにつけることでメガバイトでサイズを指定したり、 Gを後ろにつけてギガバイトに指定できます。 See section 3.6.3 qemu-imgの起動 詳しくは、このセクションを見てください。

3.6.2 スナップショットモード

`-snapshot' オプションを使う場合は、すべてのディスクイメージはリードオンリーとして扱われます。ディスクのセクターに書き込みがあると、 `/tmp' ディレクトリにある一時ファイルに書かれることになります。けれども、モニターでcommitを使う(もしくは、 シリアルコンソールでC-a s を押す)ことによって、rawディスクイメージに書き戻すことができます。

3.6.3 qemu-imgの起動

使い方: qemu-img command [command options]

次のコマンドがサポートされます:

`create [-e] [-b base_image] [-f fmt] filename [size]'
`commit [-f fmt] filename'
`convert [-c] [-e] [-f fmt] filename [-O output_fmt] output_filename'
`info [-f fmt] filename'

コマンドのパラメータ:

filename
は、ディスクイメージのファイル名です。
base_image
は、コピーオンライトイメージのベースとして使われるリードオンリーのディスクイメージです。コピーオンライトイメージは変更されたデータのみを保存します。
fmt
は、ディスクイメージのフォーマットです。 ほとんどのケースについて自動的に判断してくれます。 次のようなフォーマットがサポートされています:
raw
生の(Raw)ディスクイメージフォーマットです(デフォルト)。このフォーマットは、単純で他のエミュレーターにエクスポートするのが容易だという利点があります。。 もし、ファイルシステムがholes(Linux上のext2や、ext3のような)をサポートしていれば、書き込まれたセクターのみがディスクの容量を使用します。 qemu-img infoを使うか、Unix/Linux上でls -lsを使うことで、イメージによって使われている現実のサイズを知ることができます。
qcow
QEMUのイメージフォーマット、最も多目的なフォーマットです。より小さなイメージを作るときに使ってください(たとえばWindows上のようなholesをサポートしていないファイルシステムで便利です)。オプションでAES暗号やzlibベースの圧縮が使えます。
cow
ユーザーモードLinuxのコピーオンライトイメージフォーマット。QEMUで大きくなる唯一のフォーマットとして使われています。以前のバージョンとの互換性のためだけにサポートされます。win32上では使えません。
vmdk
VMware 3 と 4 互換のイメージフォーマット。
cloop
Linuxの圧縮ループ(Compressed Loop)イメージ。例えば、KnoppixのCD-ROMのような圧縮されたCD-ROMイメージを直接再利用するときにのみ便利です。
size
は、キロバイトでのディスクイメージの大きさです。オプションでM(megabyteとG(gigabyte)を後ろにつけることがサポートされています。
output_filename
は、出力するディスクイメージファイルの名前です。
output_fmt
は、出力するフォーマットです。
-c
は、出力するイメージが圧縮されること(qcowフォーマットのみ)を指定します。
-e
は、出力するイメージが暗号化されること(qcowフォーマットのみ)を指定します。

コマンドの解説:

`create [-e] [-b base_image] [-f fmt] filename [size]'
新しいディスクイメージをfilenameという名前、sizeというサイズ、 fmtというフォーマットで作ります。 もし、base_imageが指定されると、イメージファイルには、base_imageとの違いのみが記録されます。 この場合、サイズを指定する必要はありません。 commitというモニターのコマンドが使われるまで、base_imageは、けっして変更されません。
`commit [-f fmt] filename'
filenameという名前に記録された変更をベースのイメージファイルに書き込みます。
`convert [-c] [-e] [-f fmt] filename [-O output_fmt] output_filename'
filenameというディスクイメージを、output_fmtというフォーマットを用いて、output_filenameというディスクイメージに変換します。 オプションで、暗号化 (-eオプション)もしくは、圧縮(-cオプション)が使えます。 qcowというフォーマットのみが、暗号化と圧縮をサポートします。圧縮は、リードオンリーです。これは、圧縮されたセクターが再書き込みされると、圧縮されないデータとして再書き込みされることを意味します。 暗号化は、AESフォーマットを使います。とても安全なものです(128bitキー)。最高の安全性を求めるには長いパスワード(16文字)を用いてください。 qcowcowといった大きくなるフォーマットを使うとき、イメージの変換はより小さなイメージを得るのにも便利です。:空のセクターは検出され、出力するイメージには抑制されます。
`info [-f fmt] filename'
filenameという名前のディスクイメージについての情報を表示します。特に、表示されるサイズとディスク上のサイズが違うときにサイズを知るのに使います。

3.6.4 Virtual FATディスクイメージ

QEMUは、ディレクトリツリーから自動的にVirtual FATディスクイメージを作ります。 使うには、ただ、次のようにタイプするだけです。

qemu linux.img -hdb fat:/my_directory

すると、`/my_directory'にあるすべてのファイルにアクセスできます。ディレクトリをディスクイメージにコピーしたり、SAMBAやNFSでexportする必要がありません。デフォルトのアクセスは、read-onlyです。 フロッピーは、:floppy:オプションでエミュレートされます。

qemu linux.img -fda fat:floppy:/my_directory

リード/ライトサポートは次のオプションでサポートされますが、テスト(ベータステージ)です。 :rw: オプション:

qemu linux.img -fda fat:floppy:rw:/my_directory

決してしてはならないこと。

3.7 ネットワークのエミュレーション

QEMUは、いくつかのネットワークカード(PCターゲットではNE2000ボード)をシミュレートします。そして、任意の仮想ローカルエリアネットワーク(VLAN)に接続できます。 ホストのTAPデバイスは、QEMUのVLANに接続できます。VLANは、大きなネットワークをシミュレートするために分離されたQEMUのインスタンスを接続することに使えます。 たとえば、特権を持たないユーザーモードネットワークスタックを基本的なネットワーク接続を持たせるため、TAPデバイスに取り替えることができます。

3.7.1 VLAN

QEMUは、いくつかのVLANをシミュレートします。VLANは、いくつかのネットワークデバイスの間で、仮想コネクションを象徴的に表すことができます。これらのデバイスは、たとえば、QEMUの仮想ネットワークカードであったり、ホストのデバイス(TAPデバイス)であったりします。

3.7.2 TAPネットワークインターフェースの使い方

これは、現実のネットワークとQEMUを接続する標準的な方法です。 QEMUは、ホスト(tapNと呼ぶ)に仮想ネットワークデバイスを付加します。そして、現実のイーサネットカードであるかのように構成することが可能です。 たとえば、`linux-test-xxx.tar.gz'ファイルをダウンロードし、`qemu-ifup'スクリプトを`/etc'にコピーします。そして、`qemu-ifup'に含まれるifconfigコマンドがrootで実行できるよう、sudoコマンドを適切に設定します。TAPネットワークインターフェースがあなたのカーネルでサポートされていることを確認しなければなりません。`/dev/net/tun'デバイスがないといけません。 section 3.8 Linuxの直接起動を見て、Linuxのディストリビューションでネットワークを使う例を見てください。また、section 3.3 起動を見て、TAPネットワークインターフェースを使うコマンドラインの例を見てください。

3.7.3 ユーザーモードでのネットワークの使い方

`-net user'オプションを付けることにより(`-net'を指定しない場合のデフォルトの設定です。)、QEMUは、完全なユーザーモードで、ネットワークを行います。(仮想ネットワークを使用するときにrootの特権が必要ありません。) 仮想的なネットワークの構成はつぎのようです。:


         QEMU VLAN      <------>  ファイアーウォール/DHCP server <-----> インターネット
                           |          (10.0.2.2)
                           |
                           ---->  DNSサーバ (10.0.2.3)
                           |     
                           ---->  SMBサーバ (10.0.2.4)

QEMU VMはファイアーウォールの後ろにあって、すべての入ってくる接続をブロックするよう動作します。QEMU VM内では、DHCPクライアントを使って自動的にネットワークを設定することができます。 DHCPサーバは10.0.2.15から始まるアドレスを設定します。 ユーザーモードでのネットワークが動作していることを確認するためには、アドレス10.0.2.2にpingしたり、QEMUの仮想DHCPサーバから10.0.2.xの範囲のアドレスを割り当てられていることをみることで確認できます。 root特権が必要になるので、pingはインターネットには信頼性をもってサポートされていないことに注意してください。これは、ローカルルータ(10.0.2.2)にのみpingできることを意味します。 装備されているTFTPサーバを使うときは、ルーターはTFTPサーバーでもあります。 `-redir'オプションを使う場合、TCPもしくはUDPのコネクションは、ホストからゲストへリダイレクトされます。たとえば、X11、telnet、SSHといったコネクションをリダイレクトできます。

3.7.4 QEMUの間でのVLANの接続

`-net socket'オプションを使うことで、いくつかのQEMUにまたがるVLANを構成することができます。section 3.3 起動に、基本的な例があります。

3.8 Linuxの直接起動

このセクションでは、完全に起動可能なイメージを作らずにLinuxをQEMUで動かすことについて説明します。これは、素早いLinuxのカーネルのテストに有効です。QEMUのネットワークの構成の仕方についても説明します。

  1. `linux-test-xxx.tar.gz'という圧縮ファイルをダウンロードします。 Linuxのカーネルとディスクイメージが含まれます。
  2. オプション: もし、ネットワークサポートを得たければ(たとえば、x11サンプルを起動したい場合), `qemu-ifup' というスクリプトを `/etc'にコピーしないといけません。そして、 適切に sudoできるようにします。 `qemu-ifup'に含まれるifconfigコマンドはrootで実行される必要があるからです。 あなたのホストカーネルはTUN/TAPネットワークインターフェースをサポートしているか確認する必要があります: `/dev/net/tun'デバイスがなくてはなりません。 ネットワークが使用可能になると、ホストのカーネルとエミュレートされたカーネルの間で仮想的なネットワークの接続が作られます。エミュレートされたカーネルはIPアドレス172.20.0.2でホストのカーネルから見ることができます。ホストのカーネルはエミュレートされたカーネルからはIPアドレス172.20.0.1で見ることができます。
  3. qemu.shを実行します。次のような出力が得られます:
    > ./qemu.sh 
    Connected to host network interface: tun0
    Linux version 2.4.21 (bellard@voyager.localdomain) (gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)) #5 Tue Nov 11 18:18:53 CET 2003
    BIOS-provided physical RAM map:
     BIOS-e801: 0000000000000000 - 000000000009f000 (usable)
     BIOS-e801: 0000000000100000 - 0000000002000000 (usable)
    32MB LOWMEM available.
    On node 0 totalpages: 8192
    zone(0): 4096 pages.
    zone(1): 4096 pages.
    zone(2): 0 pages.
    Kernel command line: root=/dev/hda sb=0x220,5,1,5 ide2=noprobe ide3=noprobe ide4=noprobe ide5=noprobe console=ttyS0
    ide_setup: ide2=noprobe
    ide_setup: ide3=noprobe
    ide_setup: ide4=noprobe
    ide_setup: ide5=noprobe
    Initializing CPU#0
    Detected 2399.621 MHz processor.
    Console: colour EGA 80x25
    Calibrating delay loop... 4744.80 BogoMIPS
    Memory: 28872k/32768k available (1210k kernel code, 3508k reserved, 266k data, 64k init, 0k highmem)
    Dentry cache hash table entries: 4096 (order: 3, 32768 bytes)
    Inode cache hash table entries: 2048 (order: 2, 16384 bytes)
    Mount cache hash table entries: 512 (order: 0, 4096 bytes)
    Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)
    Page-cache hash table entries: 8192 (order: 3, 32768 bytes)
    CPU: Intel Pentium Pro stepping 03
    Checking 'hlt' instruction... OK.
    POSIX conformance testing by UNIFIX
    Linux NET4.0 for Linux 2.4
    Based upon Swansea University Computer Society NET3.039
    Initializing RT netlink socket
    apm: BIOS not found.
    Starting kswapd
    Journalled Block Device driver loaded
    Detected PS/2 Mouse Port.
    pty: 256 Unix98 ptys configured
    Serial driver version 5.05c (2001-07-08) with no serial options enabled
    ttyS00 at 0x03f8 (irq = 4) is a 16450
    ne.c:v1.10 9/23/94 Donald Becker (becker@scyld.com)
    Last modified Nov 1, 2000 by Paul Gortmaker
    NE*000 ethercard probe at 0x300: 52 54 00 12 34 56
    eth0: NE2000 found at 0x300, using IRQ 9.
    RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
    Uniform Multi-Platform E-IDE driver Revision: 7.00beta4-2.4
    ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx
    hda: QEMU HARDDISK, ATA DISK drive
    ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
    hda: attached ide-disk driver.
    hda: 20480 sectors (10 MB) w/256KiB Cache, CHS=20/16/63
    Partition check:
     hda:
    Soundblaster audio driver Copyright (C) by Hannu Savolainen 1993-1996
    NET4: Linux TCP/IP 1.0 for NET4.0
    IP Protocols: ICMP, UDP, TCP, IGMP
    IP: routing cache hash table of 512 buckets, 4Kbytes
    TCP: Hash tables configured (established 2048 bind 4096)
    NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
    EXT2-fs warning: mounting unchecked fs, running e2fsck is recommended
    VFS: Mounted root (ext2 filesystem).
    Freeing unused kernel memory: 64k freed
     
    Linux version 2.4.21 (bellard@voyager.localdomain) (gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)) #5 Tue Nov 11 18:18:53 CET 2003
     
    QEMU Linux test distribution (based on Redhat 9)
     
    Type 'exit' to halt the system
     
    sh-2.05b# 
    
  4. これで、仮想的なシリアルコンソール内でカーネルを操作することができます。例えば、 lsを動かします。 Ctrl-a hとタイプすると、仮想シリアルコンソール内で使えるキーのヘルプが表示されます。特に Ctrl-a x を使うとQEMUを終了し、Ctrl-a bはMagic SysRqキーとして機能します。
  5. ネットワークが可能な場合は、エミュレータ内で`/etc/linuxrc'スクリプトを起動します。(最初のドットを忘れないで):
    . /etc/linuxrc
    
    すると、エミュレートされたLinuxからあなたのPCに、x11のコネクションが張られます:
    xhost +172.20.0.2
    
    これで`xterm'`xlogo' を起動し、仮想的なLinuxシステムが現実のものになっていることを確認できます!

注意:

  1. カーネル2.5.74がアーカイブに含まれます。qemu.sh内のbzImageを置き換えることで試すことができます。
  2. qemuをきれいに終わらせるためには、 qemu内で shutdown をします。Linuxのshutdownが終わると自動的にqemuも終わります。
  3. 存在しないIDEインターフェースのプローブをさせないことで少し速く起動できます。そうするためには、カーネルのコマンドラインに次のようなオプションをつけます:
    ide1=noprobe ide2=noprobe ide3=noprobe ide4=noprobe ide5=noprobe
    
  4. サンプルのディスクイメージはplex86プロジェクトのKevin Lawtonによって作られたものを変更したものです。(www.plex86.org).

3.9 USBのエミュレーション

QEMUは、PCI UHCI USBコントローラと、それに接続された8つのポートのUSBハブをエミュレートします。仮想的にUSBデバイスをハブに挿したり、現実のUSBデバイスを挿したりできます。(実験的に、Linuxホストのみで)。

3.9.1 仮想的なUSBデバイスの使い方

仮想的なUSBマウスデバイスがテスト用に利用可能です。 次のようなコマンドで試すことができます。

# マウスデバイスを加えます。
(qemu) usb_add mouse 

# QEMU仮想USBハブに接続された仮想USBデバイスを表示します。
(qemu) info usb
  Device 0.3, speed 12 Mb/s

# しばらく後マウスを削除します。
(qemu) usb_del 0.3

`-usbdevice'は、モニターコマンドと同じです。 usb_add.

3.9.2 LinuxホストでのUSBデバイスの使い方

注意:これは、実験的な機能です。使用するとQEMUが遅くなります。リアルタイムのストリーミングが必要なUSBデバイス(USBビデオカメラなど)は、まだサポートされていません。

  1. もし初期のLinux 2.4カーネルを使っている場合、Linuxのドライバが実際にUSBデバイスを使っていないことを確かめてください。簡単にそれをやるには、`mydriver.o'`mydriver.o.disabled'に名前を変えて、該当するカーネルモジュールを使用しないようにしてください。
  2. `/proc/bus/usb'が動いていることを確認してください。(ほとんどのLinuxディストリビューションでは、デフォルトで使用可能になっているはずです。)このようなものが見れるはずです。
    ls /proc/bus/usb
    001  devices  drivers
    
  3. rootだけがUSBデバイスに直接アクセスできるため、rootでQEMUを起動するか使用したいUSBデバイスの許可を変える必要があります。テスト用には、つぎのことで十分です。
    chown -R myuid /proc/bus/usb
    
  4. QEMUを起動し、モニター内ですること:
    info usbhost
      Device 1.2, speed 480 Mb/s
        Class 00: USB device 1234:5678, USB DISK
    
    使えるデバイスのリストを確認するべきです。(動かないハブを決して動かそうとしてはいけません。)
  5. つぎのようにしてQEMUにデバイスを加える:
    usb_add host:1234:5678
    
    通常、ゲストOSはデバイスが挿入されたとき報告します。 同じことを`-usbdevice'オプションでできます。
  6. QEMU内で、ホストのUSBデバイスを試すことができます。

QEMUを再起動したときは、もう一度動かすためUSBデバイスを抜き差ししないといけません。 (これはバグです。)

3.10 GDBの使い方

QEMUには、gdbを使う基本的なサポートがあります。それにより、仮想マシンが走っているときに、その状態を検査するために 'Ctrl-C' がつかえます。 gdbを使うためには、qemuを '-s' オプションとともに起動します。qemuはgdbの接続を待ちます:

> qemu -s -kernel arch/i386/boot/bzImage -hda root-2.4.20.img -append "root=/dev/hda"
Connected to host network interface: tun0
Waiting gdb connection on port 1234

次にgdbを 'vmlinux' を実行ファイルに指定して起動します:

> gdb vmlinux

gdb上で、QEMUと接続します:

(gdb) target remote localhost:1234

これでgdbを普通に使うことができます。たとえば、'c' をカーネルを起動するために使います:

(gdb) c

ここで、システムコードをgdbで使うための便利なヒントを示します:

  1. info reg を使って、すべてのCPUレジスタを表示します。
  2. x/10i $eip で、PC(プログラムカウンタ)の位置のコードを表示します。
  3. set architecture i8086 で、16ビットのコードをダンプするよう指示します。そして、 x/10i $cs*16+*eip で、PC(プログラムカウンタ)の位置のコードをダンプします。

3.11 ターゲットOSに特有な情報

3.11.1 Linux

X11でSVGAグラフィックモードにアクセスするには、vesaもしくは、cirrus X11ドライバーを使います。 最適なパフォーマンスのためには、ゲストとホストのOSで16ビットカラーデプスを使います。 ゲストに2.6のLinuxカーネルを使うときは、 カーネルのコマンドラインオプションにclock=pitオプションを付け加えるべきです。 2.6のLinuxカーネルはデフォルトで厳密なリアルタイムクロックのチェックを行っており、QEMUは正確にシミュレートできないからです。 ゲストに2.6のLinuxカーネルを使う場合は、4G/4Gパッチが有効になっていないことを確認してください。QEMUはこのパッチで遅くなります。QEMUアクセレレータモジュールも遅くなります。 初期のFedora Core 3 Linuxのカーネル(<2.6.9-1.724_FC3)では、デフォルトでこのパッチを含みます。それより新しいカーネルには、含まれません。

3.11.2 Windows

もし、遅いホストをお使いなら、Windows 95を使うほうがスピードが出てよいです。 Windows 2000もいい選択です。

3.11.2.1 SVGAグラフィックモードのサポート

QEMUは、Cirrus Logic GD5446ビデオカードをエミュレートします。 Windows 95から始まるすべてのWindowsのバージョンで認識され、このグラフィックカードを使うことができます。 最適なパフォーマンスを得るには、ゲストとホストのOSで16ビットカーラーデプスを使います。

3.11.2.2 CPU使用率の低減

Windows 9xは、CPUのHLT命令を正しく使用していません。 その結果、アイドル状態でもホストのCPUサイクルを使用します。 http://www.user.cityline.ru/~maxamn/amnhltm.zipからユーティリティーをインストールすることで、この問題を解決できます。そのようなツールは、NT、2000、XPでは必要ないことに注意してください。

3.11.2.3 Windows 2000 disk fullという問題

Windows 2000は、インストールの際disk fullのエラーが出るというバグを持っています。インストールのときは、その問題を回避する`-win2k-hack'というオプションを使ってください。 Windows 2000をインストールした後は、このオプションは必要ありません。(このオプションはIDEの転送速度を遅くします。)

3.11.2.4 Windows 2000のシャットダウン

Windows 98は、自動でシャットダウンできますが、Windows 2000は、自動でシャットダウンできません。 Windows 2000は、BIOSから供給されるAPMドライバを自動で使用しないことからきています。 修正するためには、次のようにします。(Struan Bartlettさんに感謝。) コントロールパネル=>ハードウェアの追加/削除 & 次=>デバイスの追加/トラブルシュート=>デバイスの追加 & 次=>いいえ リストからハードウェアの選択 & 次=>NT Apm/Legacy Support=>次(もう一度)何回か。これでドライバがインストールされ、Windows 2000は正しくQEMUに適当なときにシャットダウンするよう指示します。

3.11.2.5 UnixとWindowsの間のディレクトリの共有

`-smb'オプションについてのヘルプをsection 3.3 起動で見てください。

3.11.2.6 Windows XP securityの問題

Windows XPのいくつかのリリースでは、正確にインストールされますが、セキュリティのエラーがブート時にでます:

A problem is preventing Windows from accurately checking the
license for this computer. Error code: 0x800703e6.

わかっている対処はネットワークサポートなしで、セーフモードでブートすることだけです。 将来のQEMUのリリースでは、このバグはなくなるでしょう。

3.11.3 MS-DOS と FreeDOS

3.11.3.1 CPU使用率の低減

DOSは、CPUのHLT命令を正確に使用していません。その結果、アイドル時にもホストのCPUサイクルを使用します。 http://www.vmware.com/software/dosidle210.zipからユーティリティーをインストールすることで、この問題を解決できます。

4. PCでないターゲットに対するQEMUシステムエミュレータ

QEMUは、一般的なエミュレータであり、PCでないマシンを多くエミュレートします。 オプションのほとんどはPCエミュレータと同じです。違いは次のセクションで説明します。

4.1 QEMU PowerPCシステムエミュレータ

`qemu-system-ppc' という実行ファイルを使って、完全なPREPもしくはPowerMacのPowerPCシステムをシミュレートします。 QEMUは、次のようなPowerMac周辺機器をエミュレートします。:

QEMUは、次のようなPREP周辺機器をエミュレートします。:

QEMUは、 http://perso.magic.fr/l_indien/OpenHackWare/index.htmで得られるOpen Hack'Ware Open Firmware互換のBIOSを使用しています。 次のオプションは、PowerPCエミュレーションに特有のものです:

`-g WxH[xDEPTH]'
初期のVGAグラフィックモードをセットします。デフォルトは、800x600x15です。

これ以上の情報は http://perso.magic.fr/l_indien/qemu-ppc/ で得られます。

4.2 Sparc32システムエミュレータの起動

`qemu-system-sparc'という実行ファイルをつかって、JavaStation(sun4m アーキテクチャ)をシミュレートします。エミュレーションは、なんとか完全なものになっています。 QEMUは、次のようなsun4m周辺機器をエミュレートします。

周辺機器の数はアーキテクチャで決まっています。 QEMUは、Prollを使います。http://people.redhat.com/zaitcev/linux/で得られるPROMの代替品です。必要とされるQEMU特有なパッチは、ソースコードに含まれます。 Linux 2.6のカーネルとラムディスクのサンプルはQEMUのサイトにあります。 現在、Linux 2.4やNetBSD、OpenBSDは動作しないことに注意してください。 次のオプションはSparcエミュレーションに特有なものです。

`-g WxH'
初期化時のTCXグラフィックモードをセットします。デフォルトは1024x768です。

4.3 Sparc64システムエミュレータの起動

`qemu-system-sparc64'という実行ファイルでSun4uマシンをシミュレートします。 エミュレータはまだ、使えません。 QEMUは、次のようなsun4u周辺機器をエミュレートします。

4.4 MIPSシステムエミュレータの起動

`qemu-system-mips'という実行ファイルで、MIPSマシンをエミュレートします。 エミュレータはLinuxのカーネルをブートできNFSを使ったDebian Linuxのインストールを走らせることができます。 次のデバイスがエミュレートされます:

より詳しい情報は、メーリングリストのアーカイブにあります。

4.5 ARMシステムエミュレータの起動

`qemu-system-arm'というファイルでARMマシンをエミュレートします。 ARMのIntegrator/CPボードがエミュレートされ、次のデバイスが使えます。

Linux 2.6のテストイメージがQEMUのウェブサイトで得られます。 より詳しくは、QEMUメーリングリストのアーカイブにあります。

5. QEMU Linux ユーザースペースエミュレータ

5.1 クイックスタート

Linuxのプロセスを立ち上げるには、QEMUはそれだけで実行可能なプログラムとダイナミックにリンクされるターゲット(x86)のライブラリが必要です。

5.2 Wineの起動

5.3 コマンドラインオプション

使い方: qemu-i386 [-h] [-d] [-L path] [-s size] program [arguments...]

`-h'
ヘルプを表示します
`-L path'
x86用elfインタプリタのパスをセットします(default=/usr/local/qemu-i386)
`-s size'
x86スタックサイズをバイト単位でセットします(default=524288)

デバッグオプション:

`-d'
ログをとります(logfile=/tmp/qemu.log)
`-p pagesize'
ホストのページサイズを'pagesize'だとします

6. ソースコードからのコンパイル

6.1 Linux/Unix

6.1.1 コンパイル

まず、ソースを解凍しなくてはいけません。:

cd /tmp
tar zxvf qemu-x.y.z.tar.gz
cd qemu-x.y.z

そして、QEMUをconfigureして、作ります(通常オプションは必要ありません)。

./configure
make

そして、rootで次のようにタイプします。:

make install

to install QEMU in `/usr/local'.

6.1.2 テストされたツールのバージョン

QEMUのコンパイルを成功させるには、正しいツールを使うことがとても大切です。 もっとも大切なのは、gccです。テストされていないgccのバージョンを使ってQEMUが動作するかどうかを保証することはできません。 もし、違うバージョンのgccを動かしたい場合は、'configure'と'Makefile'を見てください。

host      gcc      binutils      glibc    linux       distribution
----------------------------------------------------------------------
x86       3.2      2.13.2        2.1.3    2.4.18
          2.96     2.11.93.0.2   2.2.5    2.4.18      Red Hat 7.3
          3.2.2    2.13.90.0.18  2.3.2    2.4.20      Red Hat 9

PowerPC   3.3 [4]  2.13.90.0.18  2.3.1    2.4.20briq
          3.2

Alpha     3.3 [1]  2.14.90.0.4   2.2.5    2.2.20 [2]  Debian 3.0

Sparc32   2.95.4   2.12.90.0.1   2.2.5    2.4.18      Debian 3.0

ARM       2.95.4   2.12.90.0.1   2.2.5    2.4.9 [3]   Debian 3.0

[1] On Alpha, QEMU needs the gcc 'visibility' attribute only available
    for gcc version >= 3.3.
[2] Linux >= 2.4.20 is necessary for precise exception support
    (untested).
[3] 2.4.9-ac10-rmk2-np1-cerf2

[4] gcc 2.95.x generates invalid code when using too many register
variables. You must use gcc 3.x on PowerPC.

6.2 Windows

6.3 Linux上のWindows用クロスコンパイル

Note: 現在、WineはWin32用のQEMUを起動できないようです。

6.4 Mac OS X

Mac OS Xのパッチは、QEMUに完全にはマージされていません。そのため、必要な情報を得るためにはQEMUメーリングリストのアーカイブを見る必要があります。


This document was generated on 27 January 2006 using texi2html 1.56k.