GNU/Linux >> Linux Esercitazione >  >> Linux

Come emulare il Raspberry Pi 2 su QEMU?

Se vuoi eseguire un build bot Raspberry Pi 2 o qualcosa di simile, dovresti dare un'occhiata all'esecuzione di Qemu in modalità utente/statica. L'ho provato usando Linux in una macchina virtuale, è abbastanza veloce rispetto all'emulazione del sistema Qemu. Sfortunatamente emula solo la CPU, quindi non sarai in grado di testare giochi o Wayland/Weston.

Sono stato in grado di creare un kernel per il mio Pi 2 in circa un'ora utilizzando questo metodo.


Se hai dimestichezza con la creazione di qemu, puoi trovare il supporto per l'emulazione del sistema pi2 qui:https://github.com/0xabu/qemu. Non è particolarmente veloce e le emulazioni del dispositivo sono incomplete, ma puoi ridimensionare la RAM e il framebuffer.

Ci sono brevi istruzioni per l'avvio di Raspbian alla fine di https://github.com/0xabu/qemu/wiki


Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 27-05-2016, kernel vanilla

  1. Compila QEMU 2.9.0 dal sorgente:

    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. Scarica l'immagine ed estrai il kernel e il dts da essa:

    1. Scarica l'immagine e decomprimila:

      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. Monta la seconda immagine della partizione. Il modo più semplice è:

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

      Funziona solo con l'ultimo losetup su Ubuntu 16.04, altri metodi su:https://askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576

      Questo stampa un dispositivo loop, ad esempio:

      /dev/loop0
      

      quindi facciamo:

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

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

Puoi quindi effettuare il login sul terminale visualizzato sul tuo terminale host.

Limiti attuali:

  • -M raspi2 è stato aggiunto in QEMU 2.6.0 e Ubuntu 16.04 ha solo QEMU 2.5.0, quindi dobbiamo compilare QEMU dal sorgente. Ma non è difficile.
  • la GUI mostra ma non risponde al mouse/tastiera, testata sia su SDL che su VNC. Ma la CLI funziona perfettamente comunque. Quindi potresti anche usare l'immagine Lite che per ora ha la GUI.
  • nessuna rete

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

Questo metodo usa -M versatilepb che è presente su QEMU 2.5.0 di Ubuntu 16.04.

Lo svantaggio è che devi scaricare un kernel modificato (vedi https://raspberrypi.stackexchange.com/questions/47124/emulating-with-qemu-why-the-extra-kernel) e modificare l'immagine, quindi è meno rappresentativo del sistema reale.

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

    Scegliamo 4.4.12 poiché questa è la versione del kernel nell'immagine Raspbian.

    Il processo per generare quel blob del kernel è descritto nel repository all'indirizzo:https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/36ede073f4ccb64f60200ede36c231afe9502070/tools

    Perché è necessaria questa immagine del kernel aggiuntiva:https://raspberrypi.stackexchange.com/questions/47124/emulating-with-qemu-why-the-extra-kernel

  2. Modifica l'immagine Raspbian come indicato su:https://github.com/dhruvvyas90/qemu-rpi-kernel/wiki/Emulating-Jessie-image-with-4.x.xx-kernel/0068f0c21d942b0f331e18014ff8e22c20cada5c

    Sommario:

    1. Monta l'immagine proprio come abbiamo fatto per il -M raspi2 , ma usa la seconda partizione invece della prima:

      sudo mount /dev/loop0p2 /mnt/rpi
      
    2. Modifica l'immagine:

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

    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
    

[fallito] Ubuntu 17.04, QEMU 2.8.0 -M raspi2, Raspbian 27-05-2016, kernel vanilla

Su questo Ubuntu più recente, QEMU 2.8.0 è l'impostazione predefinita, quindi non è necessario compilare QEMU dal sorgente per -M raspi2 . Tuttavia, 2.8.0 si blocca all'avvio dopo il messaggio:

Console: switching to colour frame buffer device 100x30

Questo dimostra quanto sia instabile -M raspi2 lo è ancora.

[fallito] Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 16-08-2017, kernel vanilla

In questa immagine più recente, utilizzando lo stesso metodo per il 27-05-2016, il kernel va in panico all'avvio 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 menziona quel rootdelay=1 risolve questo problema, devo provarlo.

bztsrc/raspi3-tutorial RPI3 metallo nudo su QEMU

https://github.com/bztsrc/raspi3-tutorial è un buon set di esempi che funzionano solo su QEMU, ultrarapido per iniziare su:https://raspberrypi.stackexchange.com/questions/34733/how-to-do- qemu-emulation-for-bare-metal-raspberry-pi-images/85135#85135


Linux
  1. Come Linux è arrivato al mainframe

  2. Come accendere e spegnere il Raspberry Pi [Suggerimento assoluto per principianti]

  3. Come utilizzare il comando basename?

  4. Come installare R 3.3.1 nella propria directory?

  5. Come ruotare lo schermo su un Raspberry Pi 3

Come installare Docker su Raspberry Pi

Come installare il sistema operativo Raspbian su Raspberry Pi

Come impostare il nome host Pretty

Come configurare il tuo sistema operativo Raspberry Pi per usarlo per la prima volta

Come realizzare un flash LED con il Raspberry Pi

Come aumentare la risoluzione dello schermo visualizzato su QEMU / KVM?