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

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

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

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

Ответ 1

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

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

Ответ 2

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

Я смог построить ядро ​​для своего Pi 2 примерно через час с помощью этого метода.

Ответ 3

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

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

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

Недостатком является то, что вам нужно загрузить модифицированное ядро (см. https://raspberrypi.stackexchange.com/info/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, так как это версия ядра в образе Распбиана.

    Процесс создания этого двоичного объекта ядра описан в репозитории по адресу: https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/36ede073f4ccb64f60200ede36c231afe9502070/tools

    Зачем нужен этот дополнительный образ ядра: https://raspberrypi.stackexchange.com/info/47124/emulating-with-qemu-why-the-extra-kernel

  2. Измените изображение Распбиана, как указано на: 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 используется по умолчанию, поэтому нам не нужно компилировать 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)

TODO: sschoof упоминает, что rootdelay=1 решает эту проблему, я должен попробовать.

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

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