मुझे initramfs की आवश्यकता क्यों है?


17

मुझे पता चला है कि अगर मैं चुनें jffsया sdफाइल सिस्टम के रूप में (और नहीं initramfs), गिरी का आकार बहुत छोटा (1.4 एमबी के रूप में के साथ तुलना में किया जाएगा initramfsजो 3.4MB है)। इसका मतलब है कि initramfsकाफी बड़ी जगह लेता है। इसलिए अगर मैं कर सकता हूं, तो मैं इसे पूरी तरह से हटा दूंगा, और इस तरह बहुत छोटे कर्नेल होंगे, जो मैं चाहता हूं।

मेरे दिमाग में पॉपिंग सवाल है: मुझे इसकी आवश्यकता क्यों है initramfs? किसी भी प्रारंभिक फाइल सिस्टम के बिना लिनक्स कर्नेल बूट नहीं किया जा सकता है?

मेरा अंतिम आवेदन केवल गणना और संचार करेगा - कोई भंडारण नहीं। तो बिना किसी फाइल सिस्टम के एक OS का अर्थ है - कम से कम मेरे आवेदन के लिए।


2
आप initramfs के बिना नहीं कर सकते। अतिरिक्त initramfs फ़ाइल के बिना इसका करना संभव है, लेकिन आप जो भी करते हैं, उसकी परवाह किए बिना, कर्नेल में बहुत ही खाली या शामिल नहीं है। इसलिए मैं आपके सवाल को नहीं समझता - आप किस वितरण की बात कर रहे हैं? आप अपना कर्नेल कैसे बना रहे हैं? क्या आप कर्नेल .config फ़ाइल प्रदान कर सकते हैं? ये बहुत महत्वपूर्ण हैं। मुझे संदेह है कि आपका डिस्ट्रो अपने initramfs को सीधे कर्नेल में संकलित कर रहा है - और इसलिए इसमें अन्यथा खाली initramfs भरना है - लेकिन मैं आपके द्वारा प्रदान की गई जानकारी के आधार पर नहीं जान सकता।
मिकसेर

2
@mikeserv, स्पष्ट रूप से निर्मित लेकिन खाली / अप्रयुक्त initramfs की गिनती नहीं है।
Psusi

खैर, @psusi कर्नेल डॉक्स असहमत हैं। और मैं केवल इसके बारे में इतना अडिग हूं क्योंकि इसके लिए कोई रहस्य होने की जरूरत नहीं है - बस /rootयही है। केवल एक चीज जो इसे अलग तरह से करती है, switch_rootलेकिन यहां तक ​​कि, बशर्ते कुछ लोड किए गए कर्नेल मॉड्यूल के साथ उचित सावधानी बरती जाती है, कभी भी किया जा सकता है। Initramfs एक डिस्क छवि से अधिक कुछ नहीं है - ब्रूमिंग या नहीं, यह वहां है। और तुम इसके बिना कभी नहीं हो - यह तुम्हारी जड़ है। यह सिर्फ एक रहस्य नहीं होना चाहिए, यही वह है जो मुझे लगता है, और मैं इसके आसपास के सभी अनावश्यक भ्रम को नापसंद करता हूं।
मिकसेर्व

2
@mikeserv, no, / root रूट यूजर के लिए होम डायरेक्टरी है। रूटफ़्स / है, जो तब असली जड़ के ऊपर चढ़ा हुआ है। आप सिर्फ शब्दार्थ का तर्क दे रहे हैं। इस चर्चा के प्रयोजनों के लिए, इनट्रामरफ्स न होने का मतलब है कि डिस्क पर एक फाइल नहीं है जिसे आपके बूट लोडर को कर्नेल में लोड और पास करना है।
Psusi

यह सच है, मैंने केवल स्पष्टता के लिए / रूट का उपयोग किया है, लेकिन मैं आपको वह देता हूं। लेकिन नहीं, वे शब्दार्थ नहीं हैं, वे आपके लिनक्स कर्नेल के मौलिक यांत्रिकी हैं। ये बुनियादी बातें हैं। बस उन्हें सही करने की कोशिश करें।
मोकेसर

जवाबों:


12

एक इनट्रामाफ़्स होने का आकार वृद्धि रैम्फ़ ड्राइवर के कारण नहीं है (यह केवल कुछ केबी है, और वैसे भी अन्य चीज़ों के लिए आवश्यक है) लेकिन इनट्रैमफ़्स ही। Initramfs में ऐसे प्रोग्राम होते हैं जो वास्तविक रूट फाइलसिस्टम को इकट्ठा और माउंट करने के लिए आवश्यक हैं।

