क्या लिनक्स कर्नेल को चलाने के लिए फ़ाइल सिस्टम की आवश्यकता है?


19

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

एक और इंजीनियर मुझसे असहमत है, लेकिन मैं यह साबित नहीं कर सकता कि यह सब (मेरे लिए अज्ञात) से परे है।

क्या इस सवाल का जवाब 'चल' की परिभाषा पर निर्भर करता है?


4
मुझे लगता है कि एक चल रहे कर्नेल को " useful exposure to the outside world
28 की

19
वर्ष दिमाग में लाता है रुका लिनक्स फ़ायरवॉल (2002 लगभग)
जेफ स्कालर

1
यदि आप कर्नेल में नया कोड जोड़ते हैं, तो आप कुछ भी कर सकते हैं। यदि आप नहीं कर सकते हैं, तो यह उस बिंदु तक ठीक है जहां यह चलाने की कोशिश करता है init(पहला उपयोगकर्ता-स्थान प्रक्रिया), और यह विफल हो जाएगा।
user253751

1
परिभाषित "रन" ...
Thorbjørn रावन एंडरसन

जवाबों:


27

यह एक अजीब सवाल है क्योंकि आप कर्नेल नहीं चलाते हैं जैसे आप एक प्रोग्राम चलाते हैं। कर्नेल कार्यक्रमों को चलाने के लिए एक मंच है। बेशक सेटअप और शटडाउन कोड है, लेकिन कर्नेल को अपने आप चलाना संभव नहीं है। हमेशा एक मुख्य "इनिट" प्रक्रिया होनी चाहिए। और कर्नेल घबरा जाएगा अगर यह वहां नहीं है। यदि init कर्नेल से बाहर निकलने की कोशिश करता है तो भी घबराहट होगी।

इन दिनों इनिट प्रक्रिया सिस्टमड की तरह है। यदि अन्यथा निर्दिष्ट नहीं है, तो कर्नेल शुरू होने वाले स्थानों की सूची से एक कार्यक्रम चलाने की कोशिश करेगा /sbin/init। यहाँ init Param देखें http://man7.org/linux/man-pages/man7/bootparam.7.html एक आपात स्थिति में आप लिनक्स को बूट कर सकते हैं init=/bin/bash। लेकिन ध्यान दें कि आप हमेशा फ़ाइल सिस्टम पर फ़ाइल को चलाने के लिए कैसे निर्दिष्ट करते हैं।

तो कर्नेल घबरा जाएगा यदि इसकी शुरुआत होती है तो इसमें कोई फाइल सिस्टम नहीं होता है क्योंकि एक के बिना इनिट को लोड करने का कोई तरीका नहीं है।

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


क्या ऐसी स्थिति नहीं है जहां कर्नेल हार्डवेयर को आरंभ करने की कोशिश करता है और एक ज्ञात फ़ाइल सिस्टम को लोड करता है (init params के माध्यम से कर्नेल में पारित नहीं होता है), फिर एक बहुत ही सीमित शेल (init = / bin / bash) में गिरता है? इसके अलावा, जब से आप / बिन / बैश लाते हैं, क्या कर्नेल के पास हमेशा वह न्यूनतम फ़ाइल सिस्टम उपलब्ध होगा, भले ही इसे अन्य .config विकल्पों के साथ बनाया गया हो जो संभावित रूप से इसे खत्म कर सकता है?
पीटर एल।

1
@PeterL। वह सीमा शेल initrd / initramfs से कुछ शेल है / जो कि कर्नेल के साथ बूट किया गया है, IIRC।
मुरु

3
ध्यान दें कि आप कर्नेल में initramfs (एक CPIO संग्रह जो एक ramfs या tmpfs फाइल सिस्टम में निकाला जाता है) बना सकते हैं । कि कर्नेल के रूप में गिना जाता है या नहीं, "फाइल सिस्टम की जरूरत है" आपके ऊपर है, क्योंकि इसका मतलब है कि आप कर्नेल को बूट कर सकते हैं और कर्नेल के अलावा और कुछ भी नहीं है (यदि थोड़ा सीमित है) सिस्टम। यह भी ध्यान दें कि, भले ही आप कर्नेल को एक init की आवश्यकता के लिए पैच नहीं करते हैं, यह अभी भी आंतरिक वर्चुअल फाइल सिस्टम बनाएगा जो कभी भी उजागर नहीं होते हैं।
वन

