सिस्टमड: एक यूनिट शुरू करने के बाद एक और यूनिट वास्तव में शुरू होता है


20

अपने विशेष मामले में मैं पूरी तरह से शुरू remote-fsहोने के बाद इकाई शुरू करना चाहता हूं glusterfs

मेरी सिस्टमड फाइलें:

glusterfs को लक्ष्य:

node04:/usr/lib/systemd/system # cat glusterfsd.service 
[Unit]
Description=GlusterFS brick processes (stopping only)
After=network.target glusterd.service

[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes
ExecStop=/bin/sh -c "/bin/killall --wait glusterfsd || /bin/true"
ExecReload=/bin/sh -c "/bin/killall -HUP glusterfsd || /bin/true"

[Install]
WantedBy=multi-user.target

remote-fs को लक्ष्य:

node04:/usr/lib/systemd/system # cat remote-fs.target 
[Unit]
Description=Remote File Systems
Documentation=man:systemd.special(7)
Requires=glusterfsd.service
After=glusterfsd.service remote-fs-pre.target
DefaultDependencies=no
Conflicts=shutdown.target

[Install]
WantedBy=multi-user.target

ठीक है, सभी ग्लस्टर डेमन्स सफल होने लगते हैं और मैं एनएफएस के माध्यम से ग्लस्टर फाइलसिस्टम को माउंट करना चाहता हूं, लेकिन ग्लस्टर का एनएफएस शेयर glusterfs.serviceशुरू होने के तुरंत बाद तैयार नहीं होता है , लेकिन कुछ सेकंड बाद, इसलिए आमतौर पर remote-fsइसके बारे में Requiresऔर Afterनिर्देशों को माउंट करने में भी असमर्थ होता है ।

आइए देखें लॉग:

Apr 14 16:16:22 node04 systemd[1]: Started GlusterFS, a clustered file-system server.
Apr 14 16:16:22 node04 systemd[1]: Starting GlusterFS brick processes (stopping only)...
Apr 14 16:16:22 node04 systemd[1]: Starting Network is Online.
Apr 14 16:16:22 node04 systemd[1]: Reached target Network is Online.
Apr 14 16:16:22 node04 systemd[1]: Mounting /stor...

यहाँ सब कुछ ठीक है, दूरस्थ फाइल सिस्टम (/ स्टोर) लगता है कि चमक के बाद माउंट शुरू हो जाएगा, क्योंकि इसका मतलब इकाई फाइलों के अनुसार होना चाहिए ... लेकिन अगली पंक्तियाँ हैं:

//...skipped.....
Apr 14 16:16:22 node04 systemd[1]: Started GlusterFS brick processes (stopping only).

क्या? GlusterFS इस पल के लिए ही तैयार हुई! और फिर हम देखते हैं:

//...skipped.....
Apr 14 16:16:23 node04 mount[2960]: mount.nfs: mounting node04:/stor failed, reason given by server: No such file or directory
Apr 14 16:16:23 node04 systemd[1]: stor.mount mount process exited, code=exited status=32
Apr 14 16:16:23 node04 systemd[1]: Failed to mount /stor.
Apr 14 16:16:23 node04 systemd[1]: Dependency failed for Remote File Systems.
Apr 14 16:16:23 node04 systemd[1]: Unit stor.mount entered failed state.

माउंट विफल हो गया क्योंकि सिस्टम को स्टोरेज को माउंट करने का प्रयास करते समय एनएफएस सर्वर तैयार नहीं था।

सिस्टमड बूट प्रक्रिया की गैर-नियतात्मक प्रकृति के कारण, कभी-कभी (लगभग 10 बूटों में से 1) बूट पर इस फाइलसिस्टम को बढ़ाना सफल होता है।

यदि ऑनबूट माउंट असफल था, तो मैं सर्वर पर लॉगिन कर सकता हूं और मैन्युअल रूप से / स्टोर निर्देशिका को माउंट कर सकता हूं, इसलिए ग्लस्टर की एनएफएस सेवा ठीक काम करने लगती है।

तो लॉग में लाइन दिखाई देने के remote-fsबाद glusterfsd, अर्थात कैसे शुरू करें Started GlusterFS brick processes?

remote-fsऐसा लगता है कि बहुत ही अंतिम लक्ष्यों में से एक है, इसलिए मैं इसे एक और "वर्कअराउंड" लक्ष्य के बाद शुरू नहीं कर सकता हूं जो वास्तव में आवश्यक नहीं है remote-fs


5
क्या आप ExecStartPre=<command>उस इकाई के अनुभाग में एक संपत्ति जोड़ सकते हैं glusterfsd.serviceजो एक कमांड को निष्पादित करता है जो कि ग्लस्टरफ़ेट्स तैयार होने तक रोक देगा? यह glusterfsd.serviceसफलता को इंगित करने और सक्रिय करने से रोक सकता है remotefs.target
बेन कैंपबेल

2
मैं वास्तव में आपकी glusterfsd.serviceइकाई फ़ाइल से भ्रमित हूँ । यह वास्तव में किसी भी सेवा को शुरू करने के लिए नहीं लगता है, और वास्तव में किसी भी प्रक्रिया को मारताglusterfsd है। क्या आपके पास कोई अन्य चमक-संबंधी इकाई फाइलें हैं?
ग्रेग

क्या आप stor.mountयूनिट भी दिखा सकते हैं ?
ब्रायन रेडबर्ड

जवाबों:


3

आप आदेश का पालन करके systemd बूट अनुक्रम का विश्लेषण कर सकते हैं। SVG सपोर्ट करने वाले वेब ब्राउजर का उपयोग करके आउटपुट फाइल देखें।

systemd-analyze plot > test.svg

वह प्लॉटिंग आपको अंतिम बूट के समय के आंकड़े प्रदान करेगा, जो आपको समस्या के लिए अधिक स्पष्ट दृष्टिकोण प्रदान करेगा।

mountमें कमांड जोड़कर मैंने अपनी NFS की बढ़ती समस्या को हल किया /etc/rc.local। हालांकि मुझे यकीन नहीं है, क्या यह तेज एकीकरण के लिए एक प्रयास के लायक, चमक एकीकरण के साथ काम करेगा। सिस्टम रन रन बनाने के लिए आपको निम्नलिखित शर्त को पूरा करना चाहिए:

# grep Condition /usr/lib/systemd/system/rc-local.service
ConditionFileIsExecutable=/etc/rc.d/rc.local

1

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

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

इसका समाधान एक 'ExecStartPre' लिपि का होना था जो मूल रूप से विशिष्ट निर्भरताओं की उपलब्धता के लिए परीक्षण करता है, जब तक कि यह सफल न हो जाए (0 से बाहर निकलें) या बार प्रयास करने से बाहर निकलें (बाहर निकलें 1)।

यदि आप कर सकते हैं, तो सुनिश्चित करें कि आप मुख्य systemd lib निर्देशिका के बाहर अनुकूलित करें। पैकेज फ़ाइलों को बदलने का मतलब होगा कि वे संभावित रूप से अगले अद्यतन के साथ ओवरराइट हो जाएंगे।


0

शायद आप इसे remote-fsलक्षित करने के लिए जोड़ सकते हैं :

[Unit]
...
ConditionPathExists=/stor

0

शायद कुछ मतदान मदद कर सकते हैं। यह सिस्टमड से स्वतंत्र है। उदाहरण के लिए, मैं mysql -e ';'mysql के साथ उपयोगी कुछ करने से पहले एक लूप में उपयोग करता हूं ।

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