GNU/Linux >> Tutoriels Linux >  >> Linux

Linux - Pourquoi le noyau ne peut-il pas exécuter Init ?

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

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

make versatile_defconfig
make menuconfig

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

  • Prise en charge PCI (CONFIG_PCI)
  • Prise en charge des périphériques SCSI (CONFIG_SCSI)
  • Prise en charge des disques SCSI (CONFIG_BLK_DEV_SD)
  • SYM53C8XX Prise en charge SCSI version 2 (CONFIG_SCSI_SYM53C8XX_2)
  • Le système de fichiers Extended 3 (ext3) (CONFIG_EXT3_FS)
  • Le système de fichiers Extended 4 (ext4) (CONFIG_EXT4_FS)

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

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

J'ai ensuite démonté l'image et tenté 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 noyau a pu monter le système de fichiers mais il a immédiatement rencontré des 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 suis demandé si ce n'était pas lié à SELinux. J'ai essayé de démarrer le noyau 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 également essayé ce qui suit, sans succès :

  • J'ai essayé de compiler avec et sans CONFIG_VFP activé
  • J'ai ajouté CONFIG_DEVTMPFS et CONFIG_DEVTMPFS_MOUNT
  • Appliquer ce correctif et activer CPU_V6 , CONFIG_MMC_BCM2835 , &CONFIG_MMC_BCM2835_DMA
  • Utilisation de gcc-linaro-arm-linux-gnueabihf-raspbian chaîne d'outils
  • Compiler un programme C simple avec la chaîne d'outils, puis transmettre son chemin au noyau via init= fonctionne - me laissant croire qu'il existe une différence entre les formats binaires

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

J'ai compilé ce programme C simple avec la chaîne d'outils :

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

…et l'a copié dans /root dans l'image, en changeant le init= paramètre de démarrage sur /root/simple . Cela me donne ce qui suit lors du démarrage :

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

Il semble s'étouffer avec le execv() appeler.

Réponse acceptée :

J'ai également essayé de démarrer des images ARM avec QEMU sans succès fiable. Je suis désolé de dire que vous devrez utiliser du matériel réel pour travailler avec un système d'exploitation ARM, ou attendre patiemment que les développeurs créent un émulateur plus fiable pour ARM.

Connexe :rechercher des fichiers dont les noms de chemin contiennent plusieurs mots sans ordre spécifique entre eux ?

C'est en décembre 2018, et il y a toujours des problèmes avec qemu-system-arm .

J'ai pu démarrer Raspbian Jessie sur un émulateur QEMU en utilisant un Ubuntu 18 Bionic fraîchement installé, mais ce n'était pas stable pour mon travail, j'ai donc dû le laisser pour du vrai matériel. Il gèlerait fréquemment.

qemu-system-arm ne fonctionnait pas sur mon système d'exploitation, j'ai donc utilisé Virtualbox pour installer Ubuntu Bionic et à l'intérieur de Bionic j'ai installé Raspbian avec QEMU.

J'ai suivi ce tuto :https://azeria-labs.com/emulate-raspberry-pi-with-qemu/

Bonne chance


Linux
  1. Tests d'intégration continue pour le noyau Linux

  2. Linux - Pourquoi n'y a-t-il pas de système de fichiers Rootfs présent sur le système ?

  3. Linux – Init Process :ancêtre de tous les processus ?

  4. Pourquoi je ne peux pas exporter l'affichage Linux ?

  5. Pouvez-vous exécuter Xcode sous Linux ?

Analyser le noyau Linux avec ftrace

Comment le noyau Linux gère les interruptions

Le noyau Linux :Top 5 des innovations

Le cycle de vie des tests du noyau Linux

Comment vérifier la version du noyau sous Linux

Linux - Participer à la liste de diffusion du noyau ?