Pourquoi le kernel ne peut pas exécuter init?

J'ai téléchargé l'image Raspbian sur cette page . J'essaye de comstackr un kernel qui peut être utilisé pour démarrer l'image dans qemu.

J'ai téléchargé la source du kernel Linux de kernel.org et j'ai exécuté:

make versatile_defconfig make menuconfig 

J'ai ensuite ajouté les fonctionnalités suivantes au kernel:

  • Support PCI (CONFIG_PCI)
  • Prise en charge des périphériques SCSI (CONFIG_SCSI)
  • Prise en charge du disque SCSI (CONFIG_BLK_DEV_SD)
  • Support SCSI SYM53C8XX Version 2 (CONFIG_SCSI_SYM53C8XX_2)
  • Le système de files étendu 3 (ext3) (CONFIG_EXT3_FS)
  • Le système de files étendu 4 (ext4) (CONFIG_EXT4_FS)

J'ai également monté en boucle l'image disque et:

  • a commenté /etc/ld.so.preload
  • ajusté /etc/fstab pour utiliser /dev/sda1 et /dev/sda2

J'ai ensuite démonté l'image et essayé de démarrer la machine avec:

 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" 

Le kernel a pu monter le système de files mais il a immédiatement eu quelques problèmes:

 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 

Au début, je me demandais si cela n'était pas lié à SELinux. J'ai essayé de démarrer le kernel avec:

 selinux=0 enforcing=0 

… mais cela n'a fait aucune différence.

Qu'est-ce que je fais mal? Et que signifie cette erreur?

Mises à jour

J'ai aussi essayé ce qui suit, sans succès:

  • J'ai essayé de comstackr avec et sans CONFIG_VFP activé
  • J'ai ajouté CONFIG_DEVTMPFS et CONFIG_DEVTMPFS_MOUNT
  • Appliquer ce patch et activer CPU_V6 , CONFIG_MMC_BCM2835 , & CONFIG_MMC_BCM2835_DMA
  • Utilisation de la string d'outils gcc-linaro-arm-linux-gnueabihf-raspbian
  • Comstackr un programme C simple avec la chaine d'outils, puis passer son path au kernel via init= works – m'amener à croire qu'il y a un décalage entre les formats binarys

    • 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 ssortingpped 
    • 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, ssortingpped` 
    • diff de l'en-tête ELF

J'ai compilé ce programme C simple avec la string d'outils:

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

… et copié dans /root dans l'image, en changeant le paramètre init= boot en /root/simple . Cela me donne les éléments suivants lors du démarrage:

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

Il semble être étouffant sur l'appel execv() .

Je sais que c'est une question assez ancienne, mais comme il n'y a toujours pas de bonnes réponses pour tester les images Raspberry Pi avec QEMU, permettez-moi de vous apporter une réponse partielle.

Je voulais utiliser l' image Ubuntu 16.04 raspi3 avec QEMU. Il a téléchargé, extrait, monté la partition de démarrage, a obtenu le file vmlinuz et le file initrd, et … qemu-system-arm -M blabla -cpu … -kernel … ne fonctionne pas. Écran noir.

Ensuite, en utilisant un kernel-qemu-4.4.34-jessie d' ici avec l'image xenial / rootfs conduit à la même init tué problème que vous avez.

Mais puisque j'utilise un kernel bien connu et que votre programme C simple lié statiquement fonctionne, il est probable que le problème ne concerne que les surfaces lorsque l'on utilise l'éditeur de liens dynamic. (Et l'éditeur de liens n'est pas particulièrement sensible aux kernelx, car le ld-2.24 du dernier raspbian basé sur debian9 (étirement) fonctionne bien sur un kernel basé sur la version debian8 (jessie) 4.4).

Même après avoir copié les files qui fonctionnent sur / avec l'image "jessie" dans l'image xenial ubuntu, je n'ai eu qu'une étrange erreur "calling preinit: KE".

Oh, et quiconque cherche à comstackr un kernel pour un Raspberry Pi, devrait vérifier ce site (qui fait directement reference aux docs / howto " officiels ").