@forest सिस्टम को "सीमित" होने की ज़रूरत नहीं है - आप सिस्टमडिट और गनोम को अपने इनिटर्ड (सामान के साथ जो वास्तव में उपयोगी है ;-)) में पैक कर सकते हैं। Initramfs की एक सीमा थी (अभी भी?) है कि यह विस्तारित विशेषताओं का समर्थन नहीं कर रहा था - मैंने initrd cpio संग्रह में एक ext4 छवि को शामिल करके Android पर इसके आसपास काम किया था जो तब init.$DEV.rcस्क्रिप्ट से लूप डिवाइस के रूप में माउंट किया गया था ।
चाचा बिली

1
@IsmaelMiguel, nope, initramfs जैसा कि एक cpio संग्रह है। स्क्वैशएफएस एम्बेडेड फ़ाइल सिस्टम के लिए एक अच्छा विकल्प है, और एक एक initrd (बनाम एक initramfs) कर सकता है कि यह उपयोग करता है (शब्दों को अक्सर दूसरे शब्दों में उपयोग किया जाता है, लेकिन वे नहीं कर रहे हैं काफी एक ही बात), लेकिन यह लिनक्स unpacks में प्रारूप नहीं है इसके initramfs। (वास्तव में, एक स्क्वैशफुट छवि को बिना उपयोग किए जाने की आवश्यकता नहीं है, इससे पहले कि इसका उपयोग किया जा सके, यह ठीक से अनुक्रमित है)।
चार्ल्स डफी

16

इसका उत्तर इस बात पर निर्भर करता है कि क्या आप का शाब्दिक अर्थ बिना किसी फ़ाइल सिस्टम से है या यदि प्रश्न का आशय यह है कि इसे वास्तव में कैसे बताया गया है, उससे थोड़ा अलग है। प्रश्न की व्याख्या कैसे की जाती है, इसमें थोड़े बदलाव के उत्तर हैं:

  • बिना किसी ब्लॉक डिवाइस के लिनक्स चलाना पूरी तरह से संभव है और कुछ विशेष उपयोग के मामलों के लिए उपयोगी है।
  • किसी भी फाइल सिस्टम के बिना लिनक्स चलाना कर्नेल कोड के कुछ हिस्सों को फिर से लिखने की आवश्यकता है और यह एक उपयोगी प्रयास होने की संभावना नहीं है।
  • किसी भी फाइल डिस्क्रिप्टर का उपयोग किए बिना लिनक्स चलाना बहुत सारे प्रयासों की आवश्यकता है। मुझे पूरा यकीन है कि यह प्रयास के लायक नहीं होगा।

फ़ाइल सिस्टम के बिना कार्य प्रणाली बनाने के लिए आपको कर्नेल कोड के कुछ हिस्सों को फिर से लिखना होगा:

  • हर थ्रेड में रूट डायरेक्टरी और करंट वर्किंग डायरेक्टरी होती है जो किसी न किसी फाइल सिस्टम की ओर इशारा करती है।
  • प्रोग्राम को execveसिस्टम कॉल द्वारा शुरू किया जाता है जिसे एक फाइल सिस्टम से एक निष्पादन योग्य की आवश्यकता होती है।
  • कर्नेल बूट प्रक्रिया के दौरान एक मेमोरी आधारित फाइल सिस्टम बनाता है।

एक प्रोग्राम को शुरू करने के बाद execveइसका उपयोग करना संभव है इसके लिए निष्पादन योग्य को अनमैप करना जिससे यह शुरू किया गया था, हालांकि ऐसा करने के लिए बिना इसे तुरंत क्रैश करने के लिए पहले एक निष्पादन योग्य मेमोरी मैपिंग बनाना होगा जो फ़ाइल द्वारा समर्थित नहीं है, और इसे शुरू करने से पहले कुछ उपयोगी कोड के साथ इसे निष्पादित करना होगा और निष्पादन योग्य को अनमैप करना होगा।

इस प्रकार एक रनिंग यूजर मोड प्रोग्राम एक ऐसी स्थिति में मौजूद हो सकता है, जिसमें फाइलों द्वारा समर्थित कोई मेमोरी मैपिंग नहीं है और यह फाइलों द्वारा समर्थित सभी फाइल डिस्क्रिप्टर को बंद कर सकता है। यह रूट डायरेक्टरी और वर्तमान वर्किंग डायरेक्टरी को रोक नहीं सकता है, लेकिन यह इनसे बच सकता है।

