वास्तव में init क्या करता है?


43

मैं एक linux distro बना रहा हूं और अब मुझे एक init प्रोग्राम की आवश्यकता है। मैं वास्तव में अच्छी तरह से सी कोड कर सकता हूं और मुझे लिनक्स के बारे में काफी कुछ पता है (बहुत ज्यादा नहीं है लेकिन मैं 4 साल से विकास के लिए आर्क लिनक्स का उपयोग कर रहा हूं), इसलिए मैंने सोचा कि मुझे सी में अपनी खुद की मूल इनइट स्क्रिप्ट लिखने की कोशिश करनी चाहिए। बस सोच रहा था, एक सरल शेल के लिए सिस्टम को सेट करने के लिए कौन से कार्य init करते हैं? (जब मैं पूछता हूं कि "init क्या करता है?", मुझे पता है कि init क्या है और इसके लिए क्या है। मैं अभी यह नहीं जानता कि यह क्या कार्य करता है।)

मैं कोड की आवश्यकता नहीं है और मैं संभवतः भी नहीं है बुनियादी आज्ञाओं की जरूरत है, लेकिन मैं करना आदेश है कि वे में चलाए जा रहे हैं की जरूरत है।


1
Perl, awk, bash, (t) csh, native binaries सहित SysV- स्टाइल इनिट स्क्रिप्ट्स के लिए आपको जो भी दुभाषिया पसंद है, उसका उपयोग कर सकते हैं, ... देशी बैश, सामान्य रूप से उपयोग किया जाता है, क्योंकि यह लगभग उसी सिस्टम पर उपलब्ध होने की गारंटी है, जहां कुछ स्क्रिप्ट हैं। बूट प्रक्रिया में प्रासंगिक बिंदु पर तैनात, इसलिए नहीं कि SysVinit और बैश के बीच कुछ युग्मन है। SysVinit अनुबंध को परिभाषित करता है और प्रत्येक स्क्रिप्ट किसी भी तरह से उस अनुबंध को लागू करने के लिए स्वतंत्र है जो उसके डेवलपर फिट देखता है।
बजे एक CVn

जवाबों:


53

सिस्टम 5 initआपको कहानी का केवल एक छोटा सा हिस्सा बताएगा।

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

परंपरा वास्तव में ऐसा नहीं है कि ऐसे लोग इसे शुरुआत के लिए कहते हैं। सिस्टम 5 initऔर सिस्टम 5 rcसे एटी एंड टी यूनिक्स सिस्टम 5 की तारीख, जो पहले यूनिक्स के बाद लगभग था जैसा कि हम अब लिनक्स (लिनक्स) के पहले संस्करण के बाद कह रहे हैं।

प्रथम संस्करण यूनिक्स केवल था init। यह नहीं था rc। 1 संस्करण असेंबली भाषा init( जिसका कोड बहाल किया गया है और वॉरेन टोमी एट अल द्वारा उपलब्ध कराया गया है। ) 12 gettyप्रक्रियाओं से सीधे जुड़ा हुआ है और इसका जवाब दिया गया है, एक अंतर्निहित तालिका से 3 हार्डवेयर्ड फाइल सिस्टम को माउंट किया गया है, और सीधे एक घर की निर्देशिका से एक कार्यक्रम चलाया है। उपयोगकर्ता नाम melgettyतालिका कार्यक्रम छवि में सीधे भी था।

UNIX सिस्टम 5 के बाद यह एक और दशक था कि तथाकथित "पारंपरिक" लिनक्स इनिट सिस्टम आया था। 1992 में, मिकेल वैन स्मुरेनबर्ग (फिर से) ने एक लिनक्स init+ rcऔर उनके संबंधित उपकरण लिखे , जिन्हें लोग अब "सिस्टम 5 init" के रूप में संदर्भित करते हैं , भले ही यह वास्तव में यूनिक्स सिस्टम 5 से सॉफ्टवेयर नहीं है (और बस नहीं है) init)।

