Impossibile emulare Raspberry Pi usando Qemu: Kernel Panic


15

Sto cercando di seguire varie guide su Internet per emulare Raspberry Pi sulla mia macchina Fedora 22. Ho trovato questa domanda: emulare raspbian con QEMU e l'ho usato per trovare kernel-qemu per afferrare un kernel. Ho scaricato 2015-09-24-raspbian-jessie.imgdalla brava gente di Raspberry Pi.

Quando provo a correre qemu-system-armho il panico del kernel. C'è qualcosa che mi manca?

Ecco la qemu-system-armriga di comando che ho digitato:

qemu-system-arm -cpu arm1176 -m 256 -M versatilepb -no-reboot -nographic -kernel kernel-qemu -appc=2 console=ttyAMA0 rw" -hda 2015-09-24-raspbian-jessie.img -net nic -net user,hostfwd=tcp::9999-:22

Seguito dai messaggi del kernel:

sd 0:0:0:0: [sda] Attached SCSI disk
smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre <nico@fluxnic.net>
eth0: SMC91C11xFD (rev 1) at d089a000 IRQ 25 [nowait]
eth0: Ethernet addr: 52:54:00:12:34:56
mousedev: PS/2 mouse device common for all mice
TCP cubic registered
NET: Registered protocol family 17
input: AT Raw Set 2 keyboard as /devices/fpga:06/serio0/input/input0
input: ImExPS/2 Generic Explorer Mouse as /devices/fpga:07/serio1/input/input1
EXT2-fs (sda2): error: couldn't mount because of unsupported optional features (244)
EXT4-fs (sda2): couldn't mount as ext3 due to feature incompatibilities
EXT4-fs (sda2): recovery complete
EXT4-fs (sda2): mounted filesystem with ordered data mode. Opts: (null)
VFS: Mounted root (ext4 filesystem) on device 8:2.
devtmpfs: mounted
Freeing init memory: 120K
Kernel panic - not syncing: Attempted to kill init!
[<c0032bec>] (unwind_backtrace+0x0/0xf0) from [<c03064dc>] (panic+0x58/0x170)
[<c03064dc>] (panic+0x58/0x170) from [<c0044054>] (do_exit+0x5d0/0x68c)
[<c0044054>] (do_exit+0x5d0/0x68c) from [<c004435c>] (do_group_exit+0x40/0xb0)
[<c004435c>] (do_group_exit+0x40/0xb0) from [<c004ed48>] (get_signal_to_deliver+0x1a8/0x378)
[<c004ed48>] (get_signal_to_deliver+0x1a8/0x378) from [<c002f124>] (do_signal+0x90/0x518)
[<c002f124>] (do_signal+0x90/0x518) from [<c002fa64>] (do_notify_resume+0x48/0x54)
[<c002fa64>] (do_notify_resume+0x48/0x54) from [<c002cc38>] (work_pending+0x24/0x28)

2
Hai provato a emulare l'immagine sibilante? Se il kernel funziona con esso, deve essere jessie.
dhruvvyas90,

Oh, duh! Sì, quando il kernel non corrisponde all'img, le cose si rompono! L'immagine sibilante funziona ... Grazie.
Mike S,

Risposte:


4

Come diceva @dastaan, la versione del kernel deve corrispondere al file img. Stavo cercando di utilizzare un file immagine versione del kernel 4.1 con un kernel 3.18.

Ora che sto usando l'immagine corretta, funziona.

Grazie!

Modifica: farlo funzionare è abbastanza semplice: prendi l'immagine da https://github.com/dhruvvyas90/qemu-rpi-kernel/ , quindi scarica l'immagine Raspian corrispondente che desideri su https://www.raspberrypi.org/ download / raspbian / . Attualmente, Jessie e Wheezy sono attivi in ​​entrambi i posti, ma in futuro non esiste alcuna garanzia che il kernel appropriato sarà disponibile su quel sito Github. In ogni caso, non sono rimasto così colpito dalla velocità, quindi sto cercando di mettere un vero Pi sulla porta di rete cablata del mio laptop e alimentarlo attraverso una batteria ausiliaria da 5200 mAh per cellulare, e usare VNC sul laptop come un monitor.