/सिस्टम को बूट करने के लिए Initramfs इसे बहुत आसान बनाता है, और कुछ मामलों में संभव है (जैसे एन्क्रिप्टेड )। यह बहुत हॉटप्लाजेबल बाह्य उपकरणों के साथ पीसी-शैली के हार्डवेयर पर रखने के लिए दृढ़ता से अनुशंसित है। दूसरी ओर, यह एक अंतर्निहित डिवाइस को बूट करने के लिए बहुत कुछ समझ में आता है बिना किसी इनट्राम्राम्स के, एक कर्नेल के साथ जो इसके लिए बनाए गए विशेष हार्डवेयर कॉन्फ़िगरेशन का समर्थन करता है।

बेशक कर्नेल को एक फाइल सिस्टम में बूट करने की आवश्यकता होती है: इसके लिए कुछ तरीका होना चाहिए ताकि आप जो भी एप्लिकेशन चलाना चाहते हैं उसे लोड कर सकें। यदि आप कुछ भी चलाने नहीं जा रहे हैं, तो आप मशीन को चालू रख सकते हैं।

यदि आप initramfs का उपयोग नहीं करना चाहते हैं, तो बस अपने बूटलोडर से कहें कि वह एक पास न करे। कर्नेल बिल्ड के आउटपुट में भी एक को शामिल न करें - बेशक यह कैसे होता है अगर आर्किटेक्चर- और बूटलोडर-डिपेंडेंट: उदाहरण के लिए, vmlinuxऔर bzImageइसमें इनट्रामाफ़्स शामिल नहीं हैं (वे क्रमशः कच्चे और संकुचित कर्नेल हैं ), लेकिन uImage(यू-बूट के लिए) एक होने पर कर्नेल और इनट्राम्राम्स दोनों को पैक करता है।

(तकनीकी रूप से, माइकर्स नोट्स के रूप में , हमेशा एक इनट्राम्राम्स होता है - लेकिन डिफ़ॉल्ट रूप से, यह एक रिक्त, 134-बाइट संग्रह है। आप जो देख रहे हैं, और जो छुटकारा पाना चाहते हैं, वह एक "सच" है, गैर-खाली इनट्रैमफैट बनाया गया है। आपकी निर्माण प्रक्रिया और ऐसे उपकरण शामिल हैं जो तब रूट फाइल सिस्टम को माउंट करने के लिए उपयोग किए जाते हैं।)

ध्यान रखें, एक initramfs एक एकल-अनुप्रयोग प्रणाली बनाने का एक उचित तरीका हो सकता है जिसमें कोई लगातार डेटा नहीं है: अपने सभी एप्लिकेशन को initramfs में डालें, बूट करें और इसे रखें। इससे आपकी लगातार भंडारण या बूट छवि को व्यवस्थित करना आसान हो जाता है (आपको केवल कर्नेल और इनट्राम्राम्स की आवश्यकता होती है, जिसे बंडल किया जा सकता है)। हालांकि इस दृष्टिकोण के लिए डाउनसाइड्स हैं: इनट्रामाफ़्स के सभी डेटा को स्थायी रूप से रैम में संग्रहीत किया जाएगा, और आप बूट छवि में फ़ाइलों को आसानी से संशोधित नहीं कर सकते, आपको संग्रह को पुनर्निर्माण करना होगा।


यदि आप एक 2.6 या नए लिनक्स कर्नेल का उपयोग कर रहे हैं, तो आपके पास initramfs है। आप एक द्वितीयक initramfs छवि का उपयोग करते हैं या नहीं, जैसा कि प्रथागत है, एक और मामला है, लेकिन initramfs वैकल्पिक नहीं है।
माइकस

2
@mikeserv आपके पास एक है, हाँ। लेकिन एक खाली initramfs मूंगफली है। इसका उपयोग करने की आवश्यकता नहीं है (जिसके लिए यह आवश्यक है कि इसमें असली रूट को माउंट करने के लिए पर्याप्त प्रोग्राम हों, जो एक गैर-नगण्य तरीके से आकार में वृद्धि करता है)।
गिल्स एसओ- बुराई को रोकना '

वैसे भी अनिवार्य मूंगफली। और मुझे नहीं पता कि मैंने कब कहा अन्यथा! पूछने वाला फाइल सिस्टम के रूप में इसे हटाने के बारे में जानकारी का अनुरोध कर रहा था - जो संभव नहीं है।
माइकस