इस अवस्था में हालांकि आप प्रोग्राम के तहत फाइल सिस्टम को चीरने के लिए कर्नेल कोड लागू कर सकते हैं और इसे चालू रख सकते हैं, लेकिन यह उपयोगी नहीं है। और फ़ाइल सिस्टम का उपयोग करने के एक मध्यवर्ती राज्य के माध्यम से जाने के बिना उस अंतिम स्थिति में प्रवेश करना किसी भी उपयोगी लाभ के लिए और भी अधिक काम आने वाला है।

कुछ विशेष उपयोग के मामलों के लिए एक उपयोगी सेटअप

ब्लॉक उपकरणों के उपयोग से बचना उपयोगी हो सकता है। बूट के दौरान कर्नेल एक मेमोरी फाइल सिस्टम बनाता है, और यह cpioनिष्पादित करने से पहले एक संग्रह से सामग्री के साथ उस फाइल सिस्टम को भी पॉप्युलेट कर सकता है init। इस तरह आप किसी सिस्टम को बिना किसी ब्लॉक डिवाइस के मेमोरी सिस्टम फाइल से पूरी तरह से चला सकते हैं।

यह उन प्रणालियों के लिए उपयोगी हो सकता है जहां आप किसी भी राज्य को संरक्षित नहीं करना चाहते हैं और सिस्टम को रिबूट करने पर साफ स्लेट से शुरू करना चाहते हैं।

बेशक कर्नेल और cpio संग्रह को किसी भी तरह से मेमोरी में मौजूद होना चाहिए, इससे पहले कि कर्नेल को नियंत्रण दिया जाए। उन्हें कैसे मिला कि बूट लोडर के लिए एक नौकरी है। बूट लोडर को ब्लॉक डिवाइस से लोड किया जा सकता था, भले ही अंतिम रनिंग सिस्टम ब्लॉक डिवाइस का उपयोग नहीं करता हो। लेकिन बूट लोडर के लिए नेटवर्क पर बूट करके उदाहरण के लिए ब्लॉक डिवाइस का उपयोग किए बिना कर्नेल और cpio संग्रह प्राप्त करना संभव है।


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

2
@PeterL। हां, यदि आप कुछ भी नहीं लिखते हैं तो लिनक्स को फाइल सिस्टम की आवश्यकता होगी। जब लोग लिनक्स के लिए एक फाइल सिस्टम के बिना व्यावहारिक उपयोग के बारे में बात करते हैं, तो वे आमतौर पर एक ब्लॉक डिवाइस द्वारा समर्थित लोगों का उल्लेख करते हैं और आप एक ब्लॉक डिवाइस द्वारा समर्थित फाइल सिस्टम के बिना लिनक्स चला सकते हैं। आपके पास अभी भी कुछ प्रकार की फ़ाइल प्रणाली होगी।
केस्परड

3

लिनक्स में, लगभग हर डिवाइस एक फाइल है , इसलिए इसे चलाने के लिए आपके पास एक फाइल सिस्टम होना चाहिए।


8
लेकिन निश्चित रूप से डिवाइस ड्राइवर कर्नेल के अंदर मौजूद होते हैं, भले ही कोई डिवाइस फ़ाइल उन्हें इंगित करती हो या नहीं।
फिलिप कपलिंग

6
हर डिवाइस एक फाइल नहीं है। नेटवर्क इंटरफेस ( eth0, wlan0आदि) उदाहरण के लिए, नहीं कर रहे हैं।
रुस्लान

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

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

1
बहुत अच्छा तर्क: या तो वहाँ devfs है, जो कि परिभाषा के अनुसार एक फाइलसिस्टम है, या कोई भी devfs नहीं है, जिस स्थिति में आपको डिवाइस नोड्स को होस्ट करने के लिए फाइल सिस्टम की जरूरत है ...
pmf

-1

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

हां, लिनक्स डिफ़ॉल्ट रूप से फाइल सिस्टम तक पहुंच की उम्मीद करता है। नहीं, एक संशोधित कर्नेल निश्चित रूप से उपयोगी फ़ाइल w / o किसी भी फ़ाइल सिस्टम को करने के लिए बनाया जा सकता है। लिनक्स डब्ल्यू / ओ फाइल सिस्टम का व्यावहारिक उपयोग आईएमओ काफी सीमित है, लेकिन शून्य नहीं है। FWIW, अतीत में कई वास्तविक समय की गुठली आरटी अनुप्रयोगों के रूप में एक ही नाम-स्थान और बाइनरी में बनाई गई थी।

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