Non riuscivo a far lavorare Jessie; quello era il problema: avevo un kernel Wheezy e un'immagine di Jessie, ma non avevo un kernel di Jessie.


1
Puoi aggiungere una risposta dettagliata su come l'hai risolta usando l'ultimo kernel? Aiuterà gli altri utenti a cercare di emulare Jessie. Grazie.
dhruvvyas90,

3
Ho provato un kernel jessie e un'immagine jessie e non riescono con lo stesso errore. Un kernel 4.1 ( github.com/dhruvvyas90/qemu-rpi-kernel/blob/master/… ) e il normale post di jessie di maggio 2015 di Raspbian.
Michael McGarrah,

Senza offesa, ma non esiste un kernel jessie. Con raspbian netinstaller puoi scegliere di installare wheezy o jessie e in entrambi i casi viene installato lo stesso kernel esatto.
Diederik de Haas,

Anche se è vero che i kernel hanno un nome per versione, il mio problema non era come scaricare raspbian netinstaller. Il mio problema era abbinare i file di immagine delle brave persone di Raspberry Pi con una versione corretta del kernel. In futuro, spero che le persone che si imbattono in questa domanda guarderanno i miei messaggi di errore e realizzeranno quale potrebbe essere il loro problema.
Mike S,

@MichaelMcGarrah ha funzionato dopo aver letto il wiki di quel repository: raspberrypi.stackexchange.com/a/53993/33424 Devi modificare leggermente l'immagine Raspbian.
Ciro Santilli 25 改造 中心 法轮功 六四 事件


1

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

inserisci qui la descrizione dell'immagine

passi:

  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: /ubuntu/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


Il tuo metodo con losetupè eccessivamente complicato. Puoi invece semplicemente usare fdisk -l your-image.imge quindi utilizzare l'offset alla partizione in mountopzione -o loop,offset=$((512*YOUR_OFFSET)).
Ruslan,

-M raspi2 non funziona
zhaofeng-shu33

0

La maggior parte delle guide sono obsolete e contengono collegamenti interrotti. È necessario utilizzare un kernel con patch che corrisponda alla versione di raspbian in uso.

La seguente guida funziona a partire da febbraio 2017. Presenta uno script che si occupa della modifica dell'immagine raspbian per l'esecuzione su QEMU e inoltre condivide automaticamente la connessione di rete con raspbian.

https://ownyourbits.com/2017/02/06/raspbian-on-qemu-with-network-access/


-1

Puoi scaricare il mio kernel personalizzato (4.1.7) per Raspbian Jessie sul mio github, polaco1782 . Segui le istruzioni sui file doc.


1
Il tuo kernel mi invia al prompt della modalità di emergenza ogni volta che provo ad emulare. Ho fatto come è scritto nel file Leggimi. (Vedi l'ultimo post su -> raspberrypi.org/forums/viewtopic.php?t=112259 ) Puoi modificare la tua risposta per mostrare passo dopo passo cosa hai cambiato nell'immagine jessie di base per farlo funzionare. Sarà utile per gli altri utenti poiché ora che l'immagine di jessie è in diretta, sempre più utenti emuleranno jessie su qemu. Grazie in anticipo.
dhruvvyas90,

Puoi espandere la tua risposta per spiegare cosa è personalizzato nel tuo kernel?
Greenonline,

Sono stato in grado di risolvere il mio problema commentando fstable voci di mmcblk.
dhruvvyas90,

@Greenonline Poiché qemu non supporta la piattaforma Rpi, è necessaria una modifica della configurazione del kernel per emulare rpi su Qemu. Non puoi semplicemente prendere il kernel Rpi e farlo funzionare immediatamente.
dhruvvyas90,
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.