और हाँ इसका उपयोग करना होगा - बिना इनट्राम्राम्स के कोई जड़ नहीं है। कभी।
माइकस

8

से LFS :

एक initramfs का एकमात्र उद्देश्य रूट फाइलसिस्टम को माउंट करना है। Initramfs निर्देशिकाओं का एक पूरा सेट है जो आपको एक सामान्य रूट फाइल सिस्टम पर मिलेगा। इसे एकल cpio संग्रह में बांधा गया है और कई संपीड़न एल्गोरिदम के साथ संपीड़ित किया गया है।

...

एलएफएस वातावरण में इनट्राम्राम्स होने के केवल चार प्राथमिक कारण हैं: रूटफुट को नेटवर्क से लोड करना, इसे एलवीएम लॉजिकल वॉल्यूम से लोड करना, एक एन्क्रिप्टेड रूटफुट होना जहां एक पासवर्ड की आवश्यकता होती है, या रूटफ्स को निर्दिष्ट करने की सुविधा के लिए। लेबल या UUID। किसी भी चीज का आमतौर पर मतलब है कि कर्नेल को ठीक से कॉन्फ़िगर नहीं किया गया था।

...

अधिकांश वितरणों के लिए, कर्नेल मॉड्यूल एक इनट्राम्राम्स होने का सबसे बड़ा कारण है। एक सामान्य वितरण में, कई अज्ञात हैं जैसे फ़ाइल सिस्टम प्रकार और डिस्क लेआउट। एक तरह से, यह एलएफएस के विपरीत है जहां सिस्टम की क्षमताओं और लेआउट को जाना जाता है और एक कस्टम कर्नेल आम तौर पर बनाया जाता है। इस स्थिति में, एक initramfs की शायद ही कभी आवश्यकता होती है।

एक अन्य स्रोत www.kernel.org

इसके अलावा बहुत सारे लिनक्स सिस्टम हैं जो उन राउटरों को पसंद करते हैं जो initramfs का उपयोग नहीं करते हैं।


1

नेटवर्क बूट, या lvm या RAID जैसे अधिक जटिल सेटअपों के लिए आपको इनट्राम्राम्स की आवश्यकता होती है, क्योंकि रूट एफएस तक पहुंच को कॉन्फ़िगर करने के लिए उन्हें कुछ उपयोगकर्ता मोड उपयोगिताओं की आवश्यकता होती है। डिस्क पर एक साधारण, पारंपरिक विभाजन के लिए, तब तक जब तक आपके पास डिस्क ड्राइवर कर्नेल में निर्मित नहीं हो जाते हैं, और यूयूआईडी के बजाय डिवाइस पथ द्वारा रूट तर्क निर्दिष्ट करते हैं, तब आप बिना इनट्रैमफोर्स के कर सकते हैं। बेशक, डिवाइस पथ परिवर्तन के अधीन है, जो आपके द्वारा कनेक्ट किए गए प्लग एंड प्ले (यानी यूएसबी) डिवाइसों पर निर्भर करता है, या यहां तक ​​कि यादृच्छिक समय भिन्नताएं भी हैं, यही वजह है कि विश्वसनीयता के लिए हर कोई uuids और एक initramfs का उपयोग करता है।


यह भी गलत है।
माइक

6
@mikeserv, आपकी टिप्पणी बेकार है। यदि आप ऐसा दावा करने जा रहे हैं, तो आपको यह समझाने की आवश्यकता है कि क्यों।
Psusi

मैंने किया है, या बल्कि, कर्नेल प्रलेखन मेरे जवाब का कुछ 99% रचना करता है।
माइकस

@ माइकर्स, यह सही है। मैं बिना इनट्रामर्फ के अब सालों से जेंटू लाइनक्स चला रहा हूं।
टिम

1

यह एक पुराना सवाल है, लेकिन फिर भी एक स्वीकृत जवाब नहीं दिखता है इसलिए मैं इसे वहां फेंक दूंगा (मैं यहां कोई विशेषज्ञ नहीं हूं, मैं इसे अपने लिए जानने की कोशिश कर रहा हूं।)

से https://www.kernel.org/doc/Documentation/early-userspace/README (नीचे जो यह 2004 से अद्यतन नहीं किया गया कहते हैं पर सभी तरह)

कर्नेल के पास वर्तमान में रूट फाइल सिस्टम को माउंट करने के 3 तरीके हैं:

