Não é possível emular o Raspberry Pi usando o Qemu: Kernel Panic


15

Estou tentando seguir vários guias na Internet para emular o Raspberry Pi na minha máquina Fedora 22. Eu encontrei esta pergunta: Emulando o raspbian com o QEMU e o usei para encontrar o kernel-qemu para pegar um kernel. Eu baixei 2015-09-24-raspbian-jessie.imgdo pessoal do Raspberry Pi.

Quando tento executar qemu-system-arm, fico com o kernel panic. Tem algo que estou perdendo?

Aqui está a qemu-system-armlinha de comando que eu digitei:

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

Seguido pelas mensagens do 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
Você já tentou emular uma imagem chiada? Se o kernel trabalha com ele, deve ser jessie.
precisa saber é o seguinte

Oh, duh! Sim, quando o kernel não corresponde ao img, as coisas quebram! A imagem chiada funciona ... Obrigado.
Mike S

Respostas:


4

Como o @dastaan ​​disse, a versão do kernel precisa corresponder ao arquivo img. Eu estava tentando usar um arquivo de imagem da versão do kernel 4.1 com um kernel 3.18.

Agora que estou usando a imagem correta, ela funciona.

Obrigado!

Edit: Fazer isso funcionar é bem simples: Pegue a imagem em https://github.com/dhruvvyas90/qemu-rpi-kernel/ e faça o download da imagem Raspian correspondente desejada em https://www.raspberrypi.org/ downloads / raspbian / . Atualmente, Jessie e Wheezy estão em ambos os lugares, mas não há garantia no futuro de que o kernel apropriado esteja disponível no site do Github. De qualquer forma, eu não estava tão impressionado com a velocidade, então estou pensando em colocar um Pi real na porta de rede com fio do meu laptop e alimentá-lo através de uma bateria auxiliar de celular de 5200 mAh e usar o VNC no laptop como um visor.

Eu não fiz Jessie trabalhar; esse era o problema - eu tinha um núcleo Wheezy e uma imagem de Jessie, mas não tinha um núcleo de Jessie.


11
Você pode adicionar uma resposta detalhada de como o resolveu usando o kernel mais recente? Isso ajudará outros usuários que tentam imitar Jessie. Obrigado.
dhruvvyas90

3
Eu tenho tentado um kernel jessie e uma imagem jessie e eles estão falhando com o mesmo erro. Um kernel 4.1 ( github.com/dhruvvyas90/qemu-rpi-kernel/blob/master/… ) e o jessie regular após maio de 2015 do Raspbian.
Michael McGarrah 01/12/2015

Sem ofensas, mas não existe um jessie kernel. Com o raspbian netinstaller, você pode optar por instalar o wheezy ou o jessie e em ambos os casos o mesmo kernel é instalado.
Diederik de Haas

Embora seja verdade que os kernels são nomeados por versão, meu problema não era como baixar o raspinstall netinstaller. Meu problema foi combinar os arquivos de imagem do pessoal do Raspberry Pi com uma versão adequada do kernel. No futuro, espero que as pessoas que se deparam com essa pergunta vejam minhas mensagens de erro e percebam qual pode ser o problema delas.
Mike S

@MichaelMcGarrah conseguiu que ele funcionasse depois de ler o wiki desse repositório: raspberrypi.stackexchange.com/a/53993/33424 Você precisa ajustar um pouco a imagem do Raspbian.
Ciro Santilli publicou 25/08/16


0

A maioria dos guias está desatualizada e contém links quebrados. Você deve usar um kernel corrigido que corresponda à versão raspbian que você está usando.

O guia a seguir funciona a partir de fevereiro de 2017. Ele possui um script que cuida da alteração da imagem raspbian para execução no QEMU e também compartilha sua conexão de rede com o raspbian automaticamente.

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


0

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

insira a descrição da imagem aqui

Passos:

  1. Compile o QEMU 2.9.0 da fonte:

    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. Faça o download da imagem e extraia o kernel e o dts:

    1. Baixe a imagem e descompacte-a:

      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 a segunda imagem da partição. A maneira mais fácil é:

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

      Isso funciona apenas com as losetupversões mais recentes do Ubuntu 16.04, outros métodos em: /ubuntu/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576

      Isso imprime um dispositivo de loop, por exemplo:

      /dev/loop0
      

      assim fazemos:

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

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

