अपने स्वयं के initrd का निर्माण करते समय निर्देशिका को देव / आबाद कैसे करें?


9

मैं initrd के बारे में सामान सीखने की कोशिश कर रहा हूँ। मैंने अपने ट्यूटोरियल को खरोंच से बनाने के लिए इस ट्यूटोरियल का अनुसरण किया है , और मैंने इस पर बिजीबॉक्स स्थापित किया है। तब मैंने आइसोलिनक्स के साथ इसमें से एक आइसो बनाया, इसलिए मैं इसे वर्चुअलबॉक्स में टेस्ट कर सकता था। यह बहुत अच्छा काम करता है!

मेरे पास व्यस्त बॉक्स से मूल कमांड हैं, इसलिए मैं एक फाइल सिस्टम माउंट करना चाहता था। लेकिन / देव निर्देशिका लगभग खाली है (कोई एसडीए), ट्यूटोरियल का पालन करते समय मेरे द्वारा बनाई गई कुछ फ़ाइलों को छोड़कर। मुझे udv के बारे में पता चला और मुझे लगता है कि मुझे यही चाहिए। हालांकि मुझे यकीन नहीं है कि इस पर कैसे जाना है।

क्या मुझे केवल udev से नवीनतम स्रोत कोड को पकड़ना चाहिए, इसे संकलित करना चाहिए और इसे अपने initrd में जोड़ना चाहिए? और फिर कॉल / बिन / udev या ऐसा कुछ मेरे इनिट स्क्रिप्ट में? या वहाँ एक और / बेहतर तरीका है / देव निर्देशिका आबाद?

संपादित करें: कुछ अतिरिक्त जानकारी और अपडेट जो मैंने पहले ही किए हैं।

  • मैं आभासी बॉक्स में सब कुछ परीक्षण करता हूं। मैंने अभी-अभी ubuntu को वर्चुअल बॉक्स में कम से कम स्थापित किया है, अपने initrd से .iso बनाया है, और फिर virtualbox में iso से बूट किया है।
  • मैंने vmlinuz का उपयोग किया और /lib/modulesजो एक डेबियन-बिज़नेसकार्ड.आईएसओ पर मौजूद थे और उन लोगों को अपने इनिटर्ड पर कॉपी किया जो मैंने पहले लिंक किए गए ट्यूटोरियल का अनुसरण करके बनाया था।
  • कर्नेल के पास है CONFIG_DEVTMPFS=y
  • कुछ डिवाइस में /devtty0-tty63 और कुछ अन्य जैसे दिखते हैं, लेकिन कोई sda / hda नहीं है।
  • दौड़ा lspci -kमेरी वर्तमान में चल ओएस में और एक आभासी बॉक्स में जाँच करने के लिए जो मॉड्यूल उपयोग में हैं। SATA Controllerकहते हैं कि यह ahciमॉड्यूल के रूप में उपयोग करता है ।
  • जब मैं निष्पादित modprobe -v ahciकरता हूं, तो यह "अज्ञात प्रतीक: ata_some_stuff" के बारे में बहुत शिकायत करता है, लेकिन इसके बाद यह कुछ इस तरह लौटता है SCSI Subsystem initialized, ATA-6: VBOX HARDDISKऔर Direct-Access ATA VBOX HARDDISK। हालाँकि, अभी भी कोई हार्डड्राइव डिवाइस नहीं मिला है /dev

मेरी वर्तमान /init/स्क्रिप्ट इस प्रकार है:

#!/bin/ash
mount -t devtmpfs none /dev
mount -t proc /proc /proc
mount -t sysfs none /sys
modprobe -v ahci
echo "Hello world"
exec /bin/ash --login

क्या किसी को कुछ भी पता नहीं है कि मैं क्या गलत कर रहा हूं और इसके बजाय मुझे क्या करना चाहिए?

जवाबों:


12

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

वैसे भी, आपके प्रश्न का उत्तर वास्तव में वास्तव में सरल है।

  1. devtmpfsकर्नेल में सक्षम करें ( CONFIG_DEVTMPFS=y)
  2. mount -t devtmpfs none /devअपनी initस्क्रिप्ट में पहली चीज़ के रूप में चलाएं ।