क) सभी आवश्यक डिवाइस और फाइलसिस्टम ड्राइवर कर्नेल में संकलित किए गए हैं, कोई initrd नहीं है। init / main.c: init () अंतिम रूट फाइलसिस्टम को आर-पार करने के लिए तैयार_नामेशस्पेस () को रूट = विकल्प और वैकल्पिक init के आधार पर कहेंगे, init / main.c के अंत में सूचीबद्ध की तुलना में कुछ अन्य init बाइनरी को चलाने के लिए: init ()।

बी) कुछ डिवाइस और फाइलसिस्टम ड्राइवरों को मॉड्यूल के रूप में बनाया गया है और एक initrd में संग्रहीत किया गया है। Initrd में एक बाइनरी '/ linuxrc' होना चाहिए जो इन ड्राइवर मॉड्यूल को लोड करने वाला हो। Linuxrc के माध्यम से अंतिम रूट फाइल सिस्टम को माउंट करना और pivot_root syscall का उपयोग करना भी संभव है। Initrd को माउंट किया गया है और तैयार किया गया है।

c) initramfs का उपयोग करना। तैयार करने के लिए call_namespace () को छोड़ दिया जाना चाहिए। इसका मतलब है कि एक बाइनरी सभी काम करना चाहिए। कहा गया बाइनरी initramfs में usr / gen_init_cpio.c को संशोधित करके या नए initrd प्रारूप के माध्यम से cpio आर्काइव में संग्रहीत किया जा सकता है। इसे "/ init" कहा जाना चाहिए। यह बाइनरी सभी चीजों को तैयार करने के लिए जिम्मेदार है।

पश्चगामी संगतता बनाए रखने के लिए, init बाइनरी केवल तभी चलेगी जब यह एक initramfs cpio संग्रह के माध्यम से आता है। यदि यह मामला नहीं है, init / main.c: init () अंतिम रूट को माउंट करने और पूर्वनिर्धारित init बायनेरिज़ में से एक को निष्पादित करने के लिए तैयार_नामेसस्पेस () चलाएगा।

इसके लायक क्या है, मेरा मानना ​​है कि डिवाइस / डिस्ट्रोस जैसे रास्पबेरी पाई, इत्यादि initramfs का उपयोग नहीं करते हैं; कुछ मामलों में कर्नेल रूट विभाजन पर होता है (बूटलोडर द्वारा माउंट किया जाता है जिसमें अपेक्षित एफएस मॉड्यूल होते हैं।) अन्य मामलों में जहां कर्नेल एक /bootविभाजन पर होता है, उसी विभाजन पर initramfs को रूटफुट को दूसरों के रूप में माउंट करने से पहले सीधे एक्सेस किया जा सकता है। कहा है

कुछ मामलों में initramfs को कर्नेल के समान फ़ाइल में बनाया जा सकता है लेकिन यह हमेशा ऐसा नहीं होता है। (ए) बहुत स्पष्ट रूप से बताता है कि कुछ मामलों में इनट्रैमफास आवश्यक नहीं है।


0

मुझे निम्नलिखित स्पष्टीकरण अधिक स्पष्ट लगता है,

initramfsएक रूट फाइलसिस्टम है जिसे कर्नेल में एम्बेड किया जाता है और बूट प्रक्रिया के प्रारंभिक चरण में लोड किया जाता है। यह initrd का उत्तराधिकारी है। यह शुरुआती उपयोगकर्ता स्थान प्रदान करता है जो कर्नेल को बूट प्रक्रिया के दौरान आसानी से अपने आप नहीं कर सकता है।

Initramfs का उपयोग करना वैकल्पिक है। डिफ़ॉल्ट रूप से, कर्नेल अंतर्निहित ड्राइवरों का उपयोग करके हार्डवेयर को प्रारंभ करता है, निर्दिष्ट रूट विभाजन को मापता है, स्थापित लिनक्स वितरण की init प्रणाली को लोड करता है। इनिट सिस्टम तब अतिरिक्त मॉड्यूल लोड करता है और तब तक सेवाएं शुरू करता है जब तक कि यह अंततः आपको लॉग इन करने की अनुमति नहीं देता। यह एक अच्छा डिफ़ॉल्ट व्यवहार है और कई उपयोगकर्ताओं के लिए पर्याप्त है। initramfs उन्नत आवश्यकताओं वाले उपयोगकर्ताओं के लिए है; उन उपयोगकर्ताओं के लिए जिन्हें रूट विभाजन आरोहित होने से पहले ही चीजों को जल्द से जल्द करने की आवश्यकता है।

