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

14

Eu baixei a imagem Raspbian nesta página . Estou tentando compilar um kernel que pode ser usado para inicializar a imagem no qemu.

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

make versatile_defconfig
make menuconfig

Adicionei os seguintes recursos ao kernel:

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

Também montei em loop a imagem do disco e:

  • comentado /etc/ld.so.preload
  • ajustado /etc/fstabpara usar /dev/sda1e/dev/sda2

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 conseguiu montar o sistema de arquivos, mas imediatamente encontrou 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

No começo, eu me perguntava se isso não estava relacionado ao SELinux. Eu tentei inicializar o kernel com:

selinux=0 enforcing=0

... mas não fez absolutamente nenhuma diferença.

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

Atualizações

Eu também tentei o seguinte, sem sorte:

  • Tentei compilar com e sem CONFIG_VFPhabilitado
  • Eu adicionei CONFIG_DEVTMPFSeCONFIG_DEVTMPFS_MOUNT
  • Aplicando este patch e permitindo CPU_V6, CONFIG_MMC_BCM2835, &CONFIG_MMC_BCM2835_DMA
  • Usando a gcc-linaro-arm-linux-gnueabihf-raspbiancadeia de ferramentas
  • Compilar um programa C simples com a cadeia de ferramentas e depois passar seu caminho para o kernel via init=obras - levando-me a acreditar que há uma discrepância entre os formatos binários

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

Eu compilei este programa C simples com a cadeia de ferramentas:

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

... e copiou para /roota imagem, alterando o init=parâmetro de inicialização para /root/simple. Isso me dá o seguinte ao inicializar:

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

Parece estar sufocando na execv()ligação.

Nathan Osman
fonte
3
Eu diria que esse é um problema referente ao suporte a ponto flutuante rígido. Você tem CONFIG_VFP = y?
Alexandre Belloni
@AlexandreBelloni cat .config | grep CONFIG_VFPproduz CONFIG_VFP=y- parece que está ativado.
21415 Nathan Osman
@AlexandreBelloni Eu tentei o kernel com e sem CONFIG_VFPe não faz diferença.
21415 Nathan Osman
1
Eu acho que Alexandre está no caminho certo, mas VFP não é o cenário problemático. versatilepbé uma CPU ARM926, mais antiga que a ARM1176 do RPi, portanto os binários Raspbian podem estar usando algum outro recurso que não está sendo emulado. Em unixmen.com/emulating-raspbian-using-qemu , o-cpu arm1176 ajuda?
Gilles 'SO- stop be evil'
1
Hummm. Talvez tente uma cadeia de ferramentas do armel? (Para o programa atual que continua em execução, não apenas para o stub do relé. Você poderia usar o busybox - pegue o binário estático do busybox no debian armel.)
Gilles 'SO- stop

Respostas:

1

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

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

Consegui inicializar o Raspbian Jessie em um emulador QEMU usando um Ubuntu 18 Bionic recém-instalado; no entanto, não era estável para o meu trabalho, então tive que deixá-lo para hardware real. Congelaria com freqüência.

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

Segui este tutorial: https://azeria-labs.com/emulate-raspberry-pi-with-qemu/

Boa sorte

Ascari Gh
fonte
1

Eu sei que é uma pergunta um tanto antiga, mas como existem ainda não há boas respostas para testar imagens do Raspberry Pi com QEMU, permita-me contribuir com uma resposta parcial.

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

Então, usando um kernel-qemu-4.4.34-jessie daqui com a imagem xenial / rootfs levou ao mesmo problema "init kill" que você tem.

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

Mesmo depois de copiar os arquivos que funcionam na / com a imagem "jessie" para a imagem xenial do ubuntu, recebi apenas um erro "chamando preinit: KE" estranho.

Ah, e qualquer pessoa que esteja procurando compilar um kernel para um Raspberry Pi, deve verificar este site, que faz referência direta aos documentos / howto " oficiais ".

PAStheLoD
fonte
0

O kernel do linux não roda mais o init, mas sim o systemd, que é como o init, mas recursos um pouco mais avançados e recursos extras de multitarefa, embora contra a filosofia unix, o systemd seja útil.

Qasim
fonte
não sei se isso é saber para o ser como
Qasim