ทำไมเคอร์เนลที่รันไม่สามารถเริ่มต้นได้


14

ฉันดาวน์โหลดรูปภาพ Raspbian ในหน้านี้แล้ว ฉันพยายามรวบรวมเคอร์เนลที่สามารถใช้เพื่อบูตอิมเมจภายใน qemu

ฉันดาวน์โหลด Linux kernel kernel จากkernel.orgและวิ่งไปที่:

make versatile_defconfig
make menuconfig

ฉันเพิ่มคุณสมบัติต่อไปนี้ในเคอร์เนล:

  • รองรับ PCI (CONFIG_PCI)
  • การสนับสนุนอุปกรณ์ SCSI (CONFIG_SCSI)
  • การสนับสนุนดิสก์ SCSI (CONFIG_BLK_DEV_SD)
  • SYM53C8XX เวอร์ชัน 2 รองรับ SCSI (CONFIG_SCSI_SYM53C8XX_2)
  • ระบบไฟล์ Extended 3 (ext3) (CONFIG_EXT3_FS)
  • ระบบไฟล์ Extended 4 (ext4) (CONFIG_EXT4_FS)

ฉันยังวนรอบเมานต์อิมเมจของดิสก์และ:

  • แสดงความคิดเห็น /etc/ld.so.preload
  • ปรับ/etc/fstabให้ใช้/dev/sda1และ/dev/sda2

จากนั้นฉันก็ถอนการติดตั้งภาพและพยายามเริ่มต้นเครื่องด้วย:

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

ตอนแรกฉันสงสัยว่าสิ่งนี้ไม่เกี่ยวข้องกับ SELinux หรือไม่ ฉันพยายามบูทเคอร์เนลด้วย:

selinux=0 enforcing=0

... แต่มันก็ไม่ต่างอะไรอย่างแน่นอน

ผมทำอะไรผิดหรือเปล่า? และข้อผิดพลาดนี้หมายความว่าอย่างไร

อัพเดท

ฉันได้ลองทำสิ่งต่อไปนี้โดยไม่มีโชค:

  • ฉันพยายามรวบรวมโดยไม่CONFIG_VFPเปิดใช้งาน
  • ฉันเพิ่มCONFIG_DEVTMPFSและCONFIG_DEVTMPFS_MOUNT
  • การใช้แพทช์นี้และเปิดใช้งานCPU_V6, CONFIG_MMC_BCM2835และCONFIG_MMC_BCM2835_DMA
  • การใช้gcc-linaro-arm-linux-gnueabihf-raspbiantoolchain
  • การคอมไพล์โปรแกรม C อย่างง่ายด้วย toolchain จากนั้นผ่านพา ธ ไปยังเคอร์เนลผ่านทางinit=งานทำให้ฉันเชื่อว่ามีความแตกต่างระหว่างรูปแบบไบนารี

    • 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 ส่วนหัวของ ELF

ฉันรวบรวมโปรแกรม C ง่าย ๆ นี้ด้วย toolchain:

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

... และคัดลอกไป/rootในภาพเปลี่ยนพารามิเตอร์บูตinit= /root/simpleสิ่งนี้ทำให้ฉันต่อไปนี้เมื่อบูท:

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

ดูเหมือนว่าจะสำลักในการexecv()โทร


3
ฉันจะบอกว่านี่เป็นปัญหาเกี่ยวกับการสนับสนุนจุดลอยตัวยาก คุณมี CONFIG_VFP = y หรือไม่
Alexandre Belloni

@AlexandreBelloni cat .config | grep CONFIG_VFPให้ผลตอบแทนCONFIG_VFP=y- ดูเหมือนว่าเปิดใช้งานอยู่
Nathan Osman

@AlexandreBelloni ฉันได้ลองใช้เคอร์เนลทั้งที่มีและไม่มีCONFIG_VFPและทำให้ไม่มีความแตกต่าง
นาธานออสมัน

1
ฉันคิดว่า Alexandre อยู่ในเส้นทางที่ถูกต้อง แต่ VFP ไม่ใช่การตั้งค่าที่เป็นปัญหา versatilepbเป็นซีพียู ARM926 ซึ่งเก่ากว่า ARM1176 ของ RPi ดังนั้นไบนารี Raspbian อาจใช้คุณสมบัติอื่นที่ไม่ได้ถูกเลียนแบบ จากunixmen.com/emulating-raspbian-using-qemuไม่-cpu arm1176ช่วยเหลือ?
Gilles 'SO- หยุดความชั่วร้าย'

