कोई फर्क नहीं पड़ता कि आप क्या करते हैं, आपके पास है initramfs
। इसके बिना कोई भी काम नहीं हो रहा है - यह आप पर लगाया गया एकमात्र फाइल सिस्टम है। से kernel.org :
रूटफुट क्या है?
Rootfs
ramfs
(या tmpfs
, यदि वह सक्षम है) का एक विशेष उदाहरण है , जो
हमेशा 2.6 सिस्टम में मौजूद होता है। आप लगभग उसी कारण से अनमाउंट नहींrootfs
कर सकते जो आप init प्रक्रिया को नहीं मार सकते; खाली सूची को जांचने और संभालने के लिए विशेष कोड होने के बजाय, कर्नेल के लिए यह छोटा और सरल है कि यह सुनिश्चित करें कि कुछ सूचियां खाली नहीं हो सकती हैं।
अधिकांश सिस्टम सिर्फ एक और फाइल सिस्टम को माउंट करते हैं rootfs
और इसे अनदेखा करते हैं। अंतरिक्ष की एक खाली जगह पर रामफ्स की मात्रा कम होती है ।
अगर * CONFIG_TMPFS * सक्षम किया गया है, rootfs
का उपयोग करेगा tmpfs
के बजाय ramfs
डिफ़ॉल्ट रूप से। बल के लिए ramfs
, जोड़ने "rootfstype=ramfs"
कर्नेल कमांड लाइन करने के लिए।
Initramfs क्या है?
सभी 2.6 लिनक्स कर्नेल में एक gzipped"cpio"
प्रारूप संग्रह होता है, जिसे कर्नेल बूट होने पर निकाला जाता है rootfs
। निकालने के बाद, कर्नेल यह देखने के लिए जांचता है कि क्याrootfs
कोई फ़ाइल शामिल है"init"
, और यदि ऐसा है तो वह PID 1 के रूप में निष्पादित करता है । यदि पाया जाता है, तो यहinit
प्रक्रिया सिस्टम को बाकी के तरीके को लाने के लिए जिम्मेदार है, जिसमें वास्तविक रूट डिवाइस का पता लगाना और माउंट करना शामिल है ( यदि कोई)। यदिएम्बेडेडसंग्रह को इसमें निकालेजाने के बाद प्रोग्रामrootfs
शामिल नहीं है, तो रूट विभाजन का पता लगाने और माउंट करने के लिए कर्नेल पुराने कोड के माध्यम से गिर जाएगा, फिरउसमें सेकुछ संस्करण को निष्पादित करें।init
cpio
/sbin/init
यह सब कई तरीकों से पुरानी initrd से अलग है:
पुरानी initrd हमेशा एक अलग फ़ाइल होती थी, जबकि initramfs संग्रह को लिनक्स कर्नेल छवि में जोड़ा जाता है। (निर्देशिका linux - * / usr निर्माण के दौरान इस संग्रह को बनाने के लिए समर्पित है।)
पुरानी initrd फ़ाइल एक gzipped फ़ाइल सिस्टम छवि थी (कुछ फ़ाइल प्रारूप में, जैसे ext2, जिसे कर्नेल में निर्मित ड्राइवर की आवश्यकता थी), जबकि नया initramfs संग्रह एक gzipped cpio संग्रह है (जैसे टार सरल, cpio देखें) (1) और डॉक्यूमेंटेशन / अर्ली-यूजर्सस्पेस / बफर- format.txt)। कर्नेल का cpio निष्कर्षण कोड न केवल बहुत छोटा है, यह __init पाठ और डेटा भी है जिसे बूट प्रक्रिया के दौरान खारिज किया जा सकता है।
पुराने initrd (जिसे / initrd, not / init कहा जाता था) द्वारा चलाया गया प्रोग्राम कुछ सेटअप करता है और फिर कर्नेल में वापस आ जाता है, जबकि initramfs से init प्रोग्राम के कर्नेल पर लौटने की उम्मीद नहीं होती है। (यदि init को नियंत्रण से बाहर करने की आवश्यकता है तो यह एक नए रूट डिवाइस के साथ / ओवरमाउंट कर सकता है और किसी अन्य init प्रोग्राम को निष्पादित कर सकता है। नीचे स्विच_रूट उपयोगिता देखें।)
किसी अन्य रूट डिवाइस को स्विच करते समय, initrd pivot_root होगा और फिर रैमडिस्क को umount कर देगा। लेकिन initramfs रूटफ़्स है: आप रूटफुट को न तो पिवट कर सकते हैं, न ही इसे अनमाउंट कर सकते हैं। बजाय स्थान खाली करने के लिए रूटफ़्स से सब कुछ हटाएं (ढूँढें -xdev / -exec rm '{}' ';'), नई रूट (cd / newmount; माउंट --move। /; Chroot।) के साथ रूटफ़ॉफ़्ट को ओवरमाउंट करें। stdin / stdout / stderr को नए / dev / कंसोल में संलग्न करें, और नई init निष्पादित करें।
चूँकि यह एक उल्लेखनीय रूप से दृढ़ प्रक्रिया है (और इसमें आपको चलाने से पहले कमांड हटाना शामिल है), klibc पैकेज ने आपके लिए यह सब करने के लिए एक सहायक प्रोग्राम (utils / run_init.c) शुरू किया। अधिकांश अन्य पैकेजों (जैसे कि बिजीबॉक्स) ने इस कमांड का नाम "switch_root" रखा है।
Initramfs को आबाद करना:
2.6 कर्नेल निर्माण प्रक्रिया हमेशा एक gzipped cpio प्रारूप initramfs संग्रह बनाती है और इसे परिणामी कर्नेल बाइनरी में लिंक करती है। डिफ़ॉल्ट रूप से, यह संग्रह खाली है (x86 पर 134 बाइट्स का उपभोग करते हुए)।
कॉन्फ़िगरेशन विकल्प CONFIG_INITRAMFS_SOURCE (सामान्य सेटअप में menuconfig, और usr / Kconfig में रहने वाले) का उपयोग initramfs संग्रह के स्रोत को निर्दिष्ट करने के लिए किया जा सकता है, जो स्वचालित रूप से परिणामी बाइनरी में शामिल हो जाएगा। यह विकल्प मौजूदा gzipped cpio संग्रह की ओर इशारा कर सकता है, एक निर्देशिका जिसमें संग्रहित की जाने वाली फाइलें या एक पाठ फ़ाइल विनिर्देशन जैसे कि निम्न उदाहरण हैं:
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
उपरोक्त फ़ाइल प्रारूप का उपयोग करते हुए उपयोग संदेश प्राप्त करने के लिए "usr / gen_init_cpio" (कर्नेल बिल्ड के बाद) चलाएँ।
कॉन्फ़िगरेशन फ़ाइल का एक फायदा यह है कि नए संग्रह में अनुमतियों को सेट करने या डिवाइस नोड बनाने के लिए रूट एक्सेस की आवश्यकता नहीं है। (ध्यान दें कि उन दो उदाहरण "फ़ाइल" प्रविष्टियों को लाइन-2.6 के तहत "initramfs" नामक एक निर्देशिका में "init.sh" और "बिजीबॉक्स" नामक फ़ाइलों को खोजने की उम्मीद है। * निर्देशिका। इसके लिए दस्तावेज़ीकरण / प्रारंभिक-उपयोक्ता / README देखें। अधिक जानकारी।)
कर्नेल बाहरी cpio टूल पर निर्भर नहीं करता है। यदि आप किसी कॉन्फ़िगरेशन फ़ाइल के बजाय एक निर्देशिका निर्दिष्ट करते हैं, तो कर्नेल का बिल्ड इन्फ्रास्ट्रक्चर उस निर्देशिका (usr / Makefile कॉल स्क्रिप्ट / gen_initramfs_list.sh) से एक कॉन्फ़िगरेशन फ़ाइल बनाता है, और उस फ़ाइल को फीड करके (इसे फीड करके) उस निर्देशिका को पैकेज करने के लिए आगे बढ़ता है। usr / gen_init_cpio, जो usr / gen_init_cpio.c) से बनाया गया है। कर्नेल का बिल्ड-टाइम cpio निर्माण कोड पूरी तरह से स्व-निहित है, और कर्नेल का बूट-टाइम एक्सट्रैक्टर भी (स्पष्ट रूप से) स्व-निहित है।