Emulazione su un PC Linux


48

Come posso collegare una scheda SD contenente un sistema operativo Raspberry Pi al mio PC Linux e avviare il sistema operativo in un emulatore?

Perché VMWare non funziona?

Quali sono i limiti di questo metodo?

Correlati: emulazione su un PC Windows


Non è una domanda di virtualizzazione invece di una domanda di emulazione?
Zoot

1
Non mi piace l'emulazione della modifica della virtualizzazione ... possiamo parlarne?
Alex Chamberlain,

2
Il problema di base è che il Pi ha una CPU ARM incompatibile con x86 che è ciò che VMWare sa eseguire. Hai bisogno di un emulatore.
Thorbjørn Ravn Andersen,

Si noti che una versione di debian personalizzata con molte delle funzionalità di Raspbian (incluso l'ambiente desktop PIXEL e la maggior parte delle applicazioni) è disponibile per il download dal sito Web di Raspberry Pi
angussidney,

Risposte:


52

Sì, questo è completamente possibile. Tuttavia, in realtà è un po 'diverso da come stai pensando.


Preambolo

La scheda SD contiene un'immagine del sistema operativo. E funziona gonfiando questa immagine quando il dispositivo è acceso.

Come mi aspettavo già sapete, si esegue il flashing di questa immagine sulla scheda SD per creare un sistema funzionante. Tuttavia, ciò che puoi fare prima di mostrare l'immagine è giocarci su usando QEMU , che è un emulatore del processore e ci consente di emulare il set di istruzioni ARM.

In questo modo, tutte le modifiche apportate all'immagine (installazione, compilazione, ecc.) Rimarranno comunque disponibili dopo averlo trasferito sulla scheda SD.

Ora ti spiegherò come utilizzare QEMU per caricare l'immagine. Dimostrerò con l'immagine Arch Linux, ma il processo dovrebbe essere lo stesso a prescindere.


Utilizzando QEMU

Prerequesites

Dovrai acquisire QEMU per il tuo sistema. QEMU dovrebbe avere un solo requisito, affinché i dispositivi di input funzionino, è necessario disporre del pacchetto di sviluppo SDL installato, che dovrebbe essere disponibile dal gestore dei pacchetti.

Ti consiglio di scaricare il pacchetto usando il tuo normale gestore pacchetti:

Arco :

sudo pacman -S sdl qemu

Ubuntu :

Le versioni più recenti (dal 14.04) hanno un pacchetto per esso:

sudo apt-get install qemu-system-arm

Per le versioni precedenti:

sudo apt-get install libsdl-dev
sudo add-apt-repository ppa:linaro-maintainers/tools
sudo apt-get update
sudo apt-get install qemu-system

Costruisci QEMU da solo

In alternativa, puoi creare QEMU da solo. Questo è fantastico se vuoi provare una nuova versione, ma può essere lento ed essere preparato per molti errori durante la compilazione! Si noti che se si crea QEMU dal proprio sito Web, è necessario compilarlo per il supporto ARM. Quindi controlla prima i tuoi repository distro. Questo può essere fatto in questo modo;

mkdir rpi-emu && cd rpi-emu
wget http://wiki.qemu.org/download/qemu-1.1.0-1.tar.bz2
tar xvjf qemu-1.1.0-1.tar.bz2
cd qemu-1.1.0-1
./configure –target-list=arm-softmmu,arm-linux-user
make
sudo make install

Verifica di disporre del supporto ARM con:

qemu-system-arm --version
QEMU emulator version 1.0,1, Copyright (c) 2003-2008 Fabrice Bellard

Ottenere l'immagine

Stiamo lavorando con Arch Linux, quindi utilizzeremo l'immagine Arch Arm. Ma sostituiscilo con qualunque cosa tu voglia lavorare, o forse hai già un'immagine. In tal caso, saltare questo passaggio.

wget http://anorien.csc.warwick.ac.uk/mirrors/raspberrypi.org/images/archlinuxarm/archlinuxarm-29-04-2012/archlinuxarm-29-04-2012.zip
unzip archlinuxarm-29-04-2012.zip 

Per far funzionare QEMU abbiamo anche bisogno dell'immagine del kernel (che sarebbe all'interno del file .img).

Nota: non penso che questo passaggio sia necessario per Debian. Qualcuno per favore conferma.

Fortunatamente ci sono immagini precompilate disponibili e puoi usare quella da qui ( download diretto ).

TODO: Dimostrare come compilare un'immagine del kernel qui?

Avvio della VM

Ora dovresti avere:

  • Un file img che puoi verificare usando lo sha1 in dotazione (consigliato).
  • Un'immagine del kernel (zImage).
  • QEMU per ARM.

La macchina virtuale può ora essere avviata utilizzando il seguente comando a rotazione lunga:

qemu-system-arm -kernel zImage -cpu arm1176 -M versatilepb -serial stdio -append "root=/dev/sda2" -hda archlinuxarm-29-04-2012.img -clock dynticks