1
อืมม อาจลองใช้เครื่องมือ armel? (สำหรับโปรแกรมจริงที่ทำงานต่อไปไม่เพียง แต่สำหรับ stub relay เท่านั้นคุณสามารถใช้ busybox - คว้า binary busybox - static จาก debian armel)
Gilles 'SO- หยุดความชั่วร้าย'

คำตอบ:


1

ฉันยังลองบูทภาพ ARM ด้วย QEMU โดยไม่ประสบความสำเร็จอย่างน่าเชื่อถือ ฉันขอโทษที่ต้องบอกว่าคุณจะต้องใช้ฮาร์ดแวร์จริงเพื่อทำงานกับ ARM OS หรือรออย่างอดทนสำหรับผู้พัฒนาเพื่อสร้างอีมูเลเตอร์ที่น่าเชื่อถือสำหรับ ARM

เดือนธันวาคม 2018 และยังคงมีปัญหาqemu-system-armอยู่

ฉันสามารถบูต Raspbian Jessie บนอีมูเลเตอร์ QEMU โดยใช้ Ubuntu 18 Bionic ที่เพิ่งติดตั้งใหม่อย่างไรก็ตามมันไม่เสถียรสำหรับการทำงานของฉันดังนั้นฉันจึงต้องปล่อยให้มันเป็นฮาร์ดแวร์จริง มันจะแข็งขึ้นบ่อยครั้ง

qemu-system-arm ไม่ทำงานบนระบบปฏิบัติการของฉันดังนั้นฉันจึงใช้ Virtualbox เพื่อติดตั้ง Ubuntu Bionic และภายใน Bionic ฉันติดตั้ง Raspbian ด้วย QEMU

ฉันติดตามบทช่วยสอนนี้: https://azeria-labs.com/emulate-raspberry-pi-with-qemu/

โชคดี


1

ฉันรู้ว่ามันเป็นคำถามที่ค่อนข้างเก่า แต่เนื่องจากยังไม่มีคำตอบที่ดีสำหรับการทดสอบภาพ Raspberry Pi กับ QEMU อนุญาตให้ฉันตอบคำถามบางส่วนได้

ฉันต้องการใช้Ubuntu 16.04 raspi3 อิมเมจกับ QEMU ดาวน์โหลดแยกแล้วติดตั้งพาร์ติชันสำหรับบู๊ตรับไฟล์ vmlinuz และไฟล์ initrd และ ... qemu-system-arm -M blabla -cpu ... -kernel ... ไม่ทำงาน หน้าจอสีดำ.

จากนั้นใช้ kernel-qemu-4.4.34-jessie จากที่นี่ด้วยรูปภาพ xenial / rootfs นำไปสู่ปัญหา "init kill" ที่คุณมี

แต่เนื่องจากฉันใช้เคอร์เนลที่รู้จักกันดีและเนื่องจากโปรแกรม C ที่เชื่อมโยงแบบสแตติกแบบธรรมดาของคุณทำงานได้มีแนวโน้มว่าปัญหาจะเกิดขึ้นเมื่อใช้ตัวเชื่อมโยงแบบไดนามิกเท่านั้น (และตัวเชื่อมโยงไม่ไวต่อเคอร์เนลโดยเฉพาะเนื่องจาก ld-2.24 จากเดเบียนที่ใช้ debian9 (ยืด)) ทำงานได้ดีบนเคอร์เนลที่ใช้ 4.4 debian8 (เจสซี)

แม้หลังจากการคัดลอกไฟล์ที่ทำงานบน / ด้วยภาพ "jessie" ลงในภาพ xenial ของ Ubuntu ฉันได้รับข้อผิดพลาด "การเรียก preinit: KE" ที่แปลก

โอ้และใครก็ตามที่กำลังมองหาคอมไพล์เคอร์เนลสำหรับ Raspberry Pi ควรตรวจสอบเว็บไซต์นี้ซึ่งอ้างอิงเอกสาร " เป็นทางการ " / howto โดยตรง


0

เคอร์เนล linux ไม่ได้เรียกใช้ init อีกต่อไปแทนมันจะเรียกใช้ systemd ซึ่งก็เหมือนกับ init แต่มีคุณสมบัติขั้นสูงและความสามารถมัลติทาสก์แบบมัลติทาสกิ้งเพิ่มเติม


ไม่แน่ใจว่าสิ่งนี้เป็นที่รู้ว่าเป็นอย่างไร
Qasim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.