बस। भक्तों के बीच /devसिर्फ udv की तरह ही भीड़ होगी । तुम भी , या , /devमूल बातें के साथ (initramfs छवि में) पूर्व आबादी की जरूरत नहीं है ।nullzeroconsole


आपके कमेंट के लिए धन्यवाद। मैंने आपकी आज्ञा चलाई, और मेरे पास अब और उपकरण हैं, लेकिन फिर भी माउंट करने के लिए कोई एसडीए या एचडीए नहीं है। क्या ऐसा कुछ है जो मैं करना भूल गया? मैं vmlinuz कर्नेल का उपयोग करता हूं जो मुझे डेबियन लाइव सिस्टम से मिला है, क्या मुझे वास्तव में अपना खुद का संकलन करना चाहिए?
कार्लिटो

@Carlito क्या इस कर्नेल में devtmpfs सक्षम है (विन्यास फाइल की जाँच करें)? डेबियन ने हाल ही में devtmpfs पर स्विच किया।
गिल्स एसओ- बुराई को रोकना '

@Gilles कोई कॉन्फ़िगर फ़ाइल नहीं दी गई है, लेकिन मैंने कर्नेल को डेबियन से प्राप्त किया है, कॉन्फ़िग फ़ाइल ने कहा CONFIG_DEVTMPFS=y, लेकिन मुझे अभी भी कोई एसडीए डिवाइस नहीं मिला है। मुझे लगता है कि यह इसलिए है क्योंकि मैंने कोई मॉड्यूल लोड नहीं किया है (lsmod रिटर्न कुछ नहीं)। फाइलसिस्टम उपकरणों को प्राप्त करने के लिए मुझे क्या मॉड्यूल लोड करना चाहिए? या कुछ और है जो मैं भूल गया?
कार्लिटो

@Carlito हां, यदि आपके पास अन्य चीजें हैं /dev, जो ड्राइव नहीं दिखा रही हैं , तो devtmpfs काम कर रहा है और आपको डिस्क नियंत्रक मॉड्यूल (जैसा आपने अनुमान लगाया था) याद आ रहा है। दुर्भाग्य से यह जानने का एकमात्र तरीका है कि आपको कौन से ड्राइवर / मॉड्यूल की आवश्यकता है या तो कर्नेल कॉन्फिग में हर एक के लिए जानकारी पढ़ें, या lspci -kएक रनिंग लिनक्स सिस्टम में चलाएं (जो आपको दिखाएगा कि आपके सिस्टम के विभिन्न घटकों का कर्नेल ड्राइवर क्या उपयोग कर रहा है) ।
पैट्रिक

1
@ CiroSantilli709 大 六四 ill ill CONFIG_DEVTMPFS_MOUNT=ynot का initramfs पर कोई प्रभाव नहीं है। कर्नेल हेल्प टेक्स्ट से: "यह विकल्प initramfs आधारित बूटिंग को प्रभावित नहीं करता है, यहाँ devtmpfs फाइल सिस्टम को रूटफुट के माउंट होने के बाद मैन्युअल रूप से माउंट करने की आवश्यकता होती है"
पैट्रिक

4

Udev /devउन ड्राइवरों के आधार पर स्वचालित रूप से पॉप्युलेट होता है जो कर्नेल में लोड होते हैं और उन डिवाइसों का पता लगाते हैं जो इन ड्राइवरों का पता लगाते हैं। उपकरणों के नाम और उनकी अनुमतियाँ नियमों के एक सेट पर आधारित हैं जो प्रशासक ठीक कर सकते हैं। अधिकांश लिनक्स सिस्टम को udev का उपयोग करना चाहिए; अपवाद सिस्टम है (आमतौर पर एम्बेडेड) जहां सिस्टम को सेट करने के समय हार्डवेयर कॉन्फ़िगरेशन जाना जाता है और बाद में नहीं बदलेगा।

आप आमतौर पर udevअपने स्टार्टअप अनुक्रम में काफी जल्दी कॉल करेंगे । कुछ चीजों में से एक जो आपको चाहिए (चाहिए?) इससे पहले कि माउंट /procऔर है /sys। डेमॉन शुरू करने के बाद, udevadm trigger --action=add; udevadm settleकर्नेल से सभी लंबित घटनाओं को udev बनाने के लिए कॉल करें ( trigger) और प्रतीक्षा करें जब तक कि घटनाओं को जारी रखने से पहले संसाधित नहीं किया जाता ( settle)। फिर आप रूट फाइल सिस्टम युक्त डिवाइस का पता लगाने के लिए आगे बढ़ सकते हैं।

