GNU/Linux >> Znalost Linux >  >> Linux

Linux – Proč nemůže jádro spustit inicializaci?

Stáhl jsem si obrázek Raspbian na této stránce. Snažím se zkompilovat jádro, které lze použít ke spuštění obrazu v rámci qemu.

Stáhl jsem zdrojový kód linuxového jádra z kernel.org a spustil:

make versatile_defconfig
make menuconfig

Poté jsem do jádra přidal následující funkce:

  • Podpora PCI (CONFIG_PCI)
  • Podpora zařízení SCSI (CONFIG_SCSI)
  • Podpora disků SCSI (CONFIG_BLK_DEV_SD)
  • Podpora SCSI SYM53C8XX verze 2 (CONFIG_SCSI_SYM53C8XX_2)
  • Souborový systém Extended 3 (ext3) (CONFIG_EXT3_FS)
  • Souborový systém Extended 4 (ext4) (CONFIG_EXT4_FS)

Také jsem smyčkou připojil obraz disku a:

  • přidal komentář /etc/ld.so.preload
  • upraveno /etc/fstab použít /dev/sda1 a /dev/sda2

Poté jsem odpojil obraz a pokusil se spustit počítač 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ádru se podařilo připojit souborový systém, ale okamžitě narazil na nějaké potíže:

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

Nejprve mě napadlo, jestli to nesouvisí se SELinuxem. Zkusil jsem zavést jádro pomocí:

selinux=0 enforcing=0

…ale neznamenalo to absolutně žádný rozdíl.

Co dělám špatně? A co tato chyba znamená?

Aktualizace

Také jsem bez úspěchu zkusil následující:

  • Zkoušel jsem kompilaci s a bez CONFIG_VFP povoleno
  • Přidal jsem CONFIG_DEVTMPFS a CONFIG_DEVTMPFS_MOUNT
  • Použití této opravy a povolení CPU_V6 , CONFIG_MMC_BCM2835 a CONFIG_MMC_BCM2835_DMA
  • Pomocí gcc-linaro-arm-linux-gnueabihf-raspbian toolchain
  • Kompilace jednoduchého C programu s toolchainem a předání jeho cesty jádru přes init= funguje – což mě vede k přesvědčení, že mezi binárními formáty existuje rozpor

    • 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`
      
    • rozdíl hlavičky ELF

Zkompiloval jsem tento jednoduchý program v C s toolchain:

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

…a zkopírovali jej do /root v obrázku změnou init= spouštěcí parametr na /root/simple . To mi při bootování dává následující:

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

Zdá se, že se dusí execv() zavolejte.

Přijatá odpověď:

Zkoušel jsem také zavést obrazy ARM pomocí QEMU bez spolehlivého úspěchu. Je mi líto, že musím říci, že pro práci s operačním systémem ARM budete muset použít skutečný hardware nebo trpělivě čekat, až vývojáři vytvoří spolehlivější emulátor pro ARM.

Související:Hledat soubory, jejichž cesty obsahují několik slov bez konkrétního pořadí mezi nimi?

Je to prosinec 2018 a stále existují problémy s qemu-system-arm .

Podařilo se mi zavést Raspbian Jessie na emulátoru QEMU pomocí čerstvě nainstalovaného Ubuntu 18 Bionic, ale nebyl pro mou práci stabilní, takže jsem ho musel nechat pro skutečný hardware. Často by to zamrzlo.

qemu-system-arm nefungoval na mém OS, tak jsem použil Virtualbox k instalaci Ubuntu Bionic a uvnitř Bionic jsem nainstaloval Raspbian s QEMU.

Postupoval jsem podle tohoto návodu:https://azeria-labs.com/emulate-raspberry-pi-with-qemu/

Hodně štěstí


Linux
  1. Průběžné testování integrace linuxového jádra

  2. Linux – Proč v systému není přítomen žádný souborový systém Rootfs?

  3. Proč by jádro zahazovalo pakety?

  1. Linux – podílíte se na e-mailové konferenci jádra?

  2. Co znamená __init v kódu jádra Linuxu?

  3. Proč se funkce zavření nazývá release v `struct file_operations` v jádře Linuxu?

  1. Proč chránit linuxové jádro před uživatelem root?

  2. Proč je Linux NFS server implementován v jádře na rozdíl od uživatelského prostoru?

  3. Proč by někdo chtěl spouštět UserMode Linux (UML)