यूनिट -.mount मास्क है: OpenVPN क्लाइंट शुरू नहीं होगा
/run/systemd/system में बची एक -.mount फ़ाइल रूट माउंट यूनिट को मास्क कर देती है, इसलिए फ़ाइल सिस्टम की ज़रूरत रखने वाला हर यूनिट OpenVPN शुरू होने से पहले ही विफल हो जाता है।
आपकी सेवा OpenVPN के कभी चलने से पहले ही विफल हो जाती है, और त्रुटि ऐसी माउंट यूनिट की बात करती है जिसे आपने कभी कॉन्फ़िगर नहीं किया। यही संकेत है: systemd पूरे लेन-देन को अस्वीकार कर रहा है क्योंकि रूट माउंट यूनिट मास्क है, और आपकी VPN प्रोफ़ाइल अभी पढ़ी ही नहीं गई। आम वजह रनटाइम यूनिट निर्देशिका में बची कोई फ़ाइल है, टूटा हुआ fstab नहीं और गायब प्रमाणपत्र नहीं। पहले फ़ाइल का पीछा करें, क्योंकि उसे बाहर करना सबसे सस्ती व्याख्या है।
त्रुटि रूट माउंट का नाम लेती है, आपकी प्रोफ़ाइल का नहीं
systemd खुद कर्नेल की माउंट जानकारी से रूट माउंट यूनिट बनाता है और उसे -.mount कहता है क्योंकि डैश रूट पथ को दर्शाता है। यह यूनिट आमतौर पर सिर्फ़ मेमोरी में होती है और इसके पीछे कोई फ़ाइल नहीं होती। जब त्रुटि कहती है कि यह मास्क है, तो किसी ने यूनिट फ़ाइल वहाँ रखी है जहाँ से systemd उसे लोड करेगा और उस फ़ाइल को /dev/null की ओर इंगित किया है। मास्क होना एक असली स्थिति है, संदेश में टाइपिंग की गलती नहीं।
इंस्टेंस यूनिट विफल होती है क्योंकि उसका जॉब ग्राफ़ क्रम और अपनी माउंट आवश्यकताओं के ज़रिए रूट माउंट तक पहुँचता है। लेन-देन OpenVPN बाइनरी चलने से पहले अस्वीकार कर दिया जाता है, इसलिए क्लाइंट की कॉन्फ़िगरेशन में कुछ भी वजह नहीं हो सकता। इसीलिए प्रोफ़ाइल, प्रमाणपत्र या क्रेडेंशियल बदलने का इस ख़ास विफलता पर कोई असर नहीं होता।
OpenVPN को डीबग करने से पहले रनटाइम निर्देशिका देखें
रनटाइम यूनिट निर्देशिका में ठीक उसी नाम की फ़ाइल खोजें, फिर systemd से पूछें कि उसके हिसाब से यूनिट क्या है। दोनों जवाब तेज़ हैं, और साथ मिलकर बची फ़ाइल को असली माउंट समस्या से अलग करते हैं।
ls -l /run/systemd/system/-.mount
systemctl status -.mount
systemctl list-unit-files --state=masked | grep mount
आम मशीन में ऐसी फ़ाइल नहीं होती, और मास्क की सूची में रूट माउंट नहीं होता। अगर पहला कमांड /dev/null का सिंबॉलिक लिंक छापता है, तो निदान तय है। उसी निर्देशिका में उन्हीं औज़ारों से बना tmp.mount मास्क भी हो सकता है, और वह दूसरे नाम से उसी तरह की विफलता पैदा करता है। पूरी निर्देशिका देखें, सिर्फ़ त्रुटि में लिखा नाम नहीं।
ls -la /run/systemd/system/*.mount
अगर निर्देशिका साफ़ है और यूनिट अब भी मास्क है, तो मास्क खोज पथ में कहीं और है, और systemctl cat -.mount दिखाएगा कि कौन सी फ़ाइल लोड हो रही है।
फ़ाइल हटाएँ, फिर से लोड करें और दोबारा शुरू करें
रनटाइम फ़ाइल हटाना और मैनेजर को फिर से लोड करना काफ़ी है, और यह पैकेज से आई किसी चीज़ को नहीं छूता। शुरू करने से पहले फिर से लोड करें, क्योंकि systemd लोड की गई यूनिट की स्थिति तब तक रखता है जब तक निर्देशिका फिर से न पढ़े।
sudo rm -f /run/systemd/system/-.mount /run/systemd/system/tmp.mount
sudo systemctl daemon-reload
systemctl status -.mount
sudo systemctl start [email protected]
फिर यह मानने की बजाय कि सुधार काम कर गया, सेवा का अपना जर्नल पढ़ें। साफ़ शुरुआत सिर्फ़ यह साबित करती है कि systemd ने यूनिट स्वीकार की; क्लाइंट अब भी गायब प्रोफ़ाइल, अगम्य साथी या ऐसे प्रमाणपत्र से मर सकता है जो सत्यापित न हो। ये OpenVPN की आम समस्याएँ थीं जो मास्क यूनिट के पीछे छिपी थीं। जर्नल दर्ज करता है कि कौन सी प्रोफ़ाइल लोड हुई और सुरंग सचमुच बनी या नहीं। अगर यूनिट शुरू होती है और सुरंग नहीं, तो आप दूसरी समस्या पर पहुँच गए हैं, और यह प्रगति है।
journalctl -u [email protected] -b --no-pager
चूँकि /run अस्थायी फ़ाइल सिस्टम है, रीबूट भी फ़ाइल मिटा देता है। इससे रीबूट एक उपयोगी परीक्षण बनता है: अगर सेवा रीबूट के बाद काम करे और अगली तैनाती के बाद फिर विफल हो, तो फ़ाइल इमेज में पकाई जा रही है।
इसे इमेज से वापस आने से रोकें
कंटेनर या वर्चुअल मशीन का टेम्पलेट जो निर्माण के दौरान माउंट यूनिट मास्क करता है, वह मास्क हर क्लोन में ले जाएगा। अगली जिस चीज़ को फ़ाइल सिस्टम चाहिए वह टूट जाती है, और संदेश उस इमेज की बजाय माउंट को दोष देता है जिससे वह आया। एक चलते इंस्टेंस के अंदर सुधार करना समस्या को अगले इंस्टेंस बनने तक छिपा देता है।
निर्माण संदर्भ में फ़ाइल का नाम और उसे बनाने वाला कमांड खोजें, फिर टेम्पलेट से मास्क हटाएँ और दोबारा बनाएँ। अगर मास्क निर्माण के दौरान सचमुच ज़रूरी है, तो उसे उसी परत में हटाएँ जो निर्माण पूरा करती है, ताकि भेजी गई इमेज साफ़ शुरू हो। ताज़ा क्लोन पर जाँचें, उस मशीन पर नहीं जिसे आपने हाथ से ठीक किया। यही एकमात्र परीक्षण है जो साबित करता है कि इमेज बदली है।
जो लक्षण याद रखना चाहिए वह त्रुटि और उस चीज़ के बीच का अंतर है जिसे आप कॉन्फ़िगर कर रहे थे। जब systemd माउंट की शिकायत करे और आप VPN क्लाइंट शुरू कर रहे हों, तो पहले संदेश में यूनिट का नाम पढ़ें और फिर सेवा का नाम।