GNU/Linux >> Belajar Linux >  >> Linux

Linux – Mengapa Kernel Tidak Dapat Menjalankan Init?

Saya telah mengunduh gambar Raspbian di halaman ini. Saya mencoba mengkompilasi kernel yang dapat digunakan untuk mem-boot image di dalam qemu.

Saya mengunduh sumber kernel Linux dari kernel.org dan menjalankan:

make versatile_defconfig
make menuconfig

Saya kemudian menambahkan fitur berikut ke kernel:

  • Dukungan PCI (CONFIG_PCI)
  • Dukungan Perangkat SCSI (CONFIG_SCSI)
  • Dukungan Disk SCSI (CONFIG_BLK_DEV_SD)
  • SYM53C8XX Versi 2 Dukungan SCSI (CONFIG_SCSI_SYM53C8XX_2)
  • Sistem file Extended 3 (ext3) (CONFIG_EXT3_FS)
  • Sistem file Extended 4 (ext4) (CONFIG_EXT4_FS)

Saya juga memasang ulang gambar disk dan:

  • mengomentari /etc/ld.so.preload
  • disesuaikan /etc/fstab untuk menggunakan /dev/sda1 dan /dev/sda2

Saya kemudian melepas gambar dan mencoba menyalakan mesin dengan:

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"

Kernel dapat memasang sistem file tetapi segera mengalami masalah:

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

Pada awalnya, saya bertanya-tanya apakah ini tidak terkait dengan SELinux. Saya mencoba mem-boot kernel dengan:

selinux=0 enforcing=0

…tapi sama sekali tidak ada bedanya.

Apa yang saya lakukan salah? Dan apa arti kesalahan ini?

Pembaruan

Saya juga telah mencoba yang berikut ini, tetapi tidak berhasil:

  • Saya mencoba mengkompilasi dengan dan tanpa CONFIG_VFP diaktifkan
  • Saya menambahkan CONFIG_DEVTMPFS dan CONFIG_DEVTMPFS_MOUNT
  • Menerapkan patch ini dan mengaktifkan CPU_V6 , CONFIG_MMC_BCM2835 , &CONFIG_MMC_BCM2835_DMA
  • Menggunakan gcc-linaro-arm-linux-gnueabihf-raspbian rantai alat
  • Mengkompilasi program C sederhana dengan rantai alat dan kemudian meneruskan jalurnya ke kernel melalui init= berhasil – membuat saya percaya bahwa ada perbedaan antara format biner

    • 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`
      
    • perbedaan header ELF

Saya mengkompilasi program C sederhana ini dengan toolchain:

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

…dan menyalinnya ke /root pada gambar, mengubah init= parameter boot ke /root/simple . Ini memberi saya yang berikut ini saat boot:

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

Tampaknya tersedak pada execv() panggilan.

Jawaban yang Diterima:

Saya juga mencoba mem-boot gambar ARM dengan QEMU tanpa hasil yang dapat diandalkan. Saya minta maaf untuk mengatakan bahwa Anda harus menggunakan perangkat keras asli untuk bekerja dengan OS ARM, atau menunggu dengan sabar hingga pengembang membuat emulator yang lebih andal untuk ARM.

Terkait:Cari file yang nama jalurnya berisi beberapa kata tanpa urutan khusus di antara mereka?

Ini Desember 2018, dan masih ada masalah dengan qemu-system-arm .

Saya dapat mem-boot Raspbian Jessie pada emulator QEMU menggunakan Ubuntu 18 Bionic yang baru diinstal, namun itu tidak stabil untuk pekerjaan saya jadi saya harus meninggalkannya untuk perangkat keras yang sebenarnya. Itu akan sering membeku.

qemu-system-arm tidak bekerja pada OS saya, jadi saya menggunakan Virtualbox untuk menginstal Ubuntu Bionic dan di dalam Bionic saya menginstal Raspbian dengan QEMU.

Saya mengikuti tutorial ini:https://azeria-labs.com/emulate-raspberry-pi-with-qemu/

Semoga berhasil


Linux
  1. Kernel Linux:5 inovasi teratas

  2. Siklus hidup pengujian kernel Linux

  3. Linux – Mengapa Tidak Ada Sistem File Rootfs Di Sistem?

  1. Mengapa Kernel Menjatuhkan Paket?

  2. Linux – Proses Init:Leluhur Semua Proses?

  3. Mengapa fungsi tutup disebut rilis di `struct file_operations` di kernel Linux?

  1. Analisis kernel Linux dengan ftrace

  2. Mengapa pr_debug dari kernel Linux tidak memberikan hasil apa pun?

  3. Mengapa melindungi kernel Linux dari pengguna root?