मैं एक बहुत ही कम से कम लिनक्स प्रणाली का निर्माण कर रहा हूं, जिसमें बस कर्नेल (v4.1-rc5) और एक इनट्राम्रॉफ़ व्यस्त है जो व्यस्त बॉक्स (v1.23.2) के साथ है। यह अधिकांश भाग के लिए ठीक काम करता है, लेकिन मैं / init में कमांड निष्पादन के व्यवहार में अंतर का निरीक्षण करता हूं कि क्या मैं एक बाहरी initramfs बनाम बाहरी का उपयोग कर रहा हूं।
/ Init स्क्रिप्ट है:
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t sysfs none /sys
mount -t proc none /proc
echo "Welcome"
while true
do
setsid cttyhack /bin/sh
done
तब मैं या तो CONFIG_INITRAMFS_SOURCE विकल्प कर्नेल में सेट कर देता हूं। Initramfs के लिए सभी फ़ोल्डर युक्त निर्देशिका में, या मैं चलाता हूं
find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz
इसे बनाने के लिए।
जब मैं कर्नेल संकलित करता हूं, तो CONFIG_INITRAMFS_SOURCE सेट के साथ या उसके बिना, मैं अपने सिस्टम के दो वेरिएंट के साथ समाप्त होता हूं:
Inzramfs के साथ bzImage एम्बेडेड
bzImage + rootfs.cpio.gz (बाहरी initramfs)
जब मैं अब उन का उपयोग शुरू करते हैं qemu
qemu-system-x86_64 -enable-kvm -kernel bzImage
या
qemu-system-x86_64 -enable-kvm -kernel bzImage -initrd rootfs.cpio.gz
मुझे व्यवहार में निम्नलिखित अंतर मिलते हैं:
संस्करण 2 (बाहरी initramfs) के साथ सब कुछ ठीक काम करता है, "वेलकम" प्रदर्शित होता है और मुझे एक संकेत मिलता है। हालांकि संस्करण 1 के साथ (initramfs एम्बेडेड) मुझे चेतावनी मिलती है
unable to open an initial console
"आपका स्वागत है" प्रदर्शित नहीं होता है, और मुझे मेरा संकेत मिलता है।
जहां तक मैं इस प्रक्रिया को समझता हूं, initramfs के उन दो संस्करणों में समान फाइलें होनी चाहिए, क्योंकि मैं इसे एक समान फ़ोल्डर से बनाता हूं (या कर्नेल का निर्माण करता हूं)।
मुझे आश्चर्य है कि क्या कोई इस व्यवहार के लिए स्पष्टीकरण के साथ मेरी मदद कर सकता है?
* अपडेट करें *
जैसा कि mikeserv ने टिप्पणी में कहा है, कर्नेल में एक न्यूनतम एम्बेडेड initramfs प्रति डिफ़ॉल्ट शामिल है। यह तब भी मौजूद होता है जब किसी बाहरी का उपयोग किया जाता है, लेकिन यदि आप अपना स्वयं का एम्बेड करते हैं, तो यह ओवरराइट हो जाता है। मैंने पाया कि विनिर्देश के विपरीत, यह वास्तव में खाली नहीं है, लेकिन इसमें एक देव फ़ोल्डर, एक रूट फ़ोल्डर और / देव / कंसोल डिवाइस है। यह डिवाइस तब बाहरी इनट्राम्राम्स का उपयोग करते समय उपयोग किया जाता है, लेकिन यदि आप अपना स्वयं का एम्बेड करते हैं तो यह ओवरराइट हो जाता है। तो आपको अपने initramfs स्रोत में / dev / कंसोल डिवाइस को शामिल करना होगा mknod -m 622 initramfs_src/dev/console c 5 1
जब अपना स्वयं का एम्बेड करना हो।
मेरी मदद करने के लिए mikeserv, frostschutz और JdeBP को बहुत-बहुत धन्यवाद!
/dev/console
आपके द्वारा निर्मित बिल्ट पर क्या अनुमतियाँ सेट की गई हैं ? मुझे लगता है कि अंतर हो सकता है कि दो मामलों में पैकिंग कौन करता है।