Você pode fazer login no terminal exibido no terminal host.

Limitações atuais:

  • -M raspi2foi adicionado no QEMU 2.6.0 e o Ubuntu 16.04 possui apenas o QEMU 2.5.0, portanto, precisamos compilar o QEMU a partir da fonte. Mas isso não é difícil.
  • a GUI mostra, mas não está respondendo ao mouse / teclado, testado no SDL e no VNC. Porém, a CLI funciona perfeitamente. Então, você também pode usar a imagem Lite, que agora é GUI.
  • sem rede

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

Este método usa o -M versatilepbque está presente no QEMU 2.5.0 do Ubuntu 16.04.

A desvantagem é que você precisa fazer o download de um kernel modificado (consulte Emulando com o Qemu: por que o kernel extra? ) E modificar a imagem, para que seja menos representativo do sistema real.

  1. Faça o download: https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/36ede073f4ccb64f60200ede36c231afe9502070/kernel-qemu-4.4.12-jessie

    Nós escolhemos 4.4.12uma vez que essa é a versão do kernel na imagem Raspbian.

    O processo para gerar esse blob do kernel está descrito no repositório em: https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/36ede073f4ccb64f60200ede36c231afe9502070/tools

    Por que essa imagem extra do kernel é necessária: Emulando com o Qemu: por que o kernel extra?

  2. Modifique a imagem Raspbian conforme mencionado em: https://github.com/dhruvvyas90/qemu-rpi-kernel/wiki/Emulating-Jessie-image-with-4.x.xx-kernel/0068f0c21d942b0f331e18014ff8e22c20cada5c

    Resumo:

    1. Monte a imagem da mesma maneira que fizemos para o -M raspi2, mas use a segunda partição em vez da primeira:

      sudo mount /dev/loop0p2 /mnt/rpi
      
    2. Edite a imagem:

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

    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
    

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

Neste Ubuntu mais recente, o QEMU 2.8.0 é o padrão, portanto, não precisamos compilar o QEMU da fonte para -M raspi2. No entanto, 2.8.0 trava na inicialização após a mensagem:

Console: switching to colour frame buffer device 100x30

Isso mostra o quão instável -M raspi2ainda é.

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

Nesta imagem mais recente, usando o mesmo método para 27/05/2016, o kernel entra em pânico na inicialização com:

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 Metal desencapado RPI3 em QEMU

https://github.com/bztsrc/raspi3-tutorial é um bom conjunto de exemplos que funcionam apenas no QEMU, iniciando com ultra-rápida em: Como fazer a emulação QEMU para imagens Raspberry Pi bare metal


Seu método com losetupé excessivamente complicado. Você pode ao invés de apenas usar fdisk -l your-image.img, e depois usar o deslocamento para a partição na mountopção -o loop,offset=$((512*YOUR_OFFSET)).
Ruslan

Raspi2 -M não trabalho
Zhaofeng-shu33

-1

Você pode fazer o download do meu kernel personalizado (4.1.7) para o Raspbian Jessie no meu github, polaco1782 . Siga as instruções nos arquivos doc.


11
Seu kernel me envia ao prompt de modo de emergência toda vez que tento emular. Eu fiz como está escrito no arquivo leia-me. (Veja a última postagem em -> raspberrypi.org/forums/viewtopic.php?t=112259 ) Você pode editar sua resposta para mostrar passo a passo o que mudou na imagem básica de jessie para fazê-la funcionar. Será útil para outros usuários, pois agora que a imagem de jessie está ativa, mais e mais usuários irão imitar jessie no qemu. Desde já, obrigado.
dhruvvyas90

Você pode expandir sua resposta para explicar o que é personalizado no seu kernel?
Greenonline

Consegui resolver meu problema comentando fstabas entradas mmcblk.
precisa saber é o seguinte

@Greenonline Como o qemu não suporta a plataforma Rpi, há um ajuste na configuração do kernel necessário para emular o rpi no Qemu. Você não pode simplesmente pegar o kernel Rpi e fazê-lo funcionar imediatamente.
usar o seguinte código
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.