Perché il kernel non può eseguire init?


14

Ho scaricato l'immagine Raspbian in questa pagina . Sto cercando di compilare un kernel che può essere usato per avviare l'immagine all'interno di qemu.

Ho scaricato il sorgente del kernel Linux da kernel.org ed eseguito:

make versatile_defconfig
make menuconfig

Ho quindi aggiunto le seguenti funzionalità al kernel:

  • Supporto PCI (CONFIG_PCI)
  • Supporto dispositivo SCSI (CONFIG_SCSI)
  • Supporto disco SCSI (CONFIG_BLK_DEV_SD)
  • Supporto SCSI SYM53C8XX versione 2 (CONFIG_SCSI_SYM53C8XX_2)
  • Il filesystem Extended 3 (ext3) (CONFIG_EXT3_FS)
  • Il filesystem Extended 4 (ext4) (CONFIG_EXT4_FS)

Ho anche montato l'immagine del disco in loop e:

  • commentata /etc/ld.so.preload
  • adattato /etc/fstabper l'uso /dev/sda1e/dev/sda2

Ho quindi smontato l'immagine e ho tentato di avviare la macchina 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"

Il kernel è stato in grado di montare il filesystem ma ha subito subito qualche problema:

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

All'inizio, mi chiedevo se questo non fosse correlato a SELinux. Ho provato ad avviare il kernel con:

selinux=0 enforcing=0

... ma non ha fatto assolutamente alcuna differenza.

Che cosa sto facendo di sbagliato? E cosa significa questo errore?

aggiornamenti

Ho anche provato quanto segue, senza fortuna:

  • Ho provato a compilare con e senza CONFIG_VFPabilitato
  • Ho aggiunto CONFIG_DEVTMPFSeCONFIG_DEVTMPFS_MOUNT
  • Applicazione di questa patch e abilitazioneCPU_V6 , CONFIG_MMC_BCM2835, &CONFIG_MMC_BCM2835_DMA
  • Usando il gcc-linaro-arm-linux-gnueabihf-raspbian toolchain
  • Compilare un semplice programma C con la toolchain e quindi passare il suo percorso al kernel tramite i init=lavori - portandomi a credere che ci sia una discrepanza tra i formati binari

    • 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 dell'intestazione ELF

Ho compilato questo semplice programma C con la toolchain:

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

... e l'ho copiato /rootnell'immagine, cambiando il init=parametro di avvio in /root/simple. Questo mi dà quanto segue all'avvio:

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

Sembra soffocare alla execv()chiamata.


3
Direi che questo è un problema relativo al supporto in virgola mobile. Hai CONFIG_VFP = y?
Alexandre Belloni,

@AlexandreBelloni cat .config | grep CONFIG_VFPproduce CONFIG_VFP=y- sembra che sia abilitato.
Nathan Osman,

@AlexandreBelloni Ho provato il kernel con e senza CONFIG_VFPe non fa differenza.
Nathan Osman,

1
Penso che Alexandre sia sulla buona strada, ma VFP non è l'impostazione problematica. versatilepbè una CPU ARM926, che è più vecchia di ARM1176 del RPi, quindi i binari di Raspbian potrebbero usare qualche altra funzionalità che non viene emulata. Da unixmen.com/emulating-raspbian-using-qemu , -cpu arm1176aiuta?
Gilles 'SO- smetti di essere malvagio' il

1
Hmmm. Forse provare una toolchain armel? (Per il programma vero e proprio che continua a funzionare, non solo per lo stub di inoltro. Potresti usare busybox - prendi il binario busybox-static dall'armel debian.)
Gilles

Risposte:


1

Ho anche provato ad avviare le immagini ARM con QEMU senza successo affidabile. Mi dispiace dire che dovrai usare l'hardware reale per lavorare con un sistema operativo ARM o attendere pazientemente che gli sviluppatori realizzino un emulatore più affidabile per ARM.

È dicembre 2018, e ancora ci sono ancora problemi con qemu-system-arm.

Sono stato in grado di avviare Raspbian Jessie su un emulatore QEMU usando Ubuntu 18 Bionic appena installato, tuttavia non era stabile per il mio lavoro, quindi ho dovuto lasciarlo per un vero hardware. Si congelerebbe frequentemente.

qemu-system-arm non ha funzionato sul mio sistema operativo, quindi ho usato Virtualbox per installare Ubuntu Bionic e all'interno di Bionic ho installato Raspbian con QEMU.

Ho seguito questo tutorial: https://azeria-labs.com/emulate-raspberry-pi-with-qemu/

In bocca al lupo


1

So che è una domanda un po 'invecchiata, ma dal momento che ci sono ancora buone risposte per testare le immagini Raspberry Pi con QEMU, permettimi di contribuire con una risposta parziale.

Volevo usare l' immagine raspi3 di Ubuntu 16.04 con QEMU. Scaricato, estratto, montato la partizione di avvio, ottenuto il file vmlinuz e il file initrd e ... qemu-system-arm -M blabla -cpu ... -kernel ... non funziona. Schermo nero.

Quindi usare un kernel-qemu-4.4.34-jessie da qui con l'immagine xenial / rootfs ha portato allo stesso problema "init kill" che hai.

Ma dal momento che sto usando un noto kernel noto, e poiché il tuo semplice programma C collegato staticamente funziona, è probabile che il problema affiora solo quando si usa il linker dinamico. (E il linker non è particolarmente sensibile ai kernel, perché ld-2.24 dell'ultimo raspbian basato su debian9 (stretch) funziona bene su un kernel 4.4 basato su debian8 (jessie).)

Anche dopo aver copiato i file che funzionano su / con l'immagine "jessie" nell'immagine xenial di Ubuntu ho avuto solo uno strano errore "chiamando preinit: KE".

Oh, e chiunque cerchi di compilare un kernel per un Raspberry Pi, dovrebbe controllare questo sito, che fa direttamente riferimento ai documenti / howto " ufficiali ".


0

Il kernel di Linux non esegue più init, ma esegue systemd, che è come init, ma offre funzionalità un po 'più avanzate e capacità di multitasking extra, sebbene contro la filosofia unix systemd sia utile.


non sono sicuro se questo sia noto come
Qasim
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.