¿Por qué el núcleo no puede ejecutar init?

14

He descargado la imagen de Raspbian en esta página . Estoy tratando de compilar un kernel que pueda usarse para arrancar la imagen dentro de qemu.

Descargué la fuente del kernel de Linux desde kernel.org y ejecuté:

make versatile_defconfig
make menuconfig

Luego agregué las siguientes características al núcleo:

  • Soporte PCI (CONFIG_PCI)
  • Soporte de dispositivo SCSI (CONFIG_SCSI)
  • Soporte de disco SCSI (CONFIG_BLK_DEV_SD)
  • SYM53C8XX Versión 2 Soporte SCSI (CONFIG_SCSI_SYM53C8XX_2)
  • El sistema de archivos extendido 3 (ext3) (CONFIG_EXT3_FS)
  • El sistema de archivos extendido 4 (ext4) (CONFIG_EXT4_FS)

También monté en bucle la imagen del disco y:

  • Comentado /etc/ld.so.preload
  • ajustado /etc/fstabpara usar /dev/sda1y/dev/sda2

Luego desmonté la imagen e intenté iniciar la máquina con:

qemu-system-arm \
    -M versatilepb \
    -m 256 \
    -kernel linux-4.3/arch/arm/boot/zImage \
    -hda 2015-09-24-raspbian-jessie.img \
    -serial stdio \
    -append "root=/dev/sda2 rootfstype=ext4 rw console=ttyAMA0"

El kernel pudo montar el sistema de archivos pero inmediatamente tuvo algunos problemas:

Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004

CPU: 0 PID: 1 Comm: init Not tainted 4.3.0 #1
Hardware name: ARM-Versatile PB
[<c001b5c0>] (unwind_backtrace) from [<c0017e18>] (show_stack+0x10/0x14)
[<c0017e18>] (show_stack) from [<c0069860>] (panic+0x84/0x1ec)
[<c0069860>] (panic) from [<c0025b98>] (do_exit+0x81c/0x850)
[<c0025b98>] (do_exit) from [<c0025c5c>] (do_group_exit+0x3c/0xb8)
[<c0025c5c>] (do_group_exit) from [<c002dfcc>] (get_signal+0x14c/0x59c)
[<c002dfcc>] (get_signal) from [<c001bf28>] (do_signal+0x84/0x3a0)
[<c001bf28>] (do_signal) from [<c0017a94>] (do_work_pending+0xb8/0xc8)
[<c0017a94>] (do_work_pending) from [<c0014f30>] (slow_work_pending+0xc/0x20)
---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004

Al principio, me preguntaba si esto no estaba relacionado con SELinux. Intenté arrancar el núcleo con:

selinux=0 enforcing=0

... pero no hizo absolutamente ninguna diferencia.

¿Qué estoy haciendo mal? ¿Y qué significa este error?

Actualizaciones

