कर्नेल रन init क्यों नहीं कर सकता?


14

मैंने इस पृष्ठ पर रास्पियन छवि डाउनलोड की है । मैं एक कर्नेल संकलित करने की कोशिश कर रहा हूं जिसका उपयोग छवि को qemu के भीतर बूट करने के लिए किया जा सकता है।

मैंने 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)
  • विस्तारित 3 (ext3) फ़ाइल सिस्टम (CONFIG_EXT3_FS)
  • विस्तारित 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-raspbian
  • टूलकिन के साथ एक सरल सी प्रोग्राम को संकलित करना और फिर 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`
      
    • ELF हेडर का अंतर

मैंने टूलचिन के साथ इस सरल सी कार्यक्रम को संकलित किया :

<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 है?
अलेक्जेंड्रे बेलोनी

@AlexandreBelloni cat .config | grep CONFIG_VFPपैदावार CONFIG_VFP=y- लगता है जैसे यह सक्षम है।
नाथन उस्मान

@AlexandreBelloni मैंने कर्नेल की कोशिश की है CONFIG_VFPऔर इसके बिना और इससे कोई फर्क नहीं पड़ता।
नाथन उस्मान

1
मुझे लगता है कि अलेक्जेंड्रे सही रास्ते पर है, लेकिन VFP समस्यात्मक सेटिंग नहीं है। versatilepbएक ARM926 CPU है, जो RPi के ARM1176 से अधिक पुराना है, इसलिए रास्पियन बायनेरिज़ कुछ अन्य सुविधा का उपयोग कर सकते हैं जो कि अनुकरण नहीं किया जा रहा है। से unixmen.com/emulating-raspbian-using-qemu , करता है -cpu arm1176मदद?
गिल्स एसओ- बुराई को रोकना 'नोव

1
हममम। शायद एक आर्मल टूलचिन की कोशिश करो? (वास्तविक कार्यक्रम जो चल रहा है, केवल रिले स्टब के लिए नहीं। आप बिजीबॉक्स का उपयोग कर सकते हैं - डिबियन आर्मेल से बिजीबॉक्स-स्टैटिक बाइनरी को पकड़ सकते हैं।)
गिल्स एसओ- बुराई को रोकना '

जवाबों:


1

मैंने कोई विश्वसनीय सफलता के साथ QEMU के साथ एआरएम छवियों को बूट करने की भी कोशिश की है। मुझे यह कहने के लिए खेद है कि आपको एआरएम ओएस के साथ काम करने के लिए वास्तविक हार्डवेयर का उपयोग करना होगा, या एआरएम के लिए अधिक विश्वसनीय एमुलेटर बनाने के लिए डेवलपर्स के लिए धैर्यपूर्वक इंतजार करना होगा।

दिसंबर 2018, और अभी भी इसके साथ कुछ मुद्दे हैं qemu-system-arm

मैं एक ताज़ा स्थापित उबंटू 18 बायोनिक का उपयोग करके एक क्यूईएमयू एम्यूलेटर पर रास्पियन जेसी को बूट करने में सक्षम था, हालांकि यह मेरे काम के लिए स्थिर नहीं था इसलिए मुझे इसे वास्तविक हार्डवेयर के लिए छोड़ना पड़ा। यह अक्सर फ्रीज होता।

qemu-system-arm मेरे OS पर काम नहीं किया, इसलिए मैंने Ubuntu Bionic को इंस्टॉल करने के लिए Virtualbox का उपयोग किया और Bionic के अंदर मैंने QEMU के साथ Raspbian स्थापित किया।

मैंने इस ट्यूटोरियल का अनुसरण किया: https://azeria-labs.com/emulate-raspberry-pi-with-qemu/

सौभाग्य


1

मुझे पता है कि यह कुछ हद तक वृद्ध प्रश्न है, लेकिन चूंकि QEMU के साथ रास्पबेरी पाई छवियों के परीक्षण के लिए अभी भी कोई अच्छा जवाब नहीं है, इसलिए मुझे आंशिक उत्तर देने के लिए अनुमति दें।

मैं Ubuntu 16.04 raspi3 छवि का उपयोग करना चाहता था QEMU के साथ । इसे डाउनलोड किया, इसे निकाला, बूट विभाजन को माउंट किया, vmlinuz फ़ाइल और initrd फ़ाइल मिली, और ... qemu-system-arm -M-blabla -cpu ... -कर्नेल ... काम नहीं करता। काला चित्रपट।

फिर एक कर्नेल-qemu-4.4.34-jessie का उपयोग करके यहाँ से xenial छवि / rootfs के साथ उसी "init मारे गए" समस्या का नेतृत्व किया।

लेकिन जब से मैं एक ज्ञात अच्छे कर्नेल का उपयोग कर रहा हूं, और जब से आपके सरल रूप से जुड़े सी प्रोग्राम काम करता है, यह संभावना है कि समस्या केवल सतहों की है जब कोई डायनेमिक लिंकर का उपयोग करता है। (और लिंकर विशेष रूप से कर्नेल के प्रति संवेदनशील नहीं है, क्योंकि नवीनतम डेबियन 9 (खिंचाव) आधारित रास्पियन से ld-2.24 4.4 डेबियन 8 (जेसी) आधारित कर्नेल पर ठीक काम करता है।)

यहां तक ​​कि उन फ़ाइलों की प्रतिलिपि बनाने के बाद भी, जो ubuntu xenial छवि में "jessie" छवि के साथ / पर काम करते हैं, मुझे केवल एक अजीब "कॉलिंग प्रीइनिट: केई" त्रुटि मिली।

ओह, और रास्पबेरी पाई के लिए एक कर्नेल को देखने वाले किसी भी व्यक्ति को इस साइट की जांच करनी चाहिए , जो सीधे " आधिकारिक " डॉक्स / हाउटो को संदर्भित करता है ।


0

लिनक्स कर्नेल अब इसके बजाय init नहीं चलता है, यह systemd चलाता है जो init की तरह है, लेकिन थोड़ा और अधिक उन्नत सुविधाएँ और अतिरिक्त मल्टीटास्किंग capcbilities है, हालाँकि unix के विरुद्ध systemd उपयोगी है।


यकीन नहीं है कि अगर यह पता है कि कैसे
कासिम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.