यहाँ initramfs के साथ आप क्या कर सकते हैं इसके कुछ उदाहरण दिए गए हैं:

  • रूट विभाजन को माउंट करें (एन्क्रिप्टेड, तार्किक और अन्यथा विशेष विभाजन के लिए);
  • एक न्यूनतम बचाव कवच प्रदान करें (यदि कुछ गलत हो जाता है);
  • बूट प्रक्रिया को कस्टमाइज़ करें (उदाहरण के लिए एक स्वागत संदेश, बूट स्प्लैश, आदि प्रिंट करें);
  • लोड मॉड्यूल (जैसे तीसरे पक्ष के ड्राइवर);
  • कर्नेल कुछ भी नहीं कर सकता (जब तक आप इसे उपयोगकर्ता स्थान में कर सकते हैं, उदाहरण के लिए कमांड निष्पादित करके)। यदि आपके पास उन्नत आवश्यकताएं नहीं हैं, तो आपको initramfs की आवश्यकता नहीं है।

-1

कोई फर्क नहीं पड़ता कि आप क्या करते हैं, आपके पास है initramfsइसके बिना कोई भी काम नहीं हो रहा है - यह आप पर लगाया गया एकमात्र फाइल सिस्टम है। से kernel.org :

रूटफुट क्या है?

Rootfsramfs(या 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शामिल नहीं है, तो रूट विभाजन का पता लगाने और माउंट करने के लिए कर्नेल पुराने कोड के माध्यम से गिर जाएगा, फिरउसमें सेकुछ संस्करण को निष्पादित करें।initcpio/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 निर्माण कोड पूरी तरह से स्व-निहित है, और कर्नेल का बूट-टाइम एक्सट्रैक्टर भी (स्पष्ट रूप से) स्व-निहित है।


1
आप एक initramfs के बिना बूट कर सकते हैं। आपका उत्तर initramfs के गुण पर समाप्त हो जाता है, लेकिन यह विशिष्ट एम्बेडेड सिस्टम पर लागू नहीं होता है, और यहां तक ​​कि डेस्कटॉप या सर्वर पर भी जहां एक initramfs की सिफारिश की जाती है, यह अनिवार्य नहीं है।
गिलेस एसओ- बुराई को रोकना '

@ गिल्स - नहीं तुम नहीं कर सकते। आप जो भी करते हैं, उसके बावजूद आपके पास initramfs है। यह कर्नेल में संकलित है - अभी, आपकी कर्नेल, मेरी कर्नेल, हमारे सभी कर्नेल की है। कर्नेल डॉक्स पढ़ें - मेरी पूरी पोस्ट एक कॉपी-पेस्ट थी। आप गलत हैं। आप आधिकारिक दस्तावेज का विवाद कैसे कर सकते हैं?
माइकस

1
मैं आधिकारिक दस्तावेज़ीकरण पर विवाद नहीं करता, मैं उन निष्कर्षों पर विवाद करता हूं, जो आप इससे आकर्षित कर रहे हैं। आप ऐसे डॉक्यूमेंट को पढ़ रहे हैं जो बताता है कि इनट्राम्राम्स का उपयोग कैसे किया जाता है। कहीं भी यह नहीं बताया गया है कि इनट्रामर्फ का उपयोग किया जाना है।
गिल्स का SO-

@ गिल्स यदि यह पर्याप्त अच्छा नहीं है: "2.6 कर्नेल निर्माण प्रक्रिया हमेशा एक gzipped cpio प्रारूप initramfs संग्रह बनाता है और इसे परिणामी कर्नेल बाइनरी में लिंक करता है। डिफ़ॉल्ट रूप से, यह संग्रह खाली है (x86 पर 134 बाइट्स का उपभोग कर रहा है ...)। " मैं बेहतर कर सकता हूँ। ऊपर एक 2 या 3 मिनट की वेब खोज थी।
माइकस

3
मैंने डॉक्यूमेंटेशन पढ़ा है। मैं यह जीने के लिए करता हूं। यह राय की बात नहीं है। वहाँ हमेशा एक initramfs है, लेकिन यह जरूरी नहीं कि बूटिंग के लिए उपयोग किया जाता है। मुझे उस मामले के लिए कर्नेल संरचना का एक सभ्य स्पष्टीकरण नहीं मिल रहा है, संभवतः क्योंकि यह क्लासिक मामला है जिसे समझा जाता है कि यह स्पष्टीकरण नहीं है। मुख्य तर्क इसमें है do_mounts.c- विशेष रूप से prepare_namespace, जिसमें कमांड लाइन तर्क के saved_root_nameसाथ आबादी आती root=है।
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.