GNU/Linux >> Linux Esercitazione >  >> Linux

Linux:perché il kernel non può eseguire Init?

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

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

make versatile_defconfig
make menuconfig

Ho quindi aggiunto le seguenti funzionalità al kernel:

  • Supporto PCI (CONFIG_PCI)
  • Supporto per dispositivi 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 in loop l'immagine del disco e:

  • ha commentato /etc/ld.so.preload
  • regolato /etc/fstab per usare /dev/sda1 e /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 riscontrato dei problemi:

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 faceva 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_VFP abilitato
  • Ho aggiunto CONFIG_DEVTMPFS e CONFIG_DEVTMPFS_MOUNT
  • Applicare questa patch e abilitare CPU_V6 , CONFIG_MMC_BCM2835 , &CONFIG_MMC_BCM2835_DMA
  • Utilizzo di gcc-linaro-arm-linux-gnueabihf-raspbian catena di strumenti
  • Compilare un semplice programma C con la toolchain e quindi passare il suo percorso al kernel tramite init= funziona, 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 in /root nell'immagine, cambiando il init= parametro di avvio su /root/simple . Questo mi dà quanto segue all'avvio:

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

Sembra soffocare su execv() chiama.

Risposta accettata:

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

Correlati:cercare file i cui percorsi contengono più parole senza un ordine specifico tra di loro?

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

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

qemu-system-arm non funzionava 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/

Buona fortuna


Linux
  1. Il kernel Linux:le 5 migliori innovazioni

  2. Il ciclo di vita dei test del kernel Linux

  3. Perché il kernel dovrebbe eliminare i pacchetti?

  4. Linux – Partecipare alla mailing list del kernel?

  5. Cosa significa __init nel codice del kernel di Linux?

Come il kernel Linux gestisce gli interrupt

Test di integrazione continui per il kernel Linux

Come controllare la versione del kernel in Linux

Puoi eseguire Xcode in Linux?

Perché il metodo probe è necessario nei driver di dispositivo Linux oltre a init?

Perché pr_debug del kernel Linux non fornisce alcun output?