सिस्टम 5 init/ rcशुरू करने के लिए सबसे अच्छी जगह नहीं है, और यहां तक ​​कि अगर कोई सिस्टमड के ज्ञान पर जोड़ता है जो कि जानने के लिए आधे से भी कवर नहीं करता है। इनिट सिस्टम डिज़ाइन (लिनक्स और बीएसडी के लिए) के क्षेत्र में बहुत काम हुआ है जो पिछले दो दशकों में हुआ है। सभी प्रकार के इंजीनियरिंग निर्णयों पर चर्चा की गई है, बनाया गया है, डिज़ाइन किया गया है, लागू किया गया है, और इसका अभ्यास किया जाता है। वाणिज्यिक यूनियनों ने भी बहुत कुछ किया।

अध्ययन और सीखने के लिए मौजूदा प्रणाली

यहाँ उन दो के अलावा कुछ प्रमुख init सिस्टमों की एक अधूरी सूची दी गई है , और एक या दो उनके (कई) मुख्य हैं:

  • जोआचिम निल्सन के परिमित एक अधिक मानव-पठनीय विन्यास फ़ाइल का उपयोग करने का मार्ग गया।
  • फेलिक्स वॉन लीटनर का मिनिट एक फाइलसिस्टम- -द-डेटाबेस कॉन्फ़िगरेशन सिस्टम, छोटे मेमोरी फुटप्रिंट्स के लिए चला गया, और शुरू होने वाली चीजों के बीच निर्भरता को शुरू / रोक initदेता है।
  • गेरिट पपी के रनर के लिए चला गया जो मैंने पहले केवल चार शेल स्क्रिप्ट के दृष्टिकोण के रूप में वर्णित किया है
  • InitNG पर निर्भरताएं, लक्ष्य नाम, एकाधिक कॉन्फ़िगरेशन फ़ाइलें, और अधिक लचीली कॉन्फ़िगरेशन सिंटैक्स के साथ पूरी प्रक्रिया के लिए और अधिक चाइल्ड प्रक्रियाओं के लिए सेटिंग्स है।
  • अपस्टार्ट एक पूर्ण रीडिज़ाइन के लिए गया, सिस्टम को सेवाओं और अन्योन्याश्रितियों के रूप में नहीं, बल्कि घटनाओं और नौकरियों के रूप में उनके द्वारा ट्रिगर किया गया।
  • नोश के डिजाइन में सेवा प्रबंधन के सभी को शामिल करना शामिल है (यहां तक ​​कि gettyस्पॉइंग और ज़ोंबी रीपिंग सहित ) एक अलग सेवा प्रबंधक में, और सिर्फ ऑपरेटिंग-सिस्टम-विशिष्ट "एपीआई" डिवाइस / सिम्लिंक / निर्देशिका और सिस्टम ईवेंट को संभालना।
  • पापीत एक बहुत ही सरल स्वभाव है। यह /bin/rc.initप्रोग्राम, माउंट फाइलसिस्टम इत्यादि को शुरू करना किसका काम है, इसके लिए आप इसका उपयोग कर सकते हैं, जैसे कि आप मिनिर्क जैसे किसी चीज़ का उपयोग कर सकते हैं ।

इसके अलावा, लगभग 10 साल पहले, डेमोनटूल उपयोगकर्ताओं और svscan# 1 प्रक्रिया के रूप में उपयोग करने वाले अन्य लोगों के बीच चर्चा हुई थी , जिसके कारण प्रक्रिया 1 अध्ययन के रूप में पॉल जर्क के स्क्वैस्कन जैसी परियोजनाओं का नेतृत्व किया गया था , गेरिट पपी के विचारों और 1 की प्रक्रिया के रूप में लॉरेंट बर्कॉट के स्वानस्कन

जो हमें # 1 कार्यक्रमों को किस प्रक्रिया में लाता है।

# 1 कार्यक्रम क्या प्रक्रिया करते हैं

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