Nota che avrai solo diverse centinaia di megabyte di spazio di archiviazione usando questo metodo (qualunque cosa sia di riserva sull'immagine). È possibile creare un disco rigido virtuale seguendo la guida per l'utente di QEMU .


Questo è più quello che stavo cercando - grazie! Questa è una grande risposta di riferimento
Alex L

@Alex Nessun problema, fammi sapere se hai bisogno di me per elaborare. Inoltre, dimmi se ottieni un'immagine debian funzionante e possiamo aggiungerla alle istruzioni se diversa.
Jivings,

C'è una soluzione ragionevolmente approfondita qui
Alex L

@Alex È una buona idea, non l'avevo visto.
Jivings,

2
L'altro è chiuso, quindi tutto ciò che posso fare è votare per riaprire
Jivings,

8

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

inserisci qui la descrizione dell'immagine

  1. Compilare QEMU 2.9.0 dall'origine:

    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 esso:

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

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

      Funziona solo con le ultime losetupversioni di 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 ad anello, ad esempio:

      /dev/loop0
      

      quindi facciamo:

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

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

È quindi possibile accedere al terminale che mostra sul terminale host.

Limitazioni 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 questo non è difficile.
  • la GUI mostra ma non risponde al mouse / tastiera, testato su SDL e VNC. Ma CLI funziona perfettamente comunque. Quindi potresti anche usare l'immagine Lite che per ora è diventata GUI.
  • nessuna rete

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

Questo metodo utilizza quello -M versatilepbpresente su QEMU 2.5.0 di Ubuntu 16.04.

Il rovescio della medaglia è che devi scaricare un kernel modificato (vedi Emulazione con Qemu: perché il kernel extra? ), 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.12poiché quella è 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 extra del kernel: Emulazione con Qemu: perché il kernel aggiuntivo?

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

    Sommario:

    1. Montare l'immagine come abbiamo fatto per il -M raspi2, ma utilizzare la seconda partizione anziché la 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. Correre:

    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 questa nuova Ubuntu, 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 -M raspi2sia ancora instabile .

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

Su questa immagine più recente, usando lo stesso metodo per 27/05/2016, il kernel si mette 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)

bztsrc/raspi3-tutorial RPI3 bare metal su QEMU

https://github.com/bztsrc/raspi3-tutorial è una buona serie di esempi che funzionano solo su QEMU, ultraquick per iniziare da: Come eseguire l'emulazione QEMU per immagini Raspberry Pi bare metal


2
Amico, sei fantastico!
Sottoscrizione del

4

Non puoi fare ciò che stai suggerendo, perché Raspberry Pi ha un'architettura di processore diversa rispetto alla maggior parte dei PC. Mentre la maggior parte dei PC sono basati su x86, RPi è un computer basato su ARM.

Questo è lo stesso motivo per cui non è possibile eseguire, ad esempio, Microsoft Windows su RPi.

VmWare non funzionerà perché può virtualizzare solo i sistemi operativi basati su x86 (32-bit e 64-bit). Esistono altri emulatori che possono virtualizzare ARM, come QEMU, ma quelli eseguono un'emulazione software completa senza il supporto di virtualizzazione della CPU nativa, quindi puoi aspettarti che siano abbastanza lenti.


3
Potresti includere qualche informazione in più su come emulare RasPi su x86 (cioè con QEMU)? Questo è ciò su cui volevo davvero focalizzare questa domanda, sebbene la spiegazione sia apprezzata.
Alex L

3
Ci scusiamo per il voto negativo, ma questo non spiega come ottenere ciò di cui ha bisogno il richiedente.
G-.

D'altra parte, affronta altri punti della domanda a cui l'altra risposta non risponde. Penso che i tuoi downgrade siano immeritati (non è nemmeno che questa domanda stia conducendo)

3
Anche senza supporto virt nativo, slow è piuttosto relativo poiché probabilmente stai virtualizzando su una macchina molto più potente di un lampone
Kenneth Wilke,

0

Puoi facilmente provare un simulatore di Raspberry Pi incluso con sensore, riga di comando ed editor di file su iotify.io. Consulta la nostra documentazione su https://docs.iotify.io/ per iniziare con i diversi progetti, sistemi operativi e familiarizzare con l'ambiente di lavoro di Raspberry Pi.

inserisci qui la descrizione dell'immagine


1
Sebbene tecnicamente questa sia una risposta, stai chiaramente usando il nostro sito per pubblicità gratuita. Mentre quello che offri potrebbe essere gratuito, non è ancora ok. Apprezziamo il tuo contributo alla community, ma ti preghiamo di portare la tua pubblicità altrove.
Darth Vader

4
@DarthVader: poiché il poster ha reso noto che sono affiliati al prodotto e risponde alla domanda, sono propenso a definirlo accettabile.
Jacobm001
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.