Raspberry Pi を QEMU でエミュレートする方法 (2015年7月更新)

Raspberry Pi を QEMU でエミュレートする方法です. これにより実機を用いずにテストを行うことが出来ます.
Raspbian on QEMU

環境

テストに用いたホストOSの環境は Debian 8 jessie amd64 です.
エミュレータは QEMU 2.1.0 を使用し, ゲストOSには, Raspberry Pi用に最適化された Debian の Raspbian (2014-09-09) を用います.

また, 以下の環境で同様の手順で動作できることを確認しています.

  • OS X Yosemite, QEMU 2.1.2, Raspbian (2014-09-09)
  • OS X Yosemite, QEMU 2.2.0, Raspbian (2014-12-24)
  • OS X Yosemite, QEMU 2.2.1, Raspbian (2015-05-05)

QEMU のインストール

QEMU をインストールしておきます. Debian の場合は apt で, OS X の場合は Homebrew などでインストールできます.

sudo aptitude install qemu
brew install qemu

以下を実行して必要なCPUがサポートされているかチェックします. arm1176 が表示されればOKです.
arm1176 が表示されない場合は, QEMU をビルドするか, 他のバイナリを探す必要があります.

qemu-system-arm -cpu '?' | grep arm1176

新しいバージョンの QEMU では明示的に machine を指定して, 確認する必要があります.

qemu-system-arm -M versatilepb -cpu '?' | grep arm1176

イメージのダウンロード

適当なディレクトリを作成し, http://www.raspberrypi.org/downloads から Raspbian のイメージをダウンロードし展開します.
同じディレクトリに http://xecdesign.com/downloads/linux-qemu/kernel-qemu https://www.dropbox.com/s/g8u93xblz1v1ly0/kernel-qemu または https://github.com/dhruvvyas90/qemu-rpi-kernel からカーネルイメージをダウンロードします.

初回起動

以下を実行して, 初回起動を行います.

qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash" -hda 2014-09-09-wheezy-raspbian.img

/etc/ld.so.preload を編集します. エディタには nano のほかに vi も利用することが出来るので好みのものを利用してください.

nano /etc/ld.so.preload

以下のように, 1行目をコメントアウトして保存し, ファイルを閉じます.

#/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so

次の手順はオプションです. この作業も最近の Raspbian では必須になりました. 設定しない場合次のステップの起動で失敗します.

QEMU によるエミュレーションではディスクを /dev/sda として認識しますが, 実機では /dev/mmcblk0 として認識されるためシンボリックリンクを張る設定です.
/etc/udev/rules.d/90-qemu.rules を作成して以下を記入します.

KERNEL=="sda", SYMLINK+="mmcblk0"
KERNEL=="sda?", SYMLINK+="mmcblk0p%n"
KERNEL=="sda2", SYMLINK+="root"

終了します.

exit

起動

以下のコマンドで起動します.

qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2014-09-09-wheezy-raspbian.img

ユーザー: pi, パスワード: raspberry でログインし, X を起動することも出来ます.Raspbian on QEMU 1

オプションについて

QEMU 起動時のオプションについての説明をまとめておきます.

-kernel kernel-qemu

ダウンロードしたカーネルイメージ kernel-qemu を利用する.

-cpu arm1176

ARM1176 CPUをエミュレートする. Raspberry Pi は Broadcom BCM2835 を搭載しており, これのアプリケーションプロセッサは ARM1176JZ-F となっている.

-m 256

RAMの容量を256MBにする. 256MBより大きい値を設定すると起動しない模様.

-M versatilepb

エミュレートするマシンの種類を設定する. versatilepb は ARM Versatile Platform Board

-no-reboot

再起動せずに終了する.

-serial stdio

ゲストの仮想シリアルポートをホストの標準入出力にリダイレクトする.

-append “root=/dev/sda2 panic=1 rootfstype=ext4 rw”

カーネルコマンドライン.

-hda 2014-09-09-wheezy-raspbian.img

ハードディスク0として, 2014-09-09-wheezy-raspbian.img を用いる.

その他

そのままのイメージではディスクの空き容量が少ないため, 必要に応じてディスクイメージを拡張する必要があります. 詳しくは Raspberry Pi のイメージファイルを拡張する を参考にしてください.

参考

その他

勝手に中国語訳されたものがこちらにあります. (Chinese version is available here.)

更新履歴

  • 2013/12/13 Debian 7 wheezy amd64, QEMU 1.1.2, Raspbian (2013-09-15) で動作確認.
  • 2014/7/31 Debian 8 jessie amd64, QEMU 2.0.0, Raspbian (2014-06-20) で動作確認.
  • 2014/9/28 Debian 8 jessie amd64, QEMU 2.1.0, Raspbian (2014-09-09) と OS X Yosemite, QEMU 2.1.2, Raspbian (2014-09-09) で動作確認.
  • 2014/11/2 中国語訳について追記.
  • 2015/1/19 OS X Yosemite, QEMU 2.2.0, Raspbian (2014-12-24) で動作確認.
  • 2015/5/9 エディタについて追記. OS X Yosemite, QEMU 2.2.1, Raspbian (2015-05-05) で動作確認.
  • 2015/7/13 kernel-qemu のダウンロード URL を変更.