GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿por qué el kernel no puede ejecutar Init?

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 de kernel.org y ejecuté:

make versatile_defconfig
make menuconfig

Luego agregué las siguientes funciones al kernel:

  • Compatibilidad con PCI (CONFIG_PCI)
  • Compatibilidad con dispositivos SCSI (CONFIG_SCSI)
  • Soporte de disco SCSI (CONFIG_BLK_DEV_SD)
  • Compatibilidad con SCSI SYM53C8XX versión 2 (CONFIG_SCSI_SYM53C8XX_2)
  • El sistema de archivos Extended 3 (ext3) (CONFIG_EXT3_FS)
  • El sistema de archivos Extended 4 (ext4) (CONFIG_EXT4_FS)

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

  • comentó /etc/ld.so.preload
  • ajustado /etc/fstab para usar /dev/sda1 y /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 núcleo fue capaz de montar el sistema de archivos, pero de inmediato se encontró con 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 kernel con:

selinux=0 enforcing=0

…pero no hizo absolutamente ninguna diferencia.

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

Actualizaciones

También probé lo siguiente, sin suerte:

  • Intenté compilar con y sin CONFIG_VFP habilitado
  • Agregué CONFIG_DEVTMPFS y CONFIG_DEVTMPFS_MOUNT
  • Aplicando este parche y habilitando CPU_V6 , CONFIG_MMC_BCM2835 , &CONFIG_MMC_BCM2835_DMA
  • Uso del gcc-linaro-arm-linux-gnueabihf-raspbian cadena de herramientas
  • Compilar un programa C simple con la cadena de herramientas y luego pasar su ruta al kernel a través de init= funciona, lo que me lleva a 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é en /root en 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 el execv() llamar.

Respuesta aceptada:

También intenté arrancar imágenes ARM con QEMU sin un é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.

Relacionado:¿Buscar archivos cuyos nombres de ruta contengan varias palabras sin un orden específico entre ellas?

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

Pude iniciar 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 el hardware real. Se congelaba con frecuencia.

qemu-system-arm no funcionó 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


Linux
  1. Linux:¿por qué no hay un sistema de archivos Rootfs presente en el sistema?

  2. ¿Por qué el kernel soltaría paquetes?

  3. Linux – Proceso de inicio:¿ancestro de todos los procesos?

  4. ¿Por qué no puedo exportar la pantalla de Linux?

  5. ¿Por qué se necesita el método de sondeo en los controladores de dispositivos de Linux además de init?

Cómo el kernel de Linux maneja las interrupciones

El kernel de Linux:las 5 principales innovaciones

El ciclo de vida de las pruebas del kernel de Linux

Cómo verificar la versión del kernel en Linux

¿Qué significa __init en el código del kernel de Linux?

¿Por qué alguien querría ejecutar UserMode Linux (UML)?