少し前に私は次のRaspberry Piをエミュレートしました この記事 ですが、このアプローチにはいくつかの問題があります:
さらに、新しいBroadcom BCM2836または他のarm7ベースのCPUのエミュレーションは Qem にはありません。ただし、Raspberry Piをエミュレートすることが興味深い理由はいくつかあります。 LinuxでQemuまたはその他のエミュレーションソフトウェアを使用してRaspberry Pi 2エミュレーションを動作させるための正しい方向に私をプッシュするヒントに興味があります。
Qemuの作成に慣れている場合は、pi2システムエミュレーションのサポートをここで見つけることができます: https://github.com/0xabu/qem 。これは特に高速ではなく、デバイスエミュレーションは不完全ですが、RAMおよびフレームバッファーのサイズを変更できます。
https://github.com/0xabu/qemu/wiki の最後にRaspbianを起動するための簡単な説明があります
Raspberry Pi 2ビルドボットまたは類似のものを実行する場合は、 ユーザー/静的モードのQem の実行を確認する必要があります。私は仮想マシンでLinuxを使用してこれを試しましたが、Qemuシステムエミュレーションに比べてかなり高速です。残念ながら、CPUをエミュレートするだけなので、ゲームやWayland/Westonをテストすることはできません。
この方法を使用すると、Pi 2のカーネルを約1時間で構築できました。
Ubuntu 16.04、QEMU 2.9.0 -M raspi2、Raspbian 2016-05-27、Vanilla kernel
ソースからQEMU 2.9.0をコンパイルします。
Sudo apt-get build-dep qemu-system-arm
git clone --recursive git://git.qemu-project.org/qemu.git
cd qemu
git checkout v2.9.0
./configure
make `nproc`
イメージをダウンロードして、カーネルとdtsをそこから抽出します。
画像をダウンロードして解凍します。
wget http://downloads.raspberrypi.org/raspbian/images/raspbian-2016-05-31/2016-05-27-raspbian-jessie.Zip
unzip 2016-05-27-raspbian-jessie.Zip
パーティションの2番目のイメージをマウントします。最も簡単な方法は次のとおりです。
Sudo losetup -f --show -P 2016-05-27-raspbian-jessie.img
これは、Ubuntu 16.04の最新のlosetup
でのみ機能し、他の方法は次の場所にあります https://askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk -device/496576#496576
ループデバイスを出力します。例:
/dev/loop0
だから私たちはします:
Sudo mkdir /mnt/rpi
Sudo mount /dev/loop0p1 /mnt/rpi
cp /mnt/rpi/kernel7.img .
cp /mnt/rpi/bcm2709-rpi-2-b.dtb .
Sudo umount /mnt/rpi
Sudo losetup -d /dev/loop0
実行:
./arm-softmmu/qemu-system-arm \
-M raspi2 \
-append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2" \
-cpu arm1176 \
-dtb bcm2709-rpi-2-b.dtb \
-sd 2016-05-27-raspbian-jessie.img \
-kernel kernel7.img \
-m 1G \
-smp 4 \
-serial stdio \
;
その後、ホスト端末に表示されている端末にログインできます。
現在の制限:
-M raspi2
はQEMU 2.6.0で追加され、Ubuntu 16.04にはQEMU 2.5.0しかないため、ソースからQEMUをコンパイルする必要があります。しかし、これは難しくありません。Ubuntu 16.04、QEMU 2.5.0、Raspbian 2016-05-27、変更されたカーネル
このメソッドは、Ubuntu 16.04のQEMU 2.5.0にある-M versatilepb
を使用します。
欠点は、変更されたカーネルをダウンロードする必要があることです( https://raspberrypi.stackexchange.com/questions/47124/emulating-with-qemu-why-the-extra-kernel を参照)。画像を変更して、実際のシステムを代表しないようにします。
4.4.12
は、Raspbianイメージのカーネルバージョンであるため選択します。
そのカーネルblobを生成するプロセスは、次のリポジトリで説明されています https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/36ede073f4ccb64f60200ede36c231afe9502070/tools
この追加のカーネルイメージが必要な理由: https://raspberrypi.stackexchange.com/questions/47124/emulating-with-qemu-why-the-extra-kernel
概要:
-M raspi2
の場合と同様にイメージをマウントしますが、最初のパーティションではなく2番目のパーティションを使用します。
Sudo mount /dev/loop0p2 /mnt/rpi
画像を編集します。
# Comment out the line present there with #
Sudo vim /mnt/rpi/etc/ld.so.preload
# Comment out the lines of type: "/dev/mmcblk*"
Sudo vim /mnt/rpi/etc/fstab
実行:
Sudo apt-get install qemu-system-arm
qemu-system-arm \
-kernel kernel-qemu-4.4.12-jessie \
-cpu arm1176 \
-m 256 \
-M versatilepb \
-no-reboot \
-serial stdio \
-append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
-hda 2016-05-27-raspbian-jessie.img
[失敗] Ubuntu 17.04、QEMU 2.8.0 -M raspi2、Raspbian 2016-05-27、バニラカーネル
この新しいUbuntuでは、QEMU 2.8.0がデフォルトであるため、-M raspi2
のソースからQEMUをコンパイルする必要はありません。ただし、次のメッセージの後に2.8.0が起動時にハングします。
Console: switching to colour frame buffer device 100x30
これは、-M raspi2
がいかに不安定であるかを示しています。
[失敗] Ubuntu 16.04、QEMU 2.9.0 -M raspi2、Raspbian 2017-08-16、Vanillaカーネル
この新しいイメージでは、2016-05-27と同じ方法を使用して、ブート時にカーネルでパニックが発生します。
Please append a correct "root=" boot option; here are the available partitions:
...
[ 4.138114] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
TODO: sschoof言及rootdelay=1
がこれを解決するので、試してみる必要があります。
bztsrc/raspi3-tutorial
QEMUのRPI3ベアメタル
https://github.com/bztsrc/raspi3-tutorial は、QEMUで動作する優れたサンプルセットであり、次のURLから超迅速に開始できます https://raspberrypi.stackexchange.com/questions/34733/how-to-do-qemu-emulation-for-bare-metal-raspberry-pi-images/85135#85135