Por que o kernel não pode executar o init?

11

Eu fiz o download da imagem Raspbian em esta página . Estou tentando compilar um kernel que pode ser usado para inicializar a imagem dentro do qemu.

Eu baixei a fonte do kernel Linux do kernel.org e corri:

make versatile_defconfig
make menuconfig

Em seguida, adicionei os seguintes recursos ao kernel:

  • suporte PCI (CONFIG_PCI)
  • Suporte a dispositivos SCSI (CONFIG_SCSI)
  • Suporte a disco SCSI (CONFIG_BLK_DEV_SD)
  • Suporte SCSI SYM53C8XX Versão 2 (CONFIG_SCSI_SYM53C8XX_2)
  • O sistema de arquivos Extended 3 (ext3) (CONFIG_EXT3_FS)
  • O sistema de arquivos Extended 4 (ext4) (CONFIG_EXT4_FS)

Eu também montei a imagem de disco e:

  • comentou /etc/ld.so.preload
  • /etc/fstab ajustada para usar /dev/sda1 e /dev/sda2

Depois, desmontei a imagem e tentei iniciar a máquina com:

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"

O kernel foi capaz de montar o sistema de arquivos, mas imediatamente se deparou com alguns problemas:

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

Primeiro, eu me perguntei se isso não estava relacionado ao SELinux. Eu tentei inicializar o kernel com:

selinux=0 enforcing=0

... mas não fez diferença alguma.

O que estou fazendo de errado? E o que esse erro significa?

Atualizações

Eu também tentei o seguinte, sem sorte:

  • Eu tentei compilar com e sem CONFIG_VFP enabled
  • Eu adicionei CONFIG_DEVTMPFS e CONFIG_DEVTMPFS_MOUNT
  • Aplicando este patch e ativando CPU_V6 , CONFIG_MMC_BCM2835 , & %código%
  • Usando o CONFIG_MMC_BCM2835_DMA toolchain
  • Compilando um programa C simples com o toolchain e passando seu caminho para o kernel via gcc-linaro-arm-linux-gnueabihf-raspbian works - levando-me a acreditar que há uma discrepância entre os formatos binários

    • init= :

      ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.26, BuildID[sha1]=e5ec8884499c51b248df60aedddfc9acf72cdbd4, not stripped
      
    • file <sample program> :

      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 do cabeçalho ELF

Eu compilei este simples programa em C com o toolchain:

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

... e copiei para file <file from the image> na imagem, alterando o parâmetro de inicialização /root para init= . Isso me dá o seguinte ao inicializar:

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

Parece estar engasgado com a chamada /root/simple .

    
por Nathan Osman 17.11.2015 / 07:53

2 respostas

0

Eu sei que é uma questão um pouco antiga, mas como ainda há nenhuma boa resposta para testar imagens do Raspberry Pi com o QEMU, permita-me contribuir com uma resposta parcial.

Eu queria usar a imagem do Ubuntu 16.04 raspi3 com o QEMU. Baixei, extraí, montei a partição de boot, peguei o arquivo vmlinuz e o arquivo initrd, e ... qemu-system-arm -M blabla -cpu ... -kernel ... não funciona. Tela preta.

Em seguida, usando um kernel-qemu-4.4.34-jessie de aqui com a imagem xenial / rootfs led para o mesmo problema que você matou.

Mas desde que eu estou usando um bom kernel conhecido, e desde o seu simples programa C ligado estaticamente, é provável que o problema só aparece quando se usa o linker dinâmico. (E o linker não é particularmente sensível a kernels, porque o ld-2.24 do último raspbian baseado em debian9 (stretch) funciona bem em um kernel baseado em 4.4 debian8 (jessie).)

Mesmo depois de lidar com os arquivos que trabalham com / com a imagem "jessie" na imagem xenial do Ubuntu eu só recebi um erro estranho "calling preinit: KE".

Ah, e qualquer um que queira compilar um kernel para um Raspberry Pi, deve checar este site (que faz referência direta ao " official "docs / howto).

    
por 29.08.2017 / 22:16
0

Eu também tentei inicializar imagens ARM com o QEMU sem sucesso confiável. Lamento dizer que você terá que usar hardware real para trabalhar com um sistema operacional ARM ou esperar pacientemente que os desenvolvedores criem um emulador mais confiável para o ARM.

Em dezembro de 2018, e ainda há problemas com qemu-system-arm .

Eu consegui inicializar o Raspbian Jessie em um emulador QEMU usando um Ubuntu 18 Bionic recém-instalado, mas não foi estável para o meu trabalho, então eu tive que deixá-lo para hardware real. Ele iria congelar com freqüência.

qemu-system-arm não funcionou no meu SO, então eu usei o Virtualbox para instalar o Ubuntu Bionic e dentro do Bionic eu instalei o Raspbian com o QEMU.

Eu segui este tutorial: link

Boa sorte

    
por 13.12.2018 / 02:47