QEMU によって Raspbian を仮想環境で使えるようにした記録です。Raspberry Pi Zero の仮想化を想定しています。
大まかな流れは以下の通りです。
- VMWare Fusion 7.1.3 に Ubuntu 14.04 をインストール
- Ubuntu 14.04 に QEMU 2.0.0 をインストール
- QEMU 2.0.0 で Raspbian Jessie 2016-02-26 を動かす
VMWare Fusion に Ubuntu をインストールしているのは、Mac 環境に実験目的のソフトをインストールしたくなかったからです。
以下の情報を参考にしました。
- Raspberry Pi を QEMU でエミュレートする方法 (2015年7月更新) - 意識低い開発者のBlog
- Raspberry Pi notes : Emulating Jessie image with 4.1.7 kernel | Dexter's lab
VMWare Fusion に Ubuntu をインストール
手順は省略。インストール、アップデート後に uname を実行した結果は以下のとおり。
$ uname -a $ Linux ubuntu 3.13.0-83-generic #127-Ubuntu SMP Fri Mar 11 00:26:47 UTC 2016 i686 i686 i686 GNU/Linux
Ubuntu に QEMU をインストール
$ sudo apt-get install qemu $ qemu-system-arm -machine versatilepb -cpu help | grep arm1176
なお、Raspberry Pi 3 は Cortex A53、Raspberry Pi 2 は BCM2836 (Cortex A7)、Raspberry Pi 1 と Zero は BCM2835 (ARM1176) です。
参考:
Raspberry Pi 3 と 2 ではどうするのか途中まで調べましたが、断念しました。仮想 Arm64 マシンの作り方 が参考になりそうです。QEMU 2.5.0 をソースコードからインストールすると cortex-a53 はサポートされますが、cortex-a7 はありませんでした。
ちなみに、ソースコードから QEMU をインストールする手順は以下のとおりです。
まず、qemu-2.5.0.tar.bz2 をダウンロードします。configure にて zlib と glib が必要とエラーが表示されるので、zlib1g-dev と libglib2.0-dev をインストールします。make にて autoreconf が必要とエラーが表示されるので、dh-autoreconf をインストールします。
$ sudo apt-get install zlib1g-dev $ sudo apt-get install libglib2.0-dev $ sudo apt-get install dh-autoreconf
準備ができたところで、ビルドとインストールを実行します。
$ tar xvf qemu-2.5.0.tar.bz2 $ cd qemu $ ./configure --target-list=aarch64-softmmu $ make $ sudo make install
ビルド中に flex と bison が見つからないと表示されるので、flex と bison をインストールした方がいいかもしれません、、、。インストールしなくても、ビルドは完了します。
QEMU で Raspbian Jessie を動かす
Raspbian Jessie の Image 2016-02-26-raspbian-jessie-lite.zip と QEMU の Kernel Image kernel-qemu-4.1.13-jessie をダウンロードします。ダウンドードしたファイルは同じディレクトリにコピーしておきます。
そのままだと起動時にエラー終了してしまうので、Image を編集します。(root 権限で実行)
# mount -v -o offset=67108864 -t ext4 2016-02-26-raspbian-jessie-lite.img /path/to/mnt/ # cd /path/to/mnt # nano ./etc/ld.so.preload #/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so # nano ./etc/udev/rules.d/90-qemu.rules KERNEL=="sda", SYMLINK+="mmcblk0" KERNEL=="sda?", SYMLINK+="mmcblk0p%n" KERNEL=="sda2", SYMLINK+="root" # cd ~ # unmount /path/to/mnt
なお、offset には以下のように fdisk で取得した情報に基づいた値を計算した結果を指定します。
$ fdisk -l 2016-02-26-raspbian-jessie-lite.img Disk 2016-02-26-raspbian-jessie-lite.img: 1361 MB, 1361051648 bytes 255 heads, 63 sectors/track, 165 cylinders, total 2658304 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xe6a544c8 Device Boot Start End Blocks Id System 2016-02-26-raspbian-jessie-lite.img1 8192 131071 61440 c W95 FAT32 (LBA) 2016-02-26-raspbian-jessie-lite.img2 131072 2658303 1263616 83 Linux
.img2 の Start (Sector) が 131072 になっており Sector Size が 512 bytes なので、131072 * 512 = 67108864 (bytes) が .img2 の offset になります。
遂に、Raspbian Jessie を起動します。
$ qemu-system-arm -kernel kernel-qemu-4.1.13-jessie -cpu arm1176 -m 256 -machine versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2016-02-26-raspbian-jessie-lite.img
オプションの詳しいことは、Raspberry Pi を QEMU でエミュレートする方法 (2015年7月更新) - 意識低い開発者のBlog に書かれています。