如何在 QEMU 上模拟 Raspberry Pi 2?
How to emulate the Raspberry Pi 2 on QEMU?
前段时间我在this article之后模拟了Raspberry Pi,但是这个方法有几个问题:
- 速度很慢。
- 显示解决方案限制为 800x600。
- 您不能模拟超过 256mb 的内存。
此外,Qemu 中没有针对新的 Broadcom BCM2836 或任何其他基于 cpu 的 arm7 的仿真。然而,有几个原因,为什么模仿 Raspberry Pi 会很有趣。因此,我对任何提示都感兴趣,这些提示将我推向正确的方向,以便使用 Qemu 或 Linux.
下的任何其他仿真软件获得工作 Raspberry Pi 2 仿真
如果您想 运行 一个 Raspberry Pi 2 构建机器人或类似的东西,您应该看看 运行ning Qemu in user/static mode。我在虚拟机中使用 Linux 进行了尝试,与 Qemu 系统仿真相比,它的速度相当快。不幸的是,它只模拟 CPU,因此您将无法测试游戏或 Wayland/Weston。
使用这种方法,我能够在大约一个小时内为我的 Pi 2 构建内核。
如果您对构建 qemu 感到满意,您可以在此处找到对 pi2 系统仿真的支持:https://github.com/0xabu/qemu。它不是特别快,并且设备模拟不完整,但您可以调整 RAM 和帧缓冲区的大小。
末尾有引导Raspbian的简要说明
Ubuntu 16.04,QEMU 2.9.0 -M raspi2,Raspbian 2016-05-27,香草内核
从源代码编译 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
挂载分区的第二个映像。最简单的方法是:
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加入的,而Ubuntu16.04只有QEMU 2.5.0,所以我们要从源码编译QEMU。但这并不难。
- GUI 显示但不响应鼠标/键盘,已在 SDL 和 VNC 上测试。但是 CLI 却工作得很好。因此,您不妨暂时使用具有 go GUI 的 Lite 图像。
- 没有联网
Ubuntu 16.04,QEMU 2.5.0,Raspbian 2016-05-27,修改内核
此方法使用 -M versatilepb
,它存在于 Ubuntu 16.04 的 QEMU 2.5.0 中。
缺点是你必须下载一个修改过的内核(见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
修改 Raspbian 图片,如在:https://github.com/dhruvvyas90/qemu-rpi-kernel/wiki/Emulating-Jessie-image-with-4.x.xx-kernel/0068f0c21d942b0f331e18014ff8e22c20cada5c
总结:
像我们为 -M raspi2
一样安装映像,但使用第二个分区而不是第一个分区:
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,香草内核
在这个较新的映像上,使用与 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: rootdelay=1
解决了这个问题,我必须尝试一下。
bztsrc/raspi3-tutorial
QEMU 上的 RPI3 裸机
https://github.com/bztsrc/raspi3-tutorial is a good set of examples that just work on QEMU, ultraquick getting started at: https://raspberrypi.stackexchange.com/questions/34733/how-to-do-qemu-emulation-for-bare-metal-raspberry-pi-images/85135#85135
前段时间我在this article之后模拟了Raspberry Pi,但是这个方法有几个问题:
- 速度很慢。
- 显示解决方案限制为 800x600。
- 您不能模拟超过 256mb 的内存。
此外,Qemu 中没有针对新的 Broadcom BCM2836 或任何其他基于 cpu 的 arm7 的仿真。然而,有几个原因,为什么模仿 Raspberry Pi 会很有趣。因此,我对任何提示都感兴趣,这些提示将我推向正确的方向,以便使用 Qemu 或 Linux.
下的任何其他仿真软件获得工作 Raspberry Pi 2 仿真如果您想 运行 一个 Raspberry Pi 2 构建机器人或类似的东西,您应该看看 运行ning Qemu in user/static mode。我在虚拟机中使用 Linux 进行了尝试,与 Qemu 系统仿真相比,它的速度相当快。不幸的是,它只模拟 CPU,因此您将无法测试游戏或 Wayland/Weston。
使用这种方法,我能够在大约一个小时内为我的 Pi 2 构建内核。
如果您对构建 qemu 感到满意,您可以在此处找到对 pi2 系统仿真的支持:https://github.com/0xabu/qemu。它不是特别快,并且设备模拟不完整,但您可以调整 RAM 和帧缓冲区的大小。
末尾有引导Raspbian的简要说明Ubuntu 16.04,QEMU 2.9.0 -M raspi2,Raspbian 2016-05-27,香草内核
从源代码编译 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
挂载分区的第二个映像。最简单的方法是:
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加入的,而Ubuntu16.04只有QEMU 2.5.0,所以我们要从源码编译QEMU。但这并不难。- GUI 显示但不响应鼠标/键盘,已在 SDL 和 VNC 上测试。但是 CLI 却工作得很好。因此,您不妨暂时使用具有 go GUI 的 Lite 图像。
- 没有联网
Ubuntu 16.04,QEMU 2.5.0,Raspbian 2016-05-27,修改内核
此方法使用 -M versatilepb
,它存在于 Ubuntu 16.04 的 QEMU 2.5.0 中。
缺点是你必须下载一个修改过的内核(见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
修改 Raspbian 图片,如在:https://github.com/dhruvvyas90/qemu-rpi-kernel/wiki/Emulating-Jessie-image-with-4.x.xx-kernel/0068f0c21d942b0f331e18014ff8e22c20cada5c
总结:
像我们为
-M raspi2
一样安装映像,但使用第二个分区而不是第一个分区: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,香草内核
在这个较新的映像上,使用与 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:rootdelay=1
解决了这个问题,我必须尝试一下。
bztsrc/raspi3-tutorial
QEMU 上的 RPI3 裸机
https://github.com/bztsrc/raspi3-tutorial is a good set of examples that just work on QEMU, ultraquick getting started at: https://raspberrypi.stackexchange.com/questions/34733/how-to-do-qemu-emulation-for-bare-metal-raspberry-pi-images/85135#85135