Dlaczego jądro nie może uruchomić init?


14

Pobrałem obraz Raspbian na tej stronie . Próbuję skompilować jądro, którego można użyć do uruchomienia obrazu w qemu.

Pobrałem źródło jądra Linux z kernel.org i uruchomiłem:

make versatile_defconfig
make menuconfig

Następnie dodałem następujące funkcje do jądra:

  • Obsługa PCI (CONFIG_PCI)
  • Obsługa urządzeń SCSI (CONFIG_SCSI)
  • Obsługa dysków SCSI (CONFIG_BLK_DEV_SD)
  • SYM53C8XX Wersja 2 Obsługa SCSI (CONFIG_SCSI_SYM53C8XX_2)
  • System plików Extended 3 (ext3) (CONFIG_EXT3_FS)
  • System plików Extended 4 (ext4) (CONFIG_EXT4_FS)

Zapętliłem również obraz dysku i:

  • skomentował /etc/ld.so.preload
  • dostosowane /etc/fstabdo użycia /dev/sda1i/dev/sda2

Następnie odmontowałem obraz i próbowałem uruchomić maszynę za pomocą:

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"

Jądro było w stanie zamontować system plików, ale natychmiast napotkało pewne problemy:

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

Na początku zastanawiałem się, czy nie było to związane z SELinux. Próbowałem uruchomić jądro za pomocą:

selinux=0 enforcing=0

... ale nie miało to absolutnie żadnej różnicy.

Co ja robię źle? A co oznacza ten błąd?

Aktualizacje

Próbowałem również następujących, bez powodzenia:

  • Próbowałem kompilować z CONFIG_VFPwłączoną funkcją lub bez
  • Dodałem CONFIG_DEVTMPFSiCONFIG_DEVTMPFS_MOUNT
  • Stosując tę poprawkę i umożliwienie CPU_V6, CONFIG_MMC_BCM2835, iCONFIG_MMC_BCM2835_DMA
  • Korzystanie z gcc-linaro-arm-linux-gnueabihf-raspbianzestawu narzędzi
  • Kompilowanie prostego programu C za pomocą zestawu narzędzi, a następnie przekazywanie jego ścieżki do jądra za pomocą init=utworów - co prowadzi mnie do przekonania, że ​​istnieje rozbieżność między formatami binarnymi

    • 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 nagłówka ELF

Skompilowałem ten prosty program C z łańcuchem narzędzi:

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

... i skopiowałem go do /rootobrazu, zmieniając init=parametr rozruchowy na /root/simple. To daje mi następujące informacje podczas uruchamiania:

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

Wygląda na to, że dusi się podczas execv()rozmowy.


3
Powiedziałbym, że jest to problem dotyczący obsługi twardego zmiennoprzecinkowego. Czy masz CONFIG_VFP = y?
Alexandre Belloni,

@AlexandreBelloni cat .config | grep CONFIG_VFPdaje CONFIG_VFP=y- wydaje się, że jest włączony.
Nathan Osman,

@AlexandreBelloni Próbowałem jądra zi bez CONFIG_VFPniego i to nie ma znaczenia.
Nathan Osman,

1
Myślę, że Alexandre jest na dobrej drodze, ale VFP nie stanowi problemu. versatilepbjest procesorem ARM926, który jest starszy niż ARM1176 RPi, więc pliki binarne Raspbian mogą używać innej funkcji, która nie jest emulowana. Od unixmen.com/emulating-raspbian-using-qemu , czy -cpu arm1176pomoc?
Gilles 'SO - przestań być zły'

1
Hmmm. Może wypróbuj łańcuch narzędzi Armel? (Dla aktualnego programu, który działa, nie tylko dla kodu pośredniczącego. Możesz użyć busybox - pobierz plik binarny static z busybox z debian armel.)
SO

Odpowiedzi:


1

Próbowałem również uruchomić obrazy ARM za pomocą QEMU bez powodzenia. Przykro mi powiedzieć, że będziesz musiał użyć prawdziwego sprzętu do pracy z systemem ARM lub cierpliwie czekać, aż programiści stworzą bardziej niezawodny emulator ARM.

Jest grudzień 2018 i nadal występują problemy qemu-system-arm.

Byłem w stanie uruchomić Raspbian Jessie na emulatorze QEMU przy użyciu świeżo zainstalowanego Ubuntu 18 Bionic, jednak nie był stabilny w mojej pracy, więc musiałem zostawić go na prawdziwy sprzęt. Często zamarzał.

qemu-system-arm nie działał na moim systemie operacyjnym, więc użyłem Virtualbox do zainstalowania Ubuntu Bionic, a wewnątrz Bionic zainstalowałem Raspbian z QEMU.

Wykonałem ten samouczek: https://azeria-labs.com/emulate-raspberry-pi-with-qemu/

Powodzenia


1

Wiem, że to nieco postarzane pytanie, ale ponieważ nadal nie ma dobrych odpowiedzi na testowanie obrazów Raspberry Pi za pomocą QEMU, pozwól mi udzielić częściowej odpowiedzi.

Chciałem użyć obrazu Ubuntu 16.04 raspi3 z QEMU. Pobrałem go, rozpakowałem, zamontowałem partycję rozruchową, dostałem plik vmlinuz i plik initrd i ... qemu-system-arm -M blabla -cpu ... -kernel ... nie działa. Czarny ekran.

Następnie za pomocą kernel-qemu-4.4.34-Jessie z tu z xenial obrazu / głównego systemu plików doprowadziły do tego samego „init zabity” problem masz.

Ale ponieważ używam znanego dobrego jądra, a ponieważ twój prosty statycznie połączony program C działa, prawdopodobnie problem pojawia się tylko wtedy, gdy używasz dynamicznego linkera. (A linker nie jest szczególnie wrażliwy na jądra, ponieważ ld-2.24 z najnowszego raspbian opartego na debian9 (stretch) działa dobrze na jądrze opartym na debian8 (jessie) 4.4).

Nawet po skopiowaniu plików, które działają na / z obrazem „jessie” do obrazu Xenial Ubuntu, mam tylko dziwny błąd „preinit wywołania: KE”.

Aha, i każdy, kto szuka kompilacji jądra dla Raspberry Pi, powinien sprawdzić stronę, która bezpośrednio odwołuje się do „ oficjalnych ” dokumentów / howto.


0

Jądro linuksa nie uruchamia już init, zamiast tego uruchamia systemd, co przypomina init, ale nieco bardziej zaawansowane funkcje i dodatkowe możliwości wielozadaniowości, chociaż w przeciwieństwie do filozofii unix systemd jest użyteczny.


nie jestem pewien, czy tak się stanie
Qasim,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.