如何在QEMU上模拟Raspberry Pi 2?

Phi*_*lux 11 linux qemu emulation raspberry-pi raspberry-pi2

前段时间我在本文后仿效了Raspberry Pi ,但这种方法有几个问题:

  1. 这很慢.
  2. 显示解决方案限制为800x600.
  3. 你无法模仿超过256mb的ram.

此外,在Qemu中没有新的Broadcom BCM2836或任何其他基于arm7的CPU的仿真.但是,有几个原因,为什么模仿Raspberry Pi会很有趣.因此,我感兴趣的任何提示都可以帮助我在正确的方向上使用Qemu或Linux下的任何其他仿真软件来获得可用的Raspberry Pi 2仿真.

Kee*_*ehl 11

如果你想运行Raspberry Pi 2 build bot或类似的东西,你应该看看在用户/静态模式下运行Qemu.我在虚拟机中使用Linux尝试了这一点,与Qemu系统仿真相比,速度非常快.不幸的是,它只能模拟CPU,因此您将无法测试游戏或Wayland/Weston.

我使用这种方法在大约一个小时内为我的Pi 2构建了一个内核.


Cir*_*四事件 6

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`
    
    Run Code Online (Sandbox Code Playgroud)
  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
      
      Run Code Online (Sandbox Code Playgroud)
    2. 挂载分区的第二个映像。最简单的方法是:

      sudo losetup -f --show -P 2016-05-27-raspbian-jessie.img
      
      Run Code Online (Sandbox Code Playgroud)

      这仅适用losetup于Ubuntu 16.04 上的最新版本,其他方法参见:https : //askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576

      这将打印一个循环设备,例如:

      /dev/loop0
      
      Run Code Online (Sandbox Code Playgroud)

      因此,我们这样做:

      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
      
      Run Code Online (Sandbox Code Playgroud)
  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 \
    ;
    
    Run Code Online (Sandbox Code Playgroud)

然后,您可以在主机终端上显示的终端上登录。

当前限制:

  • -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,修改的内核

此方法使用-M versatilepbUbuntu 16.04的QEMU 2.5.0上存在的方法。

缺点是您必须下载修改后的内核(请参阅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
      
      Run Code Online (Sandbox Code Playgroud)
    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
      
      Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

[失败] Ubuntu 17.04,QEMU 2.8.0 -M raspi2,Raspbian 2016-05-27,香草内核

在此较新的Ubuntu上,默认设置为QEMU 2.8.0,因此我们不需要从编译源代码-M raspi2。但是,出现以下消息后,2.8.0会在启动时挂起:

Console: switching to colour frame buffer device 100x30
Run Code Online (Sandbox Code Playgroud)

这表明-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)
Run Code Online (Sandbox Code Playgroud)

TODO:sschoof提到的是rootdelay=1解决了这个,我要尝试一下。

bztsrc/raspi3-tutorial QEMU上的RPI3裸机

https://github.com/bztsrc/raspi3-tutorial是一组适用于QEMU的很好的示例,ultraquick入门请访问:https ://raspberrypi.stackexchange.com/questions/34733/how-to-do- qemu模拟裸金属覆盆子pi图片/ 85135#85135

  • “内核恐慌 - 不同步:VFS:无法在新内核中将根文件挂载到未知块(0,0)”可以通过将“rootdelay=1”添加到 append 参数来解决。看起来 MMC 还没有准备好,当内核需要 rootfs 时。 (3认同)

ab.*_*ab. 5

如果你很乐意构建qemu,你可以在这里找到对pi2系统仿真的支持:https://github.com/0xabu/qemu.它不是特别快速,并且设备仿真不完整,但您可以调整RAM和帧缓冲区的大小.

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

  • 从QEMU 2.6开始,`raspi2`机器类型是标准QEMU的一部分. (2认同)