नेटवर्किंग शुरू होने से पहले एक सिस्टमड सेवा कैसे शुरू करें?


11

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

मैंने निम्नलिखित कोशिश की:

[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
#Before=network-pre.target
Before=networking.service

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=networking.service

उपयोग करने से systemd-analyze plotमैं देख सकता हूं कि मेरी सेवा शुरू हो गई है, लेकिन networking.serviceलगभग 3 सेकंड पहले शुरू होती है:

यहाँ छवि विवरण दर्ज करें

जाहिरा तौर पर मेरा विन्यास गलत है, लेकिन मुझे समस्या का पता लगाने में मुश्किल समय आ रहा है ... किसी भी मदद की बहुत सराहना की ..

अपडेट करें

मैंने वर्तमान में local-fs.targetइसके बजाय शुरू करने के लिए सेवा कॉन्फ़िगरेशन को बदलकर इसे हल किया है networking.service:

[Unit]
DefaultDependencies=no
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
Before=local-fs.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=local-fs.target

फिर भी, मैं यह समझना चाहूंगा कि मेरा पहला विन्यास अपेक्षित रूप से काम क्यों नहीं कर पाया ...?


सिस्टेम काम करने के तरीके के कारण, शाब्दिक लौकिक क्रम जिसमें चीजें चलती हैं, महत्वपूर्ण नहीं हो सकती हैं। जब नेटवर्किंग आती है, तो क्या यह सफलतापूर्वक उस निर्देशिका की फ़ाइलों के अनुसार है?
टॉम हंट

मुझे यकीन नहीं है कि मैं आपके सवाल को समझ गया हूं। वैसे भी, /etc/network/interfacesउन ip-upलिपियों के संदर्भ हैं जो दूसरे विभाजन में रहते हैं। यही कारण है कि विभाजन एक जटिल स्क्रिप्ट के द्वारा लगाया गया है /opt/intermodul-mounts/start.shकि होना चाहिए इससे पहले कि नेटवर्किंग की स्थापना की जा रही है चलाया जा। वर्तमान में, ip-upस्क्रिप्ट प्रभावी रूप से प्रारंभ नहीं होती है क्योंकि वे बूट समय पर पहुँच योग्य नहीं होती हैं। service networking restartबाद में दौड़ना सभी इंटरफेस को सही ढंग से लाता है।
उडो जी

संभावित डुप्लिकेट: superuser.com/questions/1005742/...
जोसिप रोडिन

जवाबों:


8

network-pre.target एक लक्ष्य है जिसका उपयोग किसी भी नेटवर्क इंटरफ़ेस को कॉन्फ़िगर करने से पहले सेवाओं को ऑर्डर करने के लिए किया जा सकता है। यह प्राथमिक उद्देश्य फ़ायरवॉल सेवाओं के उपयोग के लिए है जो किसी भी नेटवर्क इंटरफ़ेस के उठने से पहले फ़ायरवॉल स्थापित करना चाहते हैं। यह एक निष्क्रिय इकाई है: आप इसे सीधे शुरू नहीं कर सकते हैं और इसे नेटवर्क प्रबंधन सेवा द्वारा नहीं खींचा जाता है, बल्कि उस सेवा द्वारा जिसे इसके पहले चलाना चाहते हैं।

network-pre.targetयदि आप नेटवर्क शुरू होने से पहले कुछ सेटअप करना चाहते हैं तो आप इसका उपयोग करना चाहते हैं

ऐसी सेवाएँ जो नेटवर्क के कॉन्फ़िगर होने से पहले चलाई जानी चाहिए, उनसे पहले = network-pre.target को जगह देनी चाहिए और Wants = network-pre.target को इसमें खींचने के लिए सेट करना चाहिए।

आपको इन्हें [Unit]अनुभाग में रखना चाहिए :

Before=network-pre.target
Wants=network-pre.target

संदर्भ


1
अरे @edwardtorvalds, मैं कुछ नेटवर्क कॉन्फिगरेशन सेटअप के लिए ठीक यही कर रहा था, फिर भी यूनिट कभी नहीं चलती। का उत्तर systemctl is-enabled <unit>हमेशा होता है static। बेशक, मैं इसे सक्षम नहीं कर सकता क्योंकि वहाँ कोई नहीं है WantedBy=। आखिर यह चाहता क्या है? यह कुछ ऐसा है जो नेटवर्क को लोड करने से पहले कुछ सेटअप करता है।
डायन

आप = दूरस्थ- FAQ.target या Mount-fs.target द्वारा वांछित प्रयास कर सकते हैं।
एडवर्ड टॉर्वाल्ड्स

2
धन्यवाद। मैं कर रहा समाप्त हो गया Before=network-pre.targetऔर Wants=network-pre.targetऔर के लिए [Install]हमने किया WantedBy=network.target। अंतिम अनुभाग ने इसे नेटवर्किंग द्वारा आवश्यक होने के लिए मजबूर किया, पूर्व ने इसे क्रम में रखा। एक दर्द है, हालांकि था
दीच

चूँकि आप निश्चित रूप से मेरे सिर के चारों ओर मेरे सिर से बहुत बेहतर हैं, क्या आप मेरे पास मौजूद अन्य q को देख सकते हैं? unix.stackexchange.com/questions/277783/… फिर भी यह पता लगाने की कोशिश कर रहा है कि यह कैसे करना है।
हिच

मैं उलझन में हूं क्योंकि मुझे एन्क्रिप्टेड विभाजन के साथ अनुभव नहीं है, अगर आप बस मुझे ऐसा कर सकते हैं
एडवर्ड टॉर्वाल्ड्स

3

जैसा कि डेबियन जेसी में किया गया था, नेटफिल्टर-परसेंट पैकेज (नेटवर्क ऊपर होने से पहले iptables नियमों को लोड करने की अनुमति देता है) में एक नेटफिल्टर- persistent.service है जो दिखता है:

# https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
# based on the netfilter-persistent package
[Unit]
Description=netfilter persistent configuration
DefaultDependencies=no

Before=network-pre.target
Wants=network-pre.target

Wants=systemd-modules-load.service local-fs.target
After=systemd-modules-load.service local-fs.target

Conflicts=shutdown.target
Before=shutdown.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/netfilter-persistent start
ExecStop=/usr/sbin/netfilter-persistent stop

[Install]
WantedBy=multi-user.target

यह संघर्ष में क्यों है shutdown.target?!
एलेक्सिस विलके

1

गलती सरल है और मुख्य चीजों में से एक है जो मैं हमेशा मिलाता हूं: आप मिश्रण करते हैं Beforeऔर RequiredBy। यह एक साथ नहीं है। अन्य लक्ष्य के बारे में सही हैं।


0
[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=basic.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
WantedBy=basic.target

इन पंक्तियों के साथ कुछ करने से यह सुनिश्चित हो जाएगा कि यह इकाई नेटवर्क से पहले चल रही है, लेकिन अधिकांश अन्य महत्वपूर्ण सेटअप होने के बाद।

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