Warum kann der Kernel init nicht ausführen?

14

Ich habe das Raspbian-Bild auf dieser Seite heruntergeladen . Ich versuche einen Kernel zu kompilieren, mit dem das Image in qemu gebootet werden kann.

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

make versatile_defconfig
make menuconfig

Ich habe dann die folgenden Funktionen 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 schleife auch das Disk-Image und:

  • auskommentiert /etc/ld.so.preload
  • angepasst /etc/fstabzu verwenden /dev/sda1und/dev/sda2

Ich habe dann das Image abgehä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 konnte das Dateisystem mounten, es gab jedoch sofort einige Probleme:

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 zu tun hat. 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?

Aktualisierung

Ich habe auch Folgendes ohne Glück versucht:

  • Ich habe versucht, mit und ohne CONFIG_VFPaktiviert zu kompilieren
  • Ich fügte hinzu CONFIG_DEVTMPFSundCONFIG_DEVTMPFS_MOUNT
  • Die Anwendung dieses Patches und ermöglicht CPU_V6, CONFIG_MMC_BCM2835&CONFIG_MMC_BCM2835_DMA
  • Mit Hilfe der gcc-linaro-arm-linux-gnueabihf-raspbianToolchain
  • Kompilieren Sie ein einfaches C-Programm mit der Toolchain und übergeben Sie den Pfad über init=works an den Kernel. Dies lässt mich vermuten, dass es eine Diskrepanz zwischen den 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 kopierte es /rootin das Image und änderte den init=Boot-Parameter in /root/simple. Dadurch erhalte ich beim Booten Folgendes:

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

Es scheint beim execv()Anruf zu ersticken .

Nathan Osman
quelle
3
Ich würde sagen, dass dies ein Problem in Bezug auf die Unterstützung von harten Gleitkommazahlen ist. Haben Sie CONFIG_VFP = y?
Alexandre Belloni
@AlexandreBelloni cat .config | grep CONFIG_VFPergibt CONFIG_VFP=y- scheint aktiviert zu sein.
Nathan Osman
@AlexandreBelloni Ich habe den Kernel mit und ohne ausprobiert CONFIG_VFPund es macht keinen Unterschied.
Nathan Osman
1
Ich denke, Alexandre ist auf dem richtigen Weg, aber VFP ist nicht das problematische Umfeld. versatilepbDa es sich um eine ARM926-CPU handelt, die älter als die ARM1176 des RPi ist, verwenden Raspbian-Binärdateien möglicherweise eine andere Funktion, die nicht emuliert wird. Von unixmen.com/emulating-raspbian-using-qemu , tut -cpu arm1176Hilfe?
Gilles 'SO- hör auf böse zu sein'
1
Hmmm. Vielleicht versuchen Sie es mit einer Armel-Toolchain? (Für das eigentliche Programm, das weiterläuft, nicht nur für den Relay-Stub. Sie könnten busybox verwenden - holen Sie sich die busybox-static-Binärdatei von debian armel.)
Gilles '

Antworten:

1

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

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, so dass ich es für echte Hardware belassen musste. Es würde häufig einfrieren.

qemu-system-arm funktionierte auf meinem Betriebssystem nicht, daher habe ich Ubuntu Bionic mit Virtualbox und Raspbian mit QEMU in Bionic installiert.

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

Viel Glück

Ascari Gh
quelle
1

Ich weiß, es ist eine etwas veraltete Frage, aber da es immer noch keine guten Antworten zum Testen von Raspberry Pi-Bildern mit QEMU gibt, lassen Sie mich eine Teilantwort beisteuern.

Ich wollte das Ubuntu 16.04 raspi3-Image mit QEMU verwenden. Es wurde heruntergeladen, extrahiert, die Boot-Partition gemountet, die vmlinuz-Datei und die initrd-Datei abgerufen und ... qemu-system-arm -M blabla -cpu ... -kernel ... funktioniert nicht. Schwarzer Bildschirm.

Die Verwendung eines Kernel-Qemu-4.4.34-Jessie von hier mit dem Xenial-Image / Rootfs führte zu demselben "Init-Killed" -Problem, das Sie hatten.

Aber da ich einen bekannten guten Kernel verwende und Ihr einfaches statisch verknüpftes C-Programm funktioniert, ist es wahrscheinlich, dass das Problem nur auftritt, wenn man den dynamischen Linker verwendet. (Und der Linker reagiert nicht besonders empfindlich auf Kernel, da die ld-2.24 aus dem neuesten auf debian9 (stretch) basierenden Raspbian auf einem auf 4.4 debian8 (jessie) basierenden Kernel einwandfrei funktioniert.)

Selbst nach dem Kopieren der Dateien, die mit / auf dem "jessie" -Image funktionieren, in das Ubuntu-Xenial-Image kam es nur zu einem seltsamen "Aufruf preinit: KE" -Fehler.

Oh, und jeder, der einen Kernel für einen Raspberry Pi kompilieren möchte, sollte diese Seite besuchen , die direkt auf die " offiziellen " Dokumente / Anleitungen verweist.

PAStheLoD
quelle
0

Der Linux-Kernel läuft nicht mehr mit init, sondern mit systemd, das wie init ist, aber ein bisschen fortgeschrittenere Funktionen und zusätzliche Multitasking-Fähigkeiten bietet, obwohl dies gegen die Unix-Philosophie systemd nützlich ist.

Qasim
quelle
Ich