udevdबाइनरी के अलावा , आपको udevअपने initrd के अन्य भागों की आवश्यकता होगी । इसमें कॉन्फ़िगरेशन फ़ाइलें /etc/udev, बेस कॉन्फ़िगरेशन के /lib/udevसाथ-साथ सहायक बायनेरी scsi_idभी शामिल हैं /lib/udev। आपको उन सभी कार्यक्रमों की आवश्यकता है जो udv नियमों से बुलाए जाते हैं जिन्हें आप initrd में शामिल करते हैं।

Initrd के अंत में, वास्तविक रूट विभाजन पर नियंत्रण स्थानांतरित करने से पहले, आपको udevdinitrd के हर दूसरे प्रोग्राम की तरह रुकना होगा । यह किसी भी उपकरण को नहीं हटाता है /devmount --move /dev /root/devमाउंटेड /devको वास्तविक रूट पर ले जाने के लिए उपयोग करें ।

जेंटू में एक इनट्रामाफ़्स गाइड और एक इनट्रैमफ़्स विकी पेज है जो अन्य चीजों के बीच udv का उल्लेख करता है। Initramfs एक फाइल सिस्टम छवि के बजाय एक cpio संग्रह का उपयोग करके initrd का आधुनिक उत्तराधिकारी है, और एक अलग प्रक्रिया इंटरफ़ेस के साथ (initrd पर /linuxrcबाहर निकलना चाहिए, जबकि initramfs पर वास्तविक जड़ से init /initहोना चाहिए exec); अधिकांश प्रणालियों ने इन दिनों स्विच किया है (भले ही फ़ाइल को अभी भी initrd कहा जा सकता है)।


आपके उत्तर के लिए धन्यवाद। मैं इस निष्कर्ष पर पहुंचा कि मैंने वास्तव में एक initrd के बजाय एक initramfs बनाया है। लेकिन मैं vblinuz कर्नेल का उपयोग करता हूं जो मुझे डेबियन लाइव सिस्टम से मिला है, क्या मुझे वास्तव में इसके लिए अपना कर्नेल संकलित करना चाहिए (इसलिए मुझे पता है कि लोडिंग हार्डड्राइव के लिए कौन से मॉड्यूल हैं), या एक प्रकार का न्यूनतम संस्करण है जो मैं बुनियादी मॉड्यूल के साथ कर सकता हूं ? मैं शायद नवीनतम udev डाउनलोड करूँगा और इसे संकलित करने और चलाने की कोशिश करूँगा।
कार्लिटो

@ कार्लिटो मैं पहले डेबियन कर्नेल के साथ प्रयास करने की सलाह देता हूं, क्योंकि अपने कर्नेल को संकलित करते समय एक आवश्यक ड्राइवर को भूलना एक सामान्य गलती है।
गिल्स एसओ- बुराई को रोकना '

लेकिन मुझे एक कैसे मिलेगा? मैंने अभी-अभी vmlinuz को डेबियन-बिज़नेसकार्ड.आईसो (शायद सबसे अच्छा विचार नहीं) में पाया। क्या मुझे सिर्फ उबंटू या डेबियन से प्राप्त मानक कर्नेल की नकल करनी चाहिए, और पूरे / काम / मॉड्यूल निर्देशिका?
कार्लिटो

@Carlito आपको कम से कम सभी मॉड्यूल की आवश्यकता होगी जो आपके हार्डवेयर के लिए आवश्यक हैं। सूची ब्राउज़ करने से आपको सभी आवश्यक चीजों को ढूंढना मुश्किल हो सकता है। lsmodएक कार्य प्रणाली पर चलाने के लिए आपको यह जानने का सबसे अच्छा तरीका है कि आपको क्या चाहिए । तो उन सभी के साथ शुरू करें, फिर समझदारी से अगर आपको अंतरिक्ष को बचाने की आवश्यकता है।
गिलेस एसओ-
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.