Mengapa kernel tidak dapat menjalankan init?

14

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 berlari:

make versatile_defconfig
make menuconfig

Saya kemudian menambahkan fitur-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 mengulang mount image disk dan:

  • berkomentar /etc/ld.so.preload
  • disesuaikan /etc/fstabuntuk digunakan /dev/sda1dan/dev/sda2

Saya kemudian melepas gambar dan mencoba memulai 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 beberapa 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 ada hubungannya 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 artinya kesalahan ini?

Pembaruan

Saya juga sudah mencoba yang berikut ini, tanpa hasil:

  • Saya mencoba mengompilasi dengan dan tanpa CONFIG_VFPmengaktifkan
  • Saya menambahkan CONFIG_DEVTMPFSdanCONFIG_DEVTMPFS_MOUNT
  • Menerapkan patch ini dan memungkinkan CPU_V6, CONFIG_MMC_BCM2835, &CONFIG_MMC_BCM2835_DMA
  • Menggunakan gcc-linaro-arm-linux-gnueabihf-raspbiantoolchain
  • Mengkompilasi program C sederhana dengan toolchain dan kemudian meneruskannya ke kernel melalui init=karya - membuat saya percaya 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`
      
    • berbeda dari header ELF

Saya menyusun program C sederhana ini dengan toolchain:

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

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

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

Tampaknya tersedak execv()panggilan.

Nathan Osman
sumber
3
Saya akan mengatakan ini adalah masalah tentang dukungan floating point keras. Apakah Anda memiliki CONFIG_VFP = y?
Alexandre Belloni
@AlexandreBelloni cat .config | grep CONFIG_VFPmenghasilkan CONFIG_VFP=y- sepertinya diaktifkan.
Nathan Osman
@AlexandreBelloni Saya sudah mencoba kernel dengan dan tanpa CONFIG_VFPdan tidak ada bedanya.
Nathan Osman
1
Saya pikir Alexandre ada di jalur yang benar, tetapi VFP bukan pengaturan yang bermasalah. versatilepbadalah CPU ARM926, yang lebih tua dari ARM1176 RPi, jadi binari Raspbian mungkin menggunakan beberapa fitur lain yang tidak ditiru. Dari unixmen.com/emulating-raspbian-using-qemu , apakah -cpu arm1176membantu?
Gilles 'SO- stop being evil'
1
Hmmm. Mungkin mencoba toolchain armel? (Untuk program aktual yang terus berjalan, bukan hanya untuk rintisan relai. Anda bisa menggunakan busybox - ambil binary busybox-statis dari debian armel.)
Gilles 'SO-stop being evil'

Jawaban:

1

Saya juga mencoba mem-boot gambar ARM dengan QEMU tanpa keberhasilan yang dapat diandalkan. Saya menyesal mengatakan bahwa Anda harus menggunakan perangkat keras nyata untuk bekerja dengan OS ARM, atau menunggu dengan sabar bagi pengembang untuk membuat emulator yang lebih andal untuk ARM.

Ini 2018 Desember, 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 nyata. Itu akan sering membeku.

qemu-system-arm tidak berfungsi 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

Ascari Gh
sumber
1

Saya tahu ini pertanyaan yang agak lama, tetapi karena masih ada belum ada jawaban yang baik untuk menguji gambar Raspberry Pi dengan QEMU, izinkan saya berkontribusi sebagian jawaban.

Saya ingin menggunakan Ubuntu 16.04 raspi3 image dengan QEMU. Unduh, ekstrak, pasang partisi boot, dapatkan file vmlinuz dan file initrd, dan ... qemu-system-arm -M blabla -cpu ... -kernel ... tidak berfungsi. Layar hitam.

Kemudian menggunakan kernel-qemu-4.4.34-jessie dari sini dengan image xenial / rootfs menyebabkan masalah "init kill" yang sama dengan yang Anda miliki.

Tetapi karena saya menggunakan kernel yang dikenal baik, dan karena program C sederhana yang terhubung secara statis berfungsi, kemungkinan masalahnya hanya muncul ketika seseorang menggunakan tautan dinamis. (Dan linker tidak terlalu sensitif terhadap kernel, karena ld-2.24 dari raspbian berbasis debian9 (stretch) terbaru bekerja dengan baik pada kernel berbasis 4.4 debian8 (jessie).)

Bahkan setelah menyalin file yang berfungsi pada / dengan gambar "jessie" ke dalam gambar xenial ubuntu saya hanya mendapat kesalahan "panggil preinit: KE" yang aneh.

Oh, dan siapa pun yang melihat kompilasi kernel untuk Raspberry Pi, harus memeriksa situs ini , yang secara langsung merujuk pada dokumen " resmi " / howto.

PAStheLoD
sumber
0

Kernel linux tidak menjalankan init lagi melainkan menjalankan systemd yang seperti init tetapi fitur yang sedikit lebih maju dan kemampuan multitasking ekstra, meskipun terhadap unix filosofi systemd berguna.

Qasim
sumber
tidak yakin apakah ini diketahui bagaimana caranya
Qasim