También he intentado lo siguiente, sin suerte:

  • Traté de compilar con y sin CONFIG_VFPhabilitar
  • Agregué CONFIG_DEVTMPFSyCONFIG_DEVTMPFS_MOUNT
  • La aplicación de este parche y permitiendo CPU_V6, CONFIG_MMC_BCM2835, yCONFIG_MMC_BCM2835_DMA
  • Usando la gcc-linaro-arm-linux-gnueabihf-raspbiancadena de herramientas
  • Compilar un programa C simple con la cadena de herramientas y luego pasar su ruta al núcleo a través de init=trabajos, lo que me hace creer que hay una discrepancia entre los formatos binarios

    • file <sample program>:

      ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.26, BuildID[sha1]=e5ec8884499c51b248df60aedddfc9acf72cdbd4, not stripped
      
    • file <file from the image>:

      ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=3e92423821f3325f8cb0ec5d918a7a1c76bbd72c, stripped`
      
    • diff del encabezado ELF

Compilé este sencillo programa en C con la cadena de herramientas:

<path>/arm-linux-gnueabihf-gcc --static simple.c -o simple

... y lo copié /rooten la imagen, cambiando el init=parámetro de arranque a /root/simple. Esto me da lo siguiente al arrancar:

Starting bash...
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004

Parece que se está ahogando con la execv()llamada.

Nathan Osman
fuente
3
Yo diría que este es un problema con respecto al soporte de punto flotante duro. ¿Tienes CONFIG_VFP = y?
Alexandre Belloni
@AlexandreBelloni cat .config | grep CONFIG_VFPcede CONFIG_VFP=y: parece que está habilitado.
Nathan Osman
@AlexandreBelloni He probado el kernel con y sin CONFIG_VFPy no hay diferencia.
Nathan Osman
1
Creo que Alexandre está en el camino correcto, pero VFP no es la configuración problemática. versatilepbes una CPU ARM926, que es más antigua que la ARM1176 del RPi, por lo que los binarios de Raspbian pueden estar usando alguna otra característica que no se emula. De unixmen.com/emulating-raspbian-using-qemu , ¿ -cpu arm1176ayuda?
Gilles 'SO- deja de ser malvado'
1
Hmmm ¿Quizás probar una cadena de herramientas Armel? (. Para el programa que actualmente sigue funcionando, no sólo para el talón de relé Se podría utilizar busybox -. Agarrar el binario busybox-estática de Armel debian)
Gilles 'SO- estar parada mal'

Respuestas:

1

También he intentado arrancar imágenes ARM con QEMU sin éxito confiable. Lamento decir que tendrá que usar hardware real para trabajar con un sistema operativo ARM, o esperar pacientemente a que los desarrolladores creen un emulador más confiable para ARM.

Es diciembre de 2018, y todavía hay problemas con qemu-system-arm.

Pude arrancar Raspbian Jessie en un emulador QEMU usando un Ubuntu 18 Bionic recién instalado, sin embargo, no era estable para mi trabajo, así que tuve que dejarlo para hardware real. Se congelaría con frecuencia.

qemu-system-arm no funcionaba en mi sistema operativo, así que usé Virtualbox para instalar Ubuntu Bionic y dentro de Bionic instalé Raspbian con QEMU.

Seguí este tutorial: https://azeria-labs.com/emulate-raspberry-pi-with-qemu/

Buena suerte

Ascari Gh
fuente
1

Sé que es una pregunta un tanto antigua, pero como todavía no hay buenas respuestas para probar imágenes de Raspberry Pi con QEMU, permítanme aportar una respuesta parcial.

Quería usar la imagen raspi3 de Ubuntu 16.04 con QEMU. Lo descargué, lo extraje, monté la partición de arranque, obtuve el archivo vmlinuz y el archivo initrd, y ... qemu-system-arm -M blabla -cpu ... -kernel ... no funciona. Pantalla en negro.

Luego, usar un kernel-qemu-4.4.34-jessie desde aquí con la imagen xenial / rootfs condujo al mismo problema de "inicio asesinado" que usted tiene.

Pero dado que estoy usando un buen núcleo conocido, y dado que su simple programa C vinculado estáticamente funciona, es probable que el problema solo surja cuando uno usa el vinculador dinámico. (Y el enlazador no es particularmente sensible a los núcleos, porque el ld-2.24 del último raspbian basado en debian9 (estiramiento) funciona bien en un núcleo basado en 4.4 debian8 (jessie).)

Incluso después de copiar los archivos que funcionan en / con la imagen "jessie" en la imagen xenial de ubuntu, solo recibí un extraño error de "preinit de llamada: KE".

Ah, y cualquiera que esté buscando compilar un núcleo para una Raspberry Pi, debería consultar este sitio, que hace referencia directa a los documentos / procedimientos " oficiales ".

PAStheLoD
fuente
0

El kernel de Linux ya no ejecuta init, sino que ejecuta systemd, que es como init pero con características un poco más avanzadas y capacidades de multitarea adicionales, aunque contra la filosofía de unix, systemd es útil.

Qasim
fuente
no estoy seguro si esto se sabe cómo será
Qasim