अपडेट: मार्च 2013 में लेख और लिपियों को अपडेट किया गया था (5 साल बीत चुके हैं, पुरानी स्क्रिप्ट वर्तमान से बहुत भिन्न नहीं हैं, लेकिन वर्तमान कोड का अध्ययन करना बेहतर है, और सिस्टम बूट तर्क पिछले कुछ वर्षों में बदल गया है - अन्यथा udv काम करता है, नया सिंथेटिक एफएस दिखाई दिया है) जैसे devtmpfs,
/var/run
स्थानांतरित
/run
to
/run
, etc)।
जब मैंने लिनक्स में महारत हासिल की, तो मुझे बहुत दिलचस्पी थी कि सिस्टम बूट होने पर क्या होता है। बूट प्रक्रिया को समझने की कोशिश ने मुझे बूट स्क्रिप्ट (
/etc/inittab, /etc/rc*, /etc/init.d/*, ...
) और उनके कॉन्फ़िगरेशन (
/etc/sysconfig/*, /etc/cond.f/*, ...
) के स्रोतों तक
/etc/inittab, /etc/rc*, /etc/init.d/*, ...
/etc/sysconfig/*, /etc/cond.f/*, ...
)। यह इन लिपियों के गंभीर आकार और जटिलता को ध्यान देने योग्य है - उन्हें पता लगाने में बहुत समय लगा। लेकिन उन दिनों में, मुझे पूरा विश्वास था कि डाउनलोड करना एक जटिल प्रक्रिया थी, और बूट स्क्रिप्ट के आकार और जटिलता को उचित ठहराया गया था।
जब रेडहैट को आखिरकार मुझे (2001) मिला, तो मैंने अपना
एलएफएस आधारित वितरण बनाने का फैसला किया। मेरे वितरण के लिए मुझे स्वयं बूट स्क्रिप्ट विकसित करनी पड़ी, और फिर सच्चाई स्पष्ट हो गई: बूट प्रक्रिया में कुछ भी जटिल नहीं है!
अपने वितरण (PoWeR लिनक्स) पर 2.5 साल तक काम करने के बाद, मैं Gentoo में चला गया (मेरे पास गुणवत्ता के लिए पर्याप्त समय नहीं था)। जेंटू बूट स्क्रिप्ट सीखने के बाद, मैं भयभीत था! उनका आकार और जटिलता पुराने रेडहैट से भी अधिक थी। एक विस्तृत अध्ययन के बाद, कारण स्पष्ट हो गया: बूट स्क्रिप्ट का एक ही सेट लाइवसीडी और नियमित प्रणाली दोनों के लिए उपयोग किया गया था - इस तरह के एक सार्वभौमिक राक्षस। इसलिए जब मैंने Gentoo पर स्विच किया, तो मैंने PoWeR लिनक्स से बूट स्क्रिप्ट लेने का फैसला किया और मानक Gentoo वाले का उपयोग नहीं किया (यानी, मैं केवल Gentoo से पोर्टेज का उपयोग करता हूं)। और तब से, 4 और वर्षों के लिए, ये स्क्रिप्ट मेरे होम वर्कस्टेशन और रिमोट सर्वर के एक समूह पर काम कर रही है।
की विशेषताओं
लिपियों का आकार (सभी एक साथ) 308 रेखाएँ, 8KB: $ wc 1 3 lib.sh 201 769 5855 1 78 272 1726 3 29 118 771 lib.sh 308 1159 8352
विपक्ष:
- सभी एक फ़ाइल में - अनुप्रयोगों को अपडेट करते समय इस एप्लिकेशन के प्रारंभ कोड को स्वचालित रूप से अपडेट करना लगभग असंभव है। उदाहरण के लिए, जब ALSA अपडेट किया जाता है, तो पैकेज केवल
/etc/init.d/alsasound, /etc/conf.d/alsasound, /etc/modules.d/alsa
फ़ाइलों को बदल सकता है। और मेरे मामले में, व्यवस्थापक को पेन के /etc/runit/1
को संपादित करने की आवश्यकता होगी। - दुनिया में हर चीज का कोई समर्थन नहीं है। उदाहरण के लिए, मैं RAID और LVM का उपयोग नहीं करता हूं - इसलिए आपको उन्हें स्वयं प्रारंभ करने के लिए कमांड जोड़ने की आवश्यकता होगी।
- आपको इन लिपियों का स्वतंत्र रूप से समर्थन करने की आवश्यकता होगी। Gentoo को अपडेट करते समय, मैं आमतौर पर (अप्रयुक्त)
/etc/init.d/*
स्क्रिप्ट में परिवर्तन देखता हूं और यदि कुछ महत्वपूर्ण परिवर्तन होता है, तो मैं अपनी स्क्रिप्ट को अपडेट करता हूं। लेकिन, व्यवहार में, इस तरह के परिवर्तनों की आवश्यकता लगभग हर दो साल में उठती है।
पेशेवरों:
- सभी एक छोटी फ़ाइल में - स्क्रिप्ट और उनके कॉन्फ़िगरेशन के लिए एक गुच्छा देखने की आवश्यकता नहीं है जहां आप कॉन्फ़िगर करते हैं कि आपको क्या चाहिए; आप सिस्टम की सभी बुनियादी सेटिंग्स को जल्दी और आसानी से देख सकते हैं।
- घरेलू कंप्यूटर और सर्वर पर 11.5 साल तक मुझे और मेरे दोस्तों की जरूरत की हर चीज का समर्थन है।
- लिनक्स आरंभीकरण प्रक्रिया की खोज के लिए आदर्श। आप वास्तविक बुनियादी लिनक्स कमांड के साथ काम करते हैं, जो सभी वितरणों में समान हैं, और स्क्रिप्ट के साथ नहीं और आपके वितरण के लिए विशिष्ट कॉन्फ़िगर करता है।
- सिस्टम लोडिंग को गति दें। मेरी घरेलू मशीन 11 सेकंड में सिंगल यूजर मोड (गेटी, सिसलॉग, क्लॉज, एकपीड, डेंस्कैचे, टिनिडन, जीपीएम) के साथ 6 कंसोल में लोड होती है। मैंने इनिटंग शैली में समानांतर लोडिंग के साथ प्रयोग किया - लिपियों की जटिलता और अनावश्यक प्रक्रियाओं की पीढ़ी के कारण प्रभाव बल्कि नकारात्मक है। Initng पारंपरिक, ब्लोटेड लिपियों की लोडिंग को तेज करने के लिए अच्छा है जो कई अनावश्यक क्रियाओं को करते हैं, और मेरे मामले में तेजी लाने के लिए कुछ भी नहीं है। :)
छोटे आकार के बावजूद, ये स्क्रिप्ट न केवल मज़बूती से और जल्दी से सिस्टम को लोड करते हैं, बल्कि कई विशेषताओं का भी समर्थन करते हैं जो व्यवस्थापक के जीवन को आसान बनाते हैं:
- निष्पादन योग्य आदेशों को प्रकार द्वारा ब्लॉक में वर्गीकृत किया जाता है। बूट प्रक्रिया के दौरान, ब्लॉक के नाम प्रदर्शित किए जाते हैं, इस बारे में जानकारी के साथ कि क्या ब्लॉक कमांड निष्पादित करते समय त्रुटियां थीं।
- यदि कमांड ब्लॉक के निष्पादन के दौरान त्रुटियां थीं, तो विस्तृत जानकारी इस ब्लॉक के आदेशों और प्रदर्शित होने वाली त्रुटियों पर दिखाई देती है, जिसके बाद सिस्टम किसी भी बटन के लिए 5 सेकंड इंतजार करता है ताकि बैश शुरू हो सके और मैन्युअल रूप से त्रुटियों को ठीक कर सके। बैश से बाहर निकलने के बाद, यह या तो लोड जारी रखने या रिबूट करने का सुझाव दिया जाता है। यदि आप कुछ भी क्लिक नहीं करते हैं, तो डाउनलोड जारी रहेगा।
- स्क्रीन को लोड और डिसएबल करते समय प्रदर्शित होने वाली हर चीज के लॉग (कमांड ब्लॉक के नाम और उसमें होने वाली त्रुटियों पर जानकारी) को फाइलों
/var/log/boot, /var/log/shutdown
में संग्रहीत किया जाता है। इसके लिए धन्यवाद, आप देख सकते हैं कि रिमोट सर्वर पर डाउनलोड / शटडाउन कैसे हुआ।
बूट पर प्रदर्शित संदेशों का उदाहरण
+ UDEV
+ मॉड्यूल
+ SYSCTL
+ MTAB
- माउंट
++ स्वपन-ए
++ गलत
बाहर निकलें कोड: 1
++ माउंट-नाटोका, नोनफ्स, नोप्रोक्स, नॉनकॉफ्स, नोसंबफ्स, नोशम
... खोल खोलने के लिए 5 सेकंड में किसी भी कुंजी को दबाएं ...
+ CLEANTMP
+ RANDOMSEED
+ HWCLOCK
+ सेंसर
+ LOADKEYS
+ ध्वनि
+ HOST_NAME
+ उन्नत करें
+ नेटवर्क
+ रन
+ DMESG
RUNIT
SysVinit के बजाय, मैं
Runit से बूट करने के लिए उपयोग करता
हूं । रनिट
/etc/inittab
समर्थन नहीं करता है, इसके बजाय, यह एक सरल योजना का उपयोग करता है:
- लोड करते समय, स्क्रिप्ट
/etc/runit/1
। उनका कार्य प्रणाली को पूरी तरह से शुरू करना है। - स्क्रिप्ट
/etc/runit/1
पूरा होने पर, स्क्रिप्ट /etc/runit/2
लॉन्च किया जाता है, जिसे सभी आवश्यक सेवाओं (syslog, getty, ssh, apache, ...) को चलाना चाहिए। - जब उपयोगकर्ता सिस्टम को बंद / रिबूट करता है, तो स्क्रिप्ट
/etc/runit/3
जिसे शटडाउन के लिए सिस्टम तैयार करना चाहिए (सभी प्रक्रियाओं को समाप्त करें, अनमाउंट डिस्क, आदि)।
यदि वांछित है, तो आप उसी शैली में काम करने के लिए SysVinit को कॉन्फ़िगर कर सकते हैं:
SysVinit से रनिंग / etc / runit / {1,2,3}: / etc / inittab
आईडी: 3: initdefault:
rc :: bootwait: / etc / runit / 1
l0: 0: Wait: / bin / sh -c '/ etc / runit / 3; निष्पादित / sbin / पड़ाव '
l3: 3: एक बार: / etc / runit / 2
l6: 6: प्रतीक्षा करें: / बिन / श-सी '/ आदि / रनिट / 3; निष्पादित / sbin / रिबूट '
ca: 12345: ctrlaltdel: / sbin / shutdown -r अब
सेवाएं
सभी सेवाओं को शुरू करने के लिए (getty, syslog, mysql, आदि) मैं एक ही रनिट का उपयोग करता हूं (वास्तव में, यह डेमोंटोलस का सिर्फ थोड़ा बेहतर संस्करण है)। लेकिन यह एक अलग विषय है, इसलिए मैं स्पष्ट करूंगा कि इस लेख में सेवाओं को लॉन्च करने के लिए कोई स्क्रिप्ट नहीं है, केवल सिस्टम का इनिशियलाइज़ेशन / शटडाउन है।
स्रोत कोड
सहायक कार्य: /etc/runit/lib.sh
Startup: / etc / runit / 1
शटडाउन: / etc / runit / 3