Saltar al contenido

¿Cómo emular la Raspberry Pi 2 en QEMU?

Solución:

Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 2016-05-27, núcleo de vainilla

ingrese la descripción de la imagen aquí

  1. Compile QEMU 2.9.0 desde la fuente:

    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. Descargue la imagen y extraiga el kernel y dts de ella:

    1. Descarga la imagen y descomprímela:

      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. Monte la segunda imagen de la partición. La forma más sencilla es:

      sudo losetup -f --show -P 2016-05-27-raspbian-jessie.img
      

      Esto solo funciona con la última losetup en Ubuntu 16.04, otros métodos en: https://askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576

      Esto imprime un dispositivo de bucle, por ejemplo:

      /dev/loop0
      

      así que hacemos:

      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. Correr:

    ./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 
    ;
    

A continuación, puede iniciar sesión en el terminal que se muestra en su terminal host.

Limitaciones actuales:

  • -M raspi2 se agregó en QEMU 2.6.0, y Ubuntu 16.04 solo tiene QEMU 2.5.0, por lo que tenemos que compilar QEMU desde la fuente. Pero esto no es difícil.
  • la GUI muestra pero no responde al mouse / teclado, probado tanto en SDL como en VNC. Sin embargo, CLI funciona perfectamente. Por lo tanto, también puede usar la imagen Lite que tiene GUI por ahora.
  • sin redes

Ubuntu 16.04, QEMU 2.5.0, Raspbian 2016-05-27, kernel modificado

Este método utiliza -M versatilepb que está presente en QEMU 2.5.0 de Ubuntu 16.04.

La desventaja es que debe descargar un kernel modificado (consulte https://raspberrypi.stackexchange.com/questions/47124/emulating-with-qemu-why-the-extra-kernel) y modificar la imagen, por lo que es menos representativo del sistema real.

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

    Elegimos 4.4.12 ya que esa es la versión del kernel en la imagen de Raspbian.

    El proceso para generar ese blob del kernel se describe en el repositorio en: https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/36ede073f4ccb64f60200ede36c231afe9502070/tools

    Por qué se necesita esta imagen de kernel adicional: https://raspberrypi.stackexchange.com/questions/47124/emulating-with-qemu-why-the-extra-kernel

  2. Modifique la imagen de Raspbian como se menciona en: https://github.com/dhruvvyas90/qemu-rpi-kernel/wiki/Emulating-Jessie-image-with-4.x.xx-kernel/0068f0c21d942b0f331e18014ff8e22c20cada5c

    Resumen:

    1. Monte la imagen tal como lo hicimos para el -M raspi2, pero use la segunda partición en lugar de la primera:

      sudo mount /dev/loop0p2 /mnt/rpi
      
    2. Edita la imagen:

      # 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. Correr:

    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
    

[failed] Ubuntu 17.04, QEMU 2.8.0 -M raspi2, Raspbian 2016-05-27, núcleo de vainilla

En este Ubuntu más nuevo, QEMU 2.8.0 es el predeterminado, por lo que no necesitamos compilar QEMU desde la fuente para -M raspi2. Sin embargo, 2.8.0 se bloquea al arrancar después del mensaje:

Console: switching to colour frame buffer device 100x30

Esto demuestra lo inestable -M raspi2 todavía lo es.

[failed] Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 2017-08-16, núcleo de vainilla

En esta imagen más reciente, usando el mismo método para 2016-05-27, el kernel entra en pánico al arrancar con:

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 menciona que rootdelay=1 resuelve esto, tengo que probarlo.

bztsrc/raspi3-tutorial RPI3 bare metal en QEMU

https://github.com/bztsrc/raspi3-tutorial es un buen conjunto de ejemplos que simplemente funcionan en QEMU, inicio ultrarrápido en: https://raspberrypi.stackexchange.com/questions/34733/how-to-do- qemu-emulation-for-bare-metal-raspberry-pi-images / 85135 # 85135

Si desea ejecutar un bot de compilación de Raspberry Pi 2 o algo similar, debe echar un vistazo a la ejecución de Qemu en modo de usuario / estático. Probé esto usando Linux en una máquina virtual, es bastante rápido en comparación con la emulación del sistema Qemu. Desafortunadamente, solo emula la CPU, por lo que no podrá probar juegos o Wayland / Weston.

Pude construir un kernel para mi Pi 2 en aproximadamente una hora usando este método.

Si se siente cómodo construyendo qemu, puede encontrar soporte para la emulación del sistema pi2 aquí: https://github.com/0xabu/qemu. No es particularmente rápido y las emulaciones del dispositivo están incompletas, pero puede cambiar el tamaño de la RAM y el framebuffer.

Hay breves instrucciones para arrancar Raspbian al final de https://github.com/0xabu/qemu/wiki

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *