No se puede emular Raspberry Pi usando Qemu: Kernel Panic

15

Estoy tratando de seguir varias guías en Internet para emular Raspberry Pi en mi máquina Fedora 22. He encontrado esta pregunta: Emular raspbian con QEMU y lo usé para encontrar kernel-qemu para agarrar un kernel. Lo descargué 2015-09-24-raspbian-jessie.imgde la buena gente de Raspberry Pi.

Cuando trato de correr qemu-system-armme da pánico en el núcleo. ¿Se me escapa algo?

Aquí está la qemu-system-armlínea de comando que escribí:

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 por los mensajes del kernel:

sd 0:0:0:0: [sda] Attached SCSI disk
smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre <[email protected]>
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)
Mike S
fuente
2
¿Has intentado emular la imagen de wheezy? Si el núcleo funciona con él, debe ser jessie.
dhruvvyas90
Oh duh! Sí, cuando el núcleo no coincide con el img, ¡las cosas se rompen! La imagen sibilante funciona ... Gracias.
Mike S
versión genérica de instrucciones: raspberrypi.stackexchange.com/questions/165/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

4

Como @dastaan ​​dijo, la versión del kernel debe coincidir con el archivo img. Estaba tratando de usar un archivo de imagen de versión de kernel 4.1 con un kernel 3.18.

Ahora que estoy usando la imagen adecuada, funciona.

¡Gracias!

Editar: Hacer que esto funcione es bastante sencillo: tome la imagen de https://github.com/dhruvvyas90/qemu-rpi-kernel/ , luego descargue la imagen de Raspian correspondiente que desee en https://www.raspberrypi.org/ descargas / raspbian / . Actualmente, Jessie y Wheezy están en ambos lugares, pero no hay garantía en el futuro de que el núcleo apropiado estará disponible en ese sitio de Github. En cualquier caso, no estaba tan impresionado con la velocidad, así que estoy buscando poner un Pi real en el puerto de red con cable de mi computadora portátil y alimentarlo a través de una batería auxiliar de teléfono celular de 5200 mAh, y usar VNC en la computadora portátil como una pantalla.

No conseguí que Jessie trabajara; ese era el problema: tenía un kernel de Wheezy y una imagen de Jessie, pero no tenía un kernel de Jessie.

Mike S
fuente
1
¿Puedes agregar una respuesta detallada sobre cómo lo resolviste usando el último kernel? Ayudará a otros usuarios que intentan emular a jessie. Gracias.
dhruvvyas90
3
He estado probando una imagen de jessie kernel y jessie y están fallando con el mismo error. Un kernel 4.1 ( github.com/dhruvvyas90/qemu-rpi-kernel/blob/master/… ) y la publicación regular de jessie en mayo de 2015 de Raspbian.
Michael McGarrah
Sin ofender, pero no hay tal cosa como un kernel jessie. Con el raspbian netinstaller puedes elegir instalar wheezy o jessie y en ambos casos se instala exactamente el mismo kernel.
Diederik de Haas
Aunque es cierto que los núcleos se nombran por versión, mi problema no era cómo descargar el instalador de raspbian. Mi problema fue hacer coincidir los archivos de imagen de las buenas personas en Raspberry Pi con una versión de kernel adecuada. En el futuro, espero que las personas que se encuentren con esta pregunta miren mis mensajes de error y se den cuenta de cuál puede ser su problema.
Mike S
@MichaelMcGarrah lo hizo funcionar después de leer el wiki de ese repositorio: raspberrypi.stackexchange.com/a/53993/33424 Tienes que modificar un poco la imagen de Raspbian.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1

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

ingrese la descripción de la imagen aquí

Pasos:

  1. Compile QEMU 2.9.0 de 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. Monta 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 lo último losetupen Ubuntu 16.04, otros métodos en: /ubuntu/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576

      Esto imprime un dispositivo de bucle, por ejemplo:

      /dev/loop0
      

      entonces hacemos:

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

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

Luego puede iniciar sesión en el terminal que se muestra en su terminal host.

Limitaciones actuales:

  • -M raspi2se agregó en QEMU 2.6.0, y Ubuntu 16.04 solo tiene QEMU 2.5.0, por lo que tenemos que 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 GUI por ahora.
  • sin redes

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

Este método utiliza el -M versatilepbque está presente en QEMU 2.5.0 de Ubuntu 16.04.

La desventaja es que debe descargar un kernel modificado (consulte Emulación con Qemu: ¿por qué el kernel adicional? ), Y modificar la imagen, por lo que es menos representativo del sistema real.

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

    Elegimos 4.4.12ya que esa es la versión del kernel en la imagen Raspbian.

    El proceso para generar esa gota de kernel se describe en el repositorio en: https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/36ede073f4ccb64f60200ede36c231afe9502070/tools

    ¿Por qué se necesita esta imagen de kernel adicional? Emulación con Qemu: ¿por qué el kernel adicional?

  2. Modifique la imagen 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. Edita 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. Correr:

    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, núcleo 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 -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 que -M raspi2aún es inestable .

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

En esta imagen más nueva, usando el mismo método para 2016-05-27, el núcleo 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)

bztsrc/raspi3-tutorial RPI3 metal desnudo en QEMU

https://github.com/bztsrc/raspi3-tutorial es un buen conjunto de ejemplos que simplemente funcionan en QEMU, comenzando ultra rápido en: Cómo hacer la emulación QEMU para imágenes de Raspberry Pi de metal desnudo

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
Tu método con losetupes demasiado complicado. En su lugar, solo puede usar fdisk -l your-image.img, y luego usar el desplazamiento de la partición en la mountopción -o loop,offset=$((512*YOUR_OFFSET)).
Ruslan
-M raspi2 no funciona
zhaofeng-shu33
0

La mayoría de las guías están desactualizadas y contienen enlaces rotos. Debe usar un núcleo parcheado que coincida con la versión raspbian que está usando.

La siguiente guía funciona a partir de febrero de 2017. Cuenta con un script que se encarga de cambiar la imagen raspbian para que se ejecute en QEMU, y también comparte su conexión de red con raspbian automáticamente.

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

nachoparker
fuente
-1

Puede descargar mi kernel personalizado (4.1.7) para Raspbian Jessie en mi github, polaco1782 . Siga las instrucciones en los archivos doc.

Cassiano Martin
fuente
1
Su núcleo me envía al modo de emergencia cada vez que intento emular. Hice lo que está escrito en el archivo Léame. (Vea la última publicación en -> raspberrypi.org/forums/viewtopic.php?t=112259 ) ¿Puede editar su respuesta para mostrar paso a paso lo que cambió en la imagen básica de jessie para que funcione? Será útil para otros usuarios, ya que ahora que la imagen de Jessie está en vivo, más y más usuarios van a emular a Jessie en Qemu. Gracias por adelantado.
dhruvvyas90
¿Puedes expandir tu respuesta para explicar qué es lo que es personalizado sobre tu núcleo?
Greenonline
Pude resolver mi problema comentando fstablas entradas mmcblk.
dhruvvyas90
@Greenonline Dado que qemu no es compatible con la plataforma Rpi, hay un ajuste de configuración del núcleo necesario para emular rpi en Qemu. No puede simplemente tomar el kernel Rpi y hacer que funcione de inmediato.
dhruvvyas90