GNU/Linux >> Tutoriales Linux >  >> Linux

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

Si desea ejecutar un bot de compilación Raspberry Pi 2 o algo similar, debería echar un vistazo a ejecutar Qemu en modo 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. Lamentablemente, solo emula la CPU, por lo que no podrá probar juegos ni 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 de dispositivos están incompletas, pero puede cambiar el tamaño de la memoria RAM y el búfer de cuadros.

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


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

  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 fácil es:

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

      Esto solo funciona con el último 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í lo 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. Ejecutar:

    ./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 debemos compilar QEMU desde la fuente. Pero esto no es difícil.
  • la GUI muestra pero no responde al mouse/teclado, probado en SDL y VNC. Pero CLI funciona perfectamente sin embargo. Por lo tanto, también podría usar la imagen Lite que tiene go GUI por ahora.
  • sin redes

Ubuntu 16.04, QEMU 2.5.0, Raspbian 2016-05-27, núcleo modificado

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

Lo malo es que hay que descargar un kernel modificado (ver https://raspberrypi.stackexchange.com/questions/47124/emulator-with-qemu-why-the-extra-kernel), y modificar la imagen, para que quede menos representativo del sistema real.

  1. Descarga: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 extra del núcleo:https://raspberrypi.stackexchange.com/questions/47124/emulator-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. Edite 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. Ejecutar:

    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
    

[fallido] Ubuntu 17.04, QEMU 2.8.0 -M raspi2, Raspbian 2016-05-27, kernel 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 en el arranque después del mensaje:

Console: switching to colour frame buffer device 100x30

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

[fallido] Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 2017-08-16, kernel de vainilla

En esta imagen más nueva, 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 Metal desnudo RPI3 en QEMU

https://github.com/bztsrc/raspi3-tutorial es un buen conjunto de ejemplos que solo funcionan en QEMU, un comienzo ultrarrápido en:https://raspberrypi.stackexchange.com/questions/34733/how-to-do- qemu-emulación-para-bare-metal-raspberry-pi-images/85135#85135


Linux
  1. Cómo llegó Linux al mainframe

  2. ¿Cómo usar el comando basename?

  3. Cómo cambiar el nombre de host en Ubuntu

  4. ¿Cómo verificar HZ en la terminal?

  5. ¿Cómo extraigo el contenido de un rpm?

Cómo instalar Docker en Raspberry Pi

Cómo instalar el sistema operativo Raspbian en Raspberry Pi

Cómo configurar el nombre de host bonito

Cómo configurar tu sistema operativo Raspberry Pi para usarlo por primera vez

Cómo hacer un flash LED con la Raspberry Pi

¿Cómo aumentar la resolución de pantalla visualizada en QEMU / KVM?