सिस्टमैड एग्रेसिव आपातकालीन शेल व्यवहार को कैसे निष्क्रिय करें?


10

थोड़ी सी त्रुटि पर डिफ़ॉल्ट सिस्टमड एक आपातकालीन शेल पर गिरता है। उदाहरण के लिए, अगर fstab में से एक mounts किसी कारण से विफल हो जाता है, तो सिस्टम तुरंत अनबूटेबल हो जाता है। मैं दर्जनों विविध उत्पादन प्रणालियों का प्रबंधन करता हूं और मैंने इस व्यवहार को बहुत नुकसानदायक पाया है। (वास्तव में मुझे लगता है कि यह एक प्रमुख डिजाइन विफलता है, लेकिन यह एक व्यक्तिगत राय है)।

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

मुझे पता है कि systemd अपने आप * / etc / fstab से * .mount फाइलें उत्पन्न करता है और मैं छोटे x-systemd.device टाइमआउट के साथ नोफ़ेल विकल्प का उपयोग कर सकता हूं (या संबंधित .mount फ़ाइलों को स्वयं परिभाषित कर सकता हूं)। हालांकि यह मेरी समस्या का समाधान नहीं करेगा, मैं सिस्टम को अधिक लचीला बनाना चाहता हूं, हर बार "पैचिंग" एफस्टैब बहुत सुविधाजनक नहीं है और मुझे यकीन नहीं है कि कितने अन्य संभव "समस्याएं" मौजूद हैं जो मेरे सिस्टम को सिर्फ इसलिए अनसुनी कर देगा कुछ डेवलपर ने सोचा कि यह काफी महत्वपूर्ण है।

इसके अलावा, मैं अपनी मशीन पर नियंत्रण हासिल करना चाहूंगा और सिस्टम को यह तय नहीं करने दूंगा कि बूट प्रक्रिया को कुचलने के लिए क्या समस्या काफी गंभीर है। क्या यह संभव है?


वास्तविक समस्या btw क्या है? मुझे दो के बारे में पता है - ssh पर लॉगिन करने में सक्षम नहीं होने के कारण, और sulogin शीघ्र ही रूट को अनुमति देता है, sudo उपयोगकर्ताओं को नहीं, आपातकालीन मोड में पहुँच प्राप्त करने के लिए। उन नुकसानों को कवर करते हैं जिन्हें आपने झेला है?
sourcejedi

वास्तव में यह प्रणाली अधिक सुलभ होगी यदि उन दो सेवाओं को शुरू किया जाएगा, हाँ। वैकल्पिक रूप से सिस्टम को वह सब कुछ शुरू करना चाहिए जो पुराने SysV समय की तरह शुरू किया जा सकता है (आपातकालीन शेल द्वारा दर्दनाक मौत के बजाय त्रुटि लॉगगिन), और केवल घातक त्रुटि के मामले में शेल शुरू करें।
गोटेगुरु

जवाबों:


7

यह शाब्दिक रूप से केवल विफलताओं को माउंट करता है, यही आपको बदलने की आवश्यकता होगी।

तो आपके अनुरोध का पत्र उत्तर देने के लिए तुच्छ होगा। एक ड्रॉप-इन फ़ाइल बनाएँ:

# /etc/systemd/system/local-fs.target.d/nofail.conf

# Clear OnFailure= (set it to nothing)
[Unit]
OnFailure=

मेरा मानना ​​है कि इससे कोई नई समस्या नहीं होगी, इससे परे कि linux sysvinit इस आंशिक विफलता परिदृश्य की अनुमति देकर पहले से ही पीड़ित है।


हालाँकि आपने यह भी बताया है कि निर्दिष्ट ब्लॉक डिवाइस के उपलब्ध होने के लिए कब तक सिस्टम को इंतजार करना चाहिए। मैं इसे पूरा करने के लिए fstab जनरेटर के लिए एक प्रतिस्थापन प्रदान किए बिना, इसे कॉन्फ़िगर करने का कोई तरीका नहीं देख सकता। https://www.freedesktop.org/software/systemd/man/systemd.generator.html

यदि आप यहां कम मात्रा में व्यापक रूप से उपयोग किए जाने वाले कोड को डंप करते हैं, तो यह सिस्टम के लचीलेपन को बढ़ाने की संभावना नहीं है। मुझे लगता है कि मौजूदा fstab जनरेटर पैच करने के लिए निकटतम समाधान होगा। यह व्यापक रूप से जटिल नहीं है, मुझे संदेह है कि आप इसके साथ भाग सकते हैं / किसी भी महत्वपूर्ण बदलाव के साथ रख सकते हैं।