कई चीजें हैं जो विभिन्न ऑपरेटिंग सिस्टम गुठली और अन्य कार्यक्रमों की प्रक्रिया # 1 की मांग करती हैं जो एक बस नहीं बच सकती हैं।

लोग आपको बताएंगे कि fork()अनाथ प्रक्रियाओं के माता-पिता के रूप में चीजें और अभिनय करना प्रक्रिया # 1 का प्रमुख कार्य है। विडंबना यह है कि यह असत्य है। अनाथ प्रक्रियाओं के साथ काम करना (हाल ही में लिनक्स कर्नेल के साथ, जैसा कि https://unix.stackexchange.com/a/177361/5132 पर समझाया गया है ) एक हिस्सा है जो एक प्रक्रिया से काफी हद तक बाहर हो सकता है # 1 अन्य प्रक्रियाओं में, जैसे कि एक समर्पित सेवा प्रबंधक । ये सभी सेवा प्रबंधक हैं, जो # 1 प्रक्रिया को पूरा करते हैं:

  • IBM AIX srcmstrप्रोग्राम, सिस्टम रिसोर्स कंट्रोलर
  • runsvdirरनर से गेरिट पपी
  • डैनियल जे बर्नस्टीन है svscandaemontools से, एडम सैम्पसन का svscanसे freedt , ब्रूस Guenter के svscandaemontools-दोहराना से, और लॉरेंट Bercot के s6-svscanसे S6
  • वेन मार्शल के perpdपेर से
  • सोलारिस 10 में सेवा प्रबंधन सुविधा
  • service-managernosh से

इसी तरह, जैसा कि https://superuser.com/a/888936/38062 पर बताया गया है , पूरे /dev/initctlविचार को प्रक्रिया 1 के पास कहीं भी होने की जरूरत नहीं है। विडंबना यह है कि यह अत्यधिक केंद्रीकृत प्रणाली है जो प्रदर्शित करता है कि इसे प्रक्रिया # 1 से बाहर ले जाया जा सकता है।

इसके विपरीत, के लिए अनिवार्य चीजें init, कि लोगों को आम तौर पर उनके ऑफ-द-टॉप ऑफ सिर डिजाइनों में भूल जाते हैं, इस तरह के हैंडलिंग बातें हैं SIGINT, SIGPWR, SIGWINCH, और इसके आगे गिरी से भेजे गए और विभिन्न सिस्टम स्थिति परिवर्तन भेजे गए अनुरोध को लागू करने उन प्रोग्रामों से जो "जानते हैं" कि # 1 प्रक्रिया करने के लिए कुछ निश्चित संकेतों का मतलब कुछ चीजों से है। (उदाहरण के लिए: जैसा कि https://unix.stackexchange.com/a/196471/5132 पर बताया गया है , बीएसडी टूलसेट "जानते हैं" SIGUSR1जिसका एक विशिष्ट अर्थ है।)

एक बार आरंभिक और अंतिमकरण कार्य भी होते हैं जिन्हें कोई नहीं कर सकता है, या न करने से बहुत पीड़ित होगा, जैसे "एपीआई" फाइल सिस्टम को बढ़ाना या फाइल सिस्टम कैश को फ्लश करना।

"एपीआई" फाइलसिस्टम के साथ काम करने की मूल बातें initरोम के 1 संस्करण के संचालन के लिए अलग-अलग हैं। यूनिक्स: एक कार्यक्रम में हार्डवर्क की गई जानकारी की एक सूची है, और एक बस mount()सूची में सभी प्रविष्टियों की है। आप इस तंत्र को सिस्टम में BSD (sic!) के रूप में विविध रूप में पाएंगे init, nosh के माध्यम system-managerसे systemd में।

"एक साधारण शेल के लिए सिस्टम सेट करें"

