Tại sao kernel không thể chạy init?


14

Tôi đã tải xuống hình ảnh Raspbian trên trang này . Tôi đang cố gắng biên dịch một kernel có thể được sử dụng để khởi động hình ảnh trong qemu.

Tôi đã tải xuống nguồn kernel Linux từ kernel.org và chạy:

make versatile_defconfig
make menuconfig

Sau đó tôi đã thêm các tính năng sau vào kernel:

  • Hỗ trợ PCI (CONFIG_PCI)
  • Hỗ trợ thiết bị SCSI (CONFIG_SCSI)
  • Hỗ trợ đĩa SCSI (CONFIG_BLK_DEV_SD)
  • Hỗ trợ SCSI phiên bản 2 của SYM53C8XX (CONFIG_SCSI_SYM53C8XX_2)
  • Hệ thống tập tin mở rộng 3 (ext3) (CONFIG_EXT3_FS)
  • Hệ thống tập tin mở rộng 4 (ext4) (CONFIG_EXT4_FS)

Tôi cũng lặp gắn hình ảnh đĩa và:

  • Bình luận /etc/ld.so.preload
  • điều chỉnh /etc/fstabđể sử dụng /dev/sda1/dev/sda2

Sau đó, tôi đã ngắt kết nối hình ảnh và cố gắng khởi động máy bằng:

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"

Nhân đã có thể gắn kết hệ thống tập tin nhưng nó ngay lập tức gặp một số rắc rối:

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

Lúc đầu, tôi tự hỏi liệu điều này không liên quan đến SELinux. Tôi đã thử khởi động kernel bằng:

selinux=0 enforcing=0

... nhưng nó hoàn toàn không có gì khác biệt.

Tôi đang làm gì sai? Và lỗi này có nghĩa là gì?

Cập nhật

Tôi cũng đã thử những điều sau đây, không có may mắn:

  • Tôi đã thử biên dịch có và không CONFIG_VFPkích hoạt
  • Tôi đã thêm CONFIG_DEVTMPFSCONFIG_DEVTMPFS_MOUNT
  • Áp dụng bản vá này và cho phép CPU_V6, CONFIG_MMC_BCM2835, &CONFIG_MMC_BCM2835_DMA
  • Sử dụng gcc-linaro-arm-linux-gnueabihf-raspbianchuỗi công cụ
  • Biên dịch một chương trình C đơn giản với chuỗi công cụ và sau đó chuyển đường dẫn của nó tới kernel thông qua init=các tác phẩm - khiến tôi tin rằng có sự khác biệt giữa các định dạng nhị phân

    • 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`
      
    • khác của tiêu đề ELF

Tôi đã biên dịch chương trình C đơn giản này với toolchain:

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

... và sao chép nó vào /roottrong ảnh, thay đổi init=tham số khởi động thành /root/simple. Điều này cho tôi những điều sau đây khi khởi động:

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

Nó dường như bị nghẹn trong execv()cuộc gọi.


3
Tôi muốn nói rằng đây là một vấn đề liên quan đến hỗ trợ điểm nổi cứng. Bạn có CONFIG_VFP = y không?
Alexandre Belloni

cat .config | grep CONFIG_VFPSản lượng @AlexandreBelloni CONFIG_VFP=y- có vẻ như nó được kích hoạt.
Nathan Osman

@AlexandreBelloni Tôi đã thử kernel có và không có CONFIG_VFPvà nó không có gì khác biệt.
Nathan Osman

1
Tôi nghĩ Alexandre đang đi đúng hướng, nhưng VFP không phải là thiết lập có vấn đề. versatilepblà CPU ARM926, cũ hơn ARM1176 của RPi, vì vậy các nhị phân Raspbian có thể đang sử dụng một số tính năng khác không được mô phỏng. Từ unixmen.com/emulation-raspbian-USE-qemu , có -cpu arm1176giúp được gì không?
Gilles 'SO- ngừng trở nên xấu xa'

1
Hừm. Có thể thử một chuỗi công cụ armel? (Đối với chương trình thực tế tiếp tục chạy, không chỉ cho cuống rơle. Bạn có thể sử dụng busybox - lấy nhị phân staticbox-static từ armian armel.)
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


1

Tôi cũng đã thử khởi động hình ảnh ARM với QEMU nhưng không thành công đáng tin cậy. Tôi rất tiếc phải nói rằng bạn sẽ phải sử dụng phần cứng thực sự để làm việc với HĐH ARM hoặc kiên nhẫn chờ đợi các nhà phát triển tạo ra một trình giả lập đáng tin cậy hơn cho ARM.

Tháng 12 năm 2018 của nó, và vẫn còn có vấn đề với qemu-system-arm.

Tôi đã có thể khởi động Raspbian Jessie trên trình giả lập QEMU bằng Ubuntu 18 Bionic mới cài đặt, tuy nhiên nó không ổn định cho công việc của tôi nên tôi phải để nó cho phần cứng thực sự. Nó sẽ đóng băng thường xuyên.

qemu-system-arm không hoạt động trên hệ điều hành của tôi, vì vậy tôi đã sử dụng Virtualbox để cài đặt Ubuntu Bionic và bên trong Bionic tôi đã cài đặt Raspbian với QEMU.

Tôi đã làm theo hướng dẫn này: https://azeria-labs.com/emulation-raspberry-pi-with-qemu/

Chúc may mắn


1

Tôi biết đó là một câu hỏi hơi cũ, nhưng vì vẫn còn chưa có câu trả lời hay để thử nghiệm hình ảnh Raspberry Pi với QEMU, cho phép tôi đóng góp một phần câu trả lời.

Tôi muốn sử dụng hình ảnh Ubuntu 16.04 raspi3 với QEMU. Đã tải xuống, giải nén nó, gắn phân vùng khởi động, có tệp vmlinuz và tệp initrd, và ... qemu-system-arm -M blabla -cpu ... -kernel ... không hoạt động. Màn hình đen.

Sau đó, sử dụng kernel-qemu-4.4.34-jessie từ đây với hình ảnh xenial / rootfs dẫn đến cùng một vấn đề "init kill" mà bạn gặp phải.

Nhưng vì tôi đang sử dụng một hạt nhân tốt đã biết và vì chương trình C được liên kết tĩnh đơn giản của bạn hoạt động, nên có thể vấn đề chỉ xuất hiện khi một người sử dụng trình liên kết động. (Và trình liên kết không đặc biệt nhạy cảm với các hạt nhân, bởi vì ld-2.24 từ raspbian dựa trên debian9 (kéo dài) mới hoạt động tốt trên kernel dựa trên 4.4 debian8 (jessie).)

Ngay cả sau khi sao chép các tập tin hoạt động trên / với hình ảnh "jessie" vào hình ảnh xen kẽ Ubuntu, tôi cũng chỉ gặp một lỗi "gọi preinit: KE" kỳ lạ.

Ồ, và bất cứ ai đang xem việc biên dịch kernel cho Raspberry Pi, nên kiểm tra trang web này , trang này trực tiếp tham khảo tài liệu / cách thức " chính thức ".


0

Hạt nhân linux không chạy init nữa thay vào đó nó chạy systemd giống như init nhưng các tính năng nâng cao hơn một chút và khả năng đa nhiệm bổ sung, mặc dù đối với triết lý unix thì systemd rất hữu ích.


không chắc chắn nếu điều này được biết là như thế nào
Qasim
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.