तकनीकी रूप से, यदि आपके वितरण में एक स्व-निहित mountallsysvinit स्क्रिप्ट थी, तो आप इसे हुक करने की कोशिश कर सकते हैं। लेकिन यह बूट प्रक्रिया को महत्वपूर्ण रूप से बदल देगा - यह वास्तव में एक कांटा के अधिक है। मैं उस दृष्टिकोण की सिफारिश नहीं करूंगा।


https://unix.stackexchange.com/a/393711/29483

यदि आप यूनिट फ़ाइलों के माध्यम से खोज करते हैं, तो बूट के वापस लौटने के लिए केवल कुछ ही तरीके हैं emergency.target। यह आमतौर पर होता है जब एक .mountस्थानीय फाइल सिस्टम के लिए एक इकाई विफल हो जाती है, जिससे local-fs.target विफल हो जाती है। या जब आपके initramfs रूट फाइल सिस्टम को माउंट करने में विफल रहता है, अगर आपके initramfs सिस्टमड का उपयोग करते हैं।

local-fs.targetहै OnFailure=emergency.target। और यह विफल हो जाता है क्योंकि स्थानीय फाइल सिस्टम के लिए इकाइयाँ स्वचालित रूप से स्थानीय- FAQ.target की सूची में शामिल हो जाती हैं (जब तक कि उनके पास न हो DefaultDependencies=no)।

$ systemctl show --property Requires local-fs.target
Requires=-.mount home.mount boot.mount boot-efi.mount

2
मुझे लगता है मुझे [Unit]\nOnFailure= अपने nofail.conf में डाल देना चाहिए । ऐसा लगता है कि /etc/systemd/system.conf (जेनेरिक डिफॉल्टआउटस्टार्ट विकल्प) के माध्यम से प्रतीक्षा समय को कॉन्फ़िगर करना संभव है। मेरे सिस्टम आमतौर पर काफी तेज होते हैं, 90 का दशक वैसे भी ओवरकिल लगता है। यह समाधान आशाजनक प्रतीत होता है।
गोटेगुरु

मेरे मामले में मैं सेट OnFailure=में /lib/systemd/system/local-fs.targetके बजाय /etc/systemd(एडब्ल्यूएस पर उबंटू 16.04)
ThiagoAlves

@ThiagoAlves आपको ऐसा नहीं करना चाहिए, यह सिस्टम अपग्रेड पर लिखा जाएगा। उत्तर में निर्देशों का पालन करें, या स्पष्टीकरण के लिए पूछें :-)।
sourcejedi

@sourcejedi मैंने जवाब देने की कोशिश की लेकिन यह मेरे लिए काम नहीं आया
थियागोवल्स

1
@ThiagoAlves आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने उत्तर को कम अस्पष्ट बना दिया है, इसलिए हम इस बारे में स्पष्ट हो सकते हैं कि समस्या थी या नहीं। Ie, मुझे आश्चर्य है कि अगर आपने [Unit]पहले शामिल करना सुनिश्चित किया है OnFailure=
sourcejedi

0

किसी भी फाइलसिस्टम के स्वत: बढ़ते को बंद करें जो कि बूट ऑपरेशन के लिए गैर-आवश्यक है, noautoइसके /etc/fstabप्रवेश के लिए एक माउंट विकल्प जोड़कर :

/dev/sdxy /u01 nfs defaults 0 0

सेवा:

/dev/sdyx /u01 nfs noauto 0 0

और फिर एक लाइन का उपयोग करके बूट के बाद फाइल सिस्टम को माउंट करें /etc/rc.local:

mount /u01

यह उदाहरण NFS का उपयोग करता है लेकिन यह एक फ़ाइल सर्वर से आयातित LUN पर भी लागू होता है।


1
हां, मुझे पता है कि नोआटो, लेकिन अगर मैं हर बार फस्टब को बदलूंगा, तो नोफेल ज्यादा बेहतर विकल्प होगा। वैसे भी Thx।
गोटेगुरु

0

शायद यह कोशिश करो?

systemctl mask emergency.service
systemctl mask emergency.target

4
क्या आपने यह कोशिश की है? क्या होता है जब सिस्टमड बूट के दौरान एक त्रुटि का सामना करता है, आपातकालीन लक्ष्य के साथ?
स्टीफन किट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.