GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Warum kann der Kernel Init nicht ausführen?

Ich habe das Raspbian-Image auf dieser Seite heruntergeladen. Ich versuche, einen Kernel zu kompilieren, der verwendet werden kann, um das Image innerhalb von qemu zu booten.

Ich habe die Linux-Kernel-Quelle von kernel.org heruntergeladen und ausgeführt:

make versatile_defconfig
make menuconfig

Ich habe dann die folgenden Features zum Kernel hinzugefügt:

  • PCI-Unterstützung (CONFIG_PCI)
  • SCSI-Geräteunterstützung (CONFIG_SCSI)
  • SCSI-Festplattenunterstützung (CONFIG_BLK_DEV_SD)
  • SYM53C8XX Version 2 SCSI-Unterstützung (CONFIG_SCSI_SYM53C8XX_2)
  • Das Extended 3 (ext3) Dateisystem (CONFIG_EXT3_FS)
  • Das Extended 4 (ext4) Dateisystem (CONFIG_EXT4_FS)

Ich habe auch das Disk-Image geloopt und:

  • /etc/ld.so.preload auskommentiert
  • /etc/fstab angepasst um /dev/sda1 zu verwenden und /dev/sda2

Ich habe dann das Image ausgehängt und versucht, die Maschine zu starten mit:

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"

Der Kernel war in der Lage, das Dateisystem zu mounten, aber es geriet sofort in Schwierigkeiten:

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

Zuerst habe ich mich gefragt, ob das nicht mit SELinux zusammenhängt. Ich habe versucht, den Kernel zu booten mit:

selinux=0 enforcing=0

…aber es machte absolut keinen Unterschied.

Was mache ich falsch? Und was bedeutet dieser Fehler?

Aktualisierungen

Ich habe auch Folgendes versucht, ohne Glück:

  • Ich habe versucht, mit und ohne CONFIG_VFP zu kompilieren aktiviert
  • Ich habe CONFIG_DEVTMPFS hinzugefügt und CONFIG_DEVTMPFS_MOUNT
  • Diesen Patch anwenden und CPU_V6 aktivieren , CONFIG_MMC_BCM2835 , &CONFIG_MMC_BCM2835_DMA
  • Mit gcc-linaro-arm-linux-gnueabihf-raspbian Werkzeugkette
  • Ein einfaches C-Programm mit der Toolchain kompilieren und dann seinen Pfad über init= an den Kernel übergeben funktioniert – was mich glauben lässt, dass es eine Diskrepanz zwischen Binärformaten gibt

    • 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 des ELF-Headers

Ich habe dieses einfache C-Programm mit der Toolchain kompiliert:

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

…und nach /root kopiert im Bild, Ändern des init= Boot-Parameter nach /root/simple . Das gibt mir beim Booten folgendes:

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

Es scheint an execv() zu ersticken anrufen.

Akzeptierte Antwort:

Ich habe auch versucht, ARM-Images mit QEMU zu booten, ohne zuverlässigen Erfolg. Es tut mir leid zu sagen, dass Sie echte Hardware verwenden müssen, um mit einem ARM-Betriebssystem zu arbeiten, oder geduldig darauf warten, dass Entwickler einen zuverlässigeren Emulator für ARM entwickeln.

Verwandte:Nach Dateien suchen, deren Pfadnamen mehrere Wörter ohne bestimmte Reihenfolge zwischen ihnen enthalten?

Es ist Dezember 2018 und es gibt immer noch Probleme mit qemu-system-arm .

Ich konnte Raspbian Jessie auf einem QEMU-Emulator mit einem frisch installierten Ubuntu 18 Bionic booten, aber es war für meine Arbeit nicht stabil, also musste ich es für echte Hardware belassen. Es würde häufig einfrieren.

qemu-system-arm funktionierte nicht auf meinem Betriebssystem, also habe ich Virtualbox verwendet, um Ubuntu Bionic zu installieren, und innerhalb von Bionic habe ich Raspbian mit QEMU installiert.

Ich habe dieses Tutorial befolgt:https://azeria-labs.com/emulate-raspberry-pi-with-qemu/

Viel Glück


Linux
  1. Der Linux-Kernel:Top 5 Innovationen

  2. Der Lebenszyklus des Linux-Kernel-Testens

  3. Warum würde der Kernel Pakete fallen lassen?

  4. Können Sie Xcode unter Linux ausführen?

  5. Was bedeutet __init im Linux-Kernel-Code?

Wie der Linux-Kernel mit Interrupts umgeht

Kontinuierliche Integrationstests für den Linux-Kernel

So überprüfen Sie die Kernel-Version in Linux

Warum gibt pr_debug des Linux-Kernels keine Ausgabe aus?

Warum den Linux-Kernel vor dem Root-Benutzer schützen?

Warum ist der Linux-NFS-Server im Gegensatz zum Userspace im Kernel implementiert?