Raspbian を仮想マシン(QEMU)で動かす (1)

QEMU によって Raspbian を仮想環境で使えるようにした記録です。Raspberry Pi Zero の仮想化を想定しています。

大まかな流れは以下の通りです。

  1. VMWare Fusion 7.1.3 に Ubuntu 14.04 をインストール
  2. Ubuntu 14.04 に QEMU 2.0.0 をインストール
  3. QEMU 2.0.0 で Raspbian Jessie 2016-02-26 を動かす


VMWare FusionUbuntu をインストールしているのは、Mac 環境に実験目的のソフトをインストールしたくなかったからです。

以下の情報を参考にしました。

VMWare FusionUbuntu をインストール

手順は省略。インストール、アップデート後に 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

UbuntuQEMU をインストール

UbuntuQEMU をインストールします。

$ 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.zipQEMU の 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 に書かれています。