【问题标题】:How to emulate the Raspberry Pi 2 on QEMU?如何在 QEMU 上模拟 Raspberry Pi 2?
【发布时间】:2015-05-06 23:57:36
【问题描述】:

前段时间我仿效了this article的树莓派,但是这种做法有几个问题:

  1. 速度很慢。
  2. 显示解决方案限制为 800x600。
  3. 您不能模拟超过 256mb 的内存。

此外,Qemu 中没有新的 Broadcom BCM2836 或任何其他基于 arm7 的 cpu 的仿真。但是,有几个原因可以说明为什么模拟 Raspberry Pi 会很有趣。因此,我对任何能够推动我朝着正确方向前进的提示感兴趣,以使用 Qemu 或 Linux 下的任何其他仿真软件获得可工作的 Raspberry Pi 2 仿真。

【问题讨论】:

  • 这篇文章已有 2 年历史,而您所指的链接已有 1 年历史。此外,问题的作者要求使用 qemu 运行 raspbian,而这个问题要求模拟某个硬件。
  • 年龄不是当前主要的欺骗标准,更多的是赞成票:meta.stackexchange.com/questions/147643/… 但在这种情况下你是对的,因为他们有相同的赞成票。

标签: linux raspberry-pi emulation raspberry-pi2 qemu


【解决方案1】:

Ubuntu 16.04,QEMU 2.9.0 -M raspi2,Raspbian 2016-05-27,香草内核

  1. 从源代码编译 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`
    
  2. 下载图像并从中提取内核和dts:

    1. 下载图片并解压:

      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
      
  3. 运行:

    ./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。但这并不难。
  • GUI 显示但没有响应鼠标/键盘,在 SDL 和 VNC 上测试。但是 CLI 可以完美运行。所以你还不如使用现在已经转到 GUI 的 Lite 映像。
  • 没有网络

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),并修改镜像,所以它不太能代表真实系统。

  1. 下载:https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/36ede073f4ccb64f60200ede36c231afe9502070/kernel-qemu-4.4.12-jessie

    我们选择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

  2. 修改 Raspbian 映像,如:https://github.com/dhruvvyas90/qemu-rpi-kernel/wiki/Emulating-Jessie-image-with-4.x.xx-kernel/0068f0c21d942b0f331e18014ff8e22c20cada5c

    总结:

    1. 像我们为 -M raspi2 所做的那样安装映像,但使用第二个分区而不是第一个:

      sudo mount /dev/loop0p2 /mnt/rpi
      
    2. 编辑图片:

      # 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
      
  3. 运行:

    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: sschoof mentions rootdelay=1 解决了这个问题,我必须尝试一下。

bztsrc/raspi3-tutorialQEMU 上的 RPI3 裸机

https://github.com/bztsrc/raspi3-tutorial 是一组很好的示例,仅适用于 QEMU,超快速入门:https://raspberrypi.stackexchange.com/questions/34733/how-to-do-qemu-emulation-for-bare-metal-raspberry-pi-images/85135#85135

【讨论】:

  • 较新内核中的Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) 可以通过附加参数的rootdelay=1 来解决。当内核需要rootfs时,看起来MMC还没有准备好。
  • 在那之后我又遇到了下一次恐慌。仍在调查中
  • 那么,有没有人在最新的 QEMU 上使用-M raspi2 成功引导 Raspian ?
  • 我在github上找到了内核和dtb文件:github.com/raspberrypi/firmware/tree/master/boot
【解决方案2】:

如果您喜欢构建 qemu,可以在此处找到对 pi2 系统仿真的支持:https://github.com/0xabu/qemu。它不是特别快,并且设备模拟不完整,但您可以调整 RAM 和帧缓冲区的大小。

https://github.com/0xabu/qemu/wiki末尾有启动Raspbian的简要说明

【讨论】:

  • 从 QEMU 2.6 开始,raspi2 机器类型是标准 QEMU 的一部分。
【解决方案3】:

如果你想运行 Raspberry Pi 2 构建机器人或类似的东西,你应该看看 running Qemu in user/static mode。我在虚拟机中使用 Linux 进行了尝试,与 Qemu 系统仿真相比,它相当快。不幸的是,它只模拟 CPU,因此您无法测试游戏或 Wayland/Weston。

使用这种方法,我能够在大约一个小时内为我的 Pi 2 构建内核。

【讨论】:

猜你喜欢
  • 2016-12-14
  • 2019-02-22
  • 2016-12-11
  • 2018-09-13
  • 2014-05-31
  • 1970-01-01
  • 2020-05-24
  • 2018-08-08
  • 2017-11-24
相关资源
最近更新 更多