Как эмулировать Raspberry Pi 2 на QEMU?

некоторое время назад я подражал Raspberry Pi следующий в этой статье, но этот подход имеет несколько проблем:

  1. Это очень медленно.
  2. разрешение дисплея ограничено до 800x600.
  3. вы не можете эмулировать более 256 МБ оперативной памяти.

кроме того, нет эмуляции для нового Broadcom BCM2836 или любого другого процессора на базе arm7 в в QEMU. Однако, есть несколько причин, почему это было бы интересно подражать Raspberry Pi. Поэтому меня интересуют любые подсказки, которые подталкивают меня в правильном направлении, чтобы получить рабочую эмуляцию Raspberry Pi 2 с помощью Qemu или любого другого программного обеспечения эмуляции под Linux.

3 ответов


Если вам удобно строить qemu, вы можете найти поддержку эмуляции системы pi2 здесь:https://github.com/0xabu/qemu. Это не особенно быстро, и эмуляции устройства являются неполными, но вы можете изменить размер ОЗУ и фреймбуффера.

есть краткие инструкции по загрузке Raspbian в конце https://github.com/0xabu/qemu/wiki


Если вы хотите запустить Raspberry Pi 2 build bot или что-то подобное, вы должны взглянуть на running Qemu в пользовательском / статическом режиме. Я пробовал это с помощью Linux на виртуальной машине, это довольно быстро по сравнению с эмуляцией системы Qemu. К сожалению, он только эмулирует процессор, поэтому вы не сможете тестировать игры или Wayland/Weston.

Я смог построить ядро для моего Pi 2 примерно за час, используя этот метод.


Ubuntu 16.04, QEMU 2.9.0-M raspi2, Raspbian 2016-05-27, ядро ванили

enter image description here

  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
      

      это работает только с последней losetup на Ubuntu 16.04, другие методы по адресу: 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 bcm2709-rpi-2-b.dtb .
      sudo umount /mnt/rpi
      sudo losetup -d /dev/loop0
      
  3. Run:

    ./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 работает отлично. Таким образом, вы можете также использовать Lite изображение, которое имеет GO GUI на данный момент.
  • нет сеть

в Ubuntu 16.04, в QEMU 2.5.0, Raspbian 2016-05-27, модифицированное ядро

этот метод использует -M versatilepb который присутствует на QEMU 2.5.0 Ubuntu 16.04.

недостатком является то, что вам нужно загрузить измененное ядро (см. 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. Run:

    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 по умолчанию, поэтому нам не нужно компилировать QEMU из источника для -M raspi2. Однако 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)

bztsrc/raspi3-tutorial RPI3 голый металл на QEMU

https://github.com/bztsrc/raspi3-tutorial хороший набор примеров которые как раз работают на QEMU, ultraquick получая начат на: https://raspberrypi.stackexchange.com/questions/34733/how-to-do-qemu-emulation-for-bare-metal-raspberry-pi-images/85135#85135