Raspberry Pi を 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 を起動することも出来ます.
オプションについて
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 のイメージファイルを拡張する を参考にしてください.
参考
- QEMU – Emulating Raspberry Pi the easy way (Linux or Windows!) (http://xecdesign.com/qemu-emulating-raspberry-pi-the-easy-way/)
- BCM2835 (http://ja.broadcom.com/products/BCM2835)
その他
勝手に中国語訳されたものがこちらにあります. (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 を変更.