जैसा कि आपने देखा है, init=/bin/sh"एपीआई" फाइलसिस्टम को माउंट नहीं किया गया है, बिना किसी कैश फ्लश के एक असमान फैशन में क्रैश हो जाता है जब एक प्रकार exit( https://unix.stackexchange.com/a/195978/5132 ), और सामान्य रूप से इसे छोड़ देता है (सुपर) उपयोगकर्ता मैन्युअल रूप से उन कार्यों को करता है जो सिस्टम को न्यूनतम रूप से उपयोग करने योग्य बनाते हैं।

यह देखने के लिए कि प्रक्रिया # 1 कार्यक्रमों में वास्तव में क्या करने के अलावा कोई विकल्प नहीं है, और इस प्रकार आपको अपने बताए गए डिज़ाइन लक्ष्य के लिए एक अच्छे पाठ्यक्रम पर सेट किया गया है, आपका सबसे अच्छा विकल्प जेरिट पपीट के रन, फेलिक्स डॉन के संचालन में ओवरलैप्स को देखना है। लीटनर के मिनिट और system-managerनोश पैकेज से कार्यक्रम। पूर्व दो शो न्यूनतम होने का प्रयास करते हैं, फिर भी उस सामान को संभालते हैं जिससे बचना असंभव है।

उत्तरार्द्ध उपयोगी है, मैं सुझाव देता हूं, system-managerकार्यक्रम के लिए इसकी व्यापक मैनुअल प्रविष्टि के लिए , जो यह बताता है कि "एपीआई" फाइलसिस्टम माउंट किए गए हैं, क्या आरंभीकरण कार्य चलाए जाते हैं, और कौन से सिग्नल संभाले जाते हैं; सिस्टम द्वारा डिजाइन में सिस्टम मैनेजर ने केवल तीन अन्य चीजें (सेवा प्रबंधक, एक सहायक लकड़हारा, और राज्य परिवर्तन चलाने का कार्यक्रम) स्पॉन किया है और केवल प्रक्रिया # 1 में अपरिहार्य है।


3
बहुत बढ़िया जवाब और बहुत जानकारीपूर्ण। लेकिन मैं खुद से पूछ रहा हूं कि इस बड़ी तस्वीर में OSX कहां है launchd। कभी-कभी लोग पूरी तरह से भूल जाते हैं कि OSX एक महान (महान) बड़े * निक्स परिवार का सदस्य है।
दावुलपी

4

सिस्टम वी init डेबियन पर (अन्य वेरिएंट और विविधताएं हैं) निम्न कार्य करता है:

  • रनलेवल में प्रवेश करते समय, यह /etc/rcX.d/S*अल्फ़ान्यूमेरिक ऑर्डर में स्क्रिप्ट को कॉल करता है , जहां Xरनवेल होता है। ये स्क्रिप्ट रनले को सेटअप करना चाहिए। विशिष्ट सेटअप डेमॉन शुरू कर रहा है और उस रन स्तर के लिए सेटअप कार्य करता है। रनवे में प्रवेश करते समय यह एक बार की गई बात है।
  • एक रन स्तर में, यह डेमॉन शुरू करता है जो /etc/inittabउस रन स्तर के दौरान सक्रिय होने की आवश्यकता के रूप में सूचीबद्ध होता है। यदि वे डेमन चलाना बंद कर देते हैं, तो यह उन्हें पुनः आरंभ करता है। जब आप अपने द्वारा प्रबंधित किसी भी डेमॉन को प्राप्त कर सकते हैं init, तो कम से कम आप कुछ चाहते हैं gettyताकि आप लॉग इन कर सकें, gettyएक लॉग पूरा initहोने के बाद बाहर निकलता है, फिर इसे फिर से शुरू करता है, एक नया लॉगिन प्रॉम्प्ट प्रदान करता है।
    • यदि डेमॉन बहुत कम समय में कई बार पुनरारंभ होता है, तो यह थोड़ी देर के लिए इसे पुनरारंभ करने का प्रयास करना बंद कर देता है।
    • सिर्फ इसलिए कि कुछ को किकऑफ स्क्रिप्ट द्वारा शुरू किया गया था जब रन स्तर में प्रवेश करना initस्वचालित रूप से इसे चालू रखने का प्रयास नहीं करता है । आपको इसे अलग से निर्दिष्ट करने की आवश्यकता है /etc/inittab
  • रनलेवल से बाहर निकलते समय, यह /etc/rcX.d/K*अल्फ़ान्यूमेरिक ऑर्डर में स्क्रिप्ट को कॉल करता है , जहां Xरनवेल होता है। शटडाउन या रिबूट को लागू करने का एक तरीका उन घटनाओं के लिए एक रनवे को परिभाषित करना और अंतिम कार्य haltया rebootकमांड निष्पादित करना है ।
  • यह कुछ घटनाओं, जैसे कि बिजली की घटनाओं या Ctrl-Alt-Del के जवाब में निष्पादन योग्य कॉल करेगा।
  • यह एक सॉकेट पर सुनता है, अगर यह कुछ संदेश प्राप्त करता है तो यह रनवे को बदल देगा।

इसलिए initयदि आप चाहें, तो आप अल्पविकसित सेवा प्रबंधक के रूप में उपयोग कर सकते हैं, लेकिन यह मुख्य कार्य है कि इन दिनों gettyउपलब्ध है ताकि उपयोगकर्ता लॉगिन कर सके, और रनलेवल बदलाव को किक कर सके।

मैं बस सोच रहा था, सिस्टम को एक साधारण शेल के लिए सेट करने के लिए कौन से कार्य हैं?

जो तुम्हे चाहिये। डेबियन पर, प्रत्येक /etc/rcX.dनिर्देशिका में एक स्क्रिप्ट के लिए एक सहानुभूति है /etc/init.dऔर आप उन स्क्रिप्ट को पूरी तरह से अनुकूलित या निकाल सकते हैं। आदेश में एक के साथ एक स्क्रिप्ट पूर्ववर्ती द्वारा स्थापित है 00, 01आदि

यदि आप केवल शेल खोलना चाहते हैं तो आप (यानी कर्नेल कमांड लाइन के माध्यम से) एक -bविकल्प भी निर्दिष्ट कर सकते हैं । जब आप शेल से बाहर निकलते हैं, तो मर जाता है और जब मर जाता है, तो कर्नेल घबरा जाएगा।initinitinitinit


2

पूर्ण नंगे न्यूनतम जो कि init करना चाहिए, कम से कम एक अन्य कार्यक्रम चलाया जाता है और कभी बाहर नहीं निकलता है। यदि init सिस्टम क्रैश से बाहर निकलता है। मुझे लगता है कि एक दूसरे कार्यक्रम को चलाना भी कड़ाई से आवश्यक नहीं है, लेकिन यदि आप ऐसा नहीं करते हैं तो सिस्टम को करने के लिए हर उस चीज को करने के लिए जिम्मेदार होना पड़ेगा, या यह बहुत उपयोगी नहीं होगा।


1
मेरे पास बग्गी लिनक्स सिस्टम है जहां पीआईडी ​​1 दुर्घटनाग्रस्त हो गया लेकिन सिस्टम मूल रूप से चलता रहा। पीआईडी ​​1 का दुर्घटनाग्रस्त होना कितना बुरा हो सकता है यह कर्नेल संस्करण पर निर्भर करता है।
गिल्स एसओ- बुराई को रोकना '

1

init जो चाहो कर सकते हो

init एक अनियंत्रित निष्पादन योग्य है जिसे बूट प्रक्रिया के अंत में लिनक्स कर्नेल द्वारा बुलाया जाता है (और केवल एक ऐसा निष्पादन योग्य)।

यह आम तौर पर एक ईएलएफ निष्पादन योग्य के रूप में लागू किया जाता है, लेकिन यह एक शेल स्क्रिप्ट के साथ भी हो सकता है chmod +x: शेल स्क्रिप्ट के रूप में इनिट

Sysemd जैसी विशिष्ट कार्यान्वयन कॉन्फ़िगरेशन फ़ाइलों को पढ़ेगा, टोकन /etc/initrc, और फिर सिस्टम के विभिन्न पहलुओं को लागू करने के लिए उन कॉन्फ़िगरेशन के आधार पर उपयोगकर्तालैंड प्रक्रियाओं का एक गुच्छा फोर्क करेगा।

हालाँकि, यह पूरी तरह से कार्यान्वयन विशिष्ट है, और इसलिए आप विशिष्ट कार्यान्वयन को निर्दिष्ट किए बिना प्रश्न का उत्तर नहीं दे सकते हैं। उदाहरण के लिए, मैं एक ऐसी initप्रक्रिया के साथ खेल रहा हूं, जो शिक्षा उद्देश्यों के लिए बस एक rebootसिसकॉल करती है।

लिनक्स कर्नेल बस /initडिफ़ॉल्ट रूप से पथ पर निष्पादन योग्य दिखता है , लेकिन init=लिनक्स कर्नेल कमांड लाइन पैरामीटर द्वारा इसे ओवरराइड किया जा सकता है ।

के साथ खेलने के लिए एक शानदार तरीका initQEMU का उपयोग करना है, क्योंकि आप QEMU कमांड लाइन से QEMU तक कर्नेल कमांड लाइन पैरामीटर पास कर सकते हैं -append, और अपने डेस्कटॉप को डराने के बिना।

यहां मेरा न्यूनतम पूरी तरह से स्वचालित बिल्डरोट + क्यूईएमयू सेटअप है जो मामले को ध्वस्त करने के लिए अपने स्वयं के inits के साथ खेलने के लिए बहुत आसान बनाता है।


0

यदि आप मॉड्यूलर "एक काम करते हैं और इसे अच्छी तरह से करते हैं" सिद्धांत के लिए प्रतिबद्ध हैं, तो एक initकार्यक्रम प्रक्रियाओं को शुरू करना चाहिए।

प्रोसेस शुरू करें

कर्नेल को सफलतापूर्वक डिकम्प्रेस होने के बाद इसे निष्पादित किया जाना चाहिए, सभी प्रारंभिक प्रक्रियाओं को शुरू करने में शामिल सभी अल्पविकसित कार्यों की देखभाल करना, जो एक सिस्टम को संचालित करने की आवश्यकता होती है (जैसे / ड्राइव / फ़ेसटब में पाए जाने वाले बढ़ते ड्राइव, ऊपर लाने के इंटरफेस और जल्द ही)।

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

प्रक्रियाओं को रोकें

इसका मतलब यह है कि उस प्रक्रिया के मैन पेज के अनुसार प्रक्रियाओं को रोकना चाहिए (दूसरे शब्दों में, सिर्फ एक धुंधला नहीं है kill -9, यह प्रक्रिया को उस तरीके से नीचे लाना चाहिए जो इसे समाप्त करना चाहता है), ड्राइव को अनमाउंट करें, और अंततः अंतिम पावर डाउन कमांड जारी करें ।

संदर्भ

यह दूसरों के द्वारा कैसे किया जाता है, इसके लिए एक अच्छा संदर्भ स्लैकवेयर की /etc/rc.d स्क्रिप्ट को देखने के लिए है , और यह भी एक सरल init प्रणाली पर है जो पहले से ही मौजूद है, जैसे कि Ninit (minit का उत्तराधिकारी)। इसकी प्रक्रिया पर्यवेक्षण है (जिसका अर्थ है कि यदि एक प्रक्रिया मर जाती है, तो इसे पुन: लॉन्च किया जाता है), जो यकीनन इनिट का काम नहीं है, लेकिन यह अभी भी समझने के लिए काफी बुनियादी और सरल है, खासकर लेखक की नमूना लिपियों के माध्यम से।

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