मैं अपनी systemd इकाई फ़ाइल कहाँ रखूँ?


59

मैंने पढ़ा कि यूनिट फ़ाइलों के लिए दो फ़ोल्डर हैं (उपयोगकर्ता मोड में नहीं)।

/usr/lib/systemd/system/: units provided by installed packages
/etc/systemd/system/: units installed by the system administrator

इस समझ के साथ विरोध निम्नलिखित उत्तर है: https://unix.stackexchange.com/a/47715/33386 । क्या कोई लापता जानकारी भर सकता है ताकि मुझे समझ में आ जाए कि क्या चल रहा है? ( अद्यतन: उत्तर अद्यतन किया गया है, और मेरी समझ अब इसके साथ संघर्ष नहीं करती है। )

इसके अलावा, ऐसा लगता है कि स्क्रिप्ट /etc/systemd/system/फ़ोल्डर के भीतर सबफ़ोल्डर में व्यवस्थित हैं :

getty.target.wants
multi-user.target.wants

एक अन्य स्थान पर मैंने पढ़ा कि अन्य स्थान हैं। ऐसा लगता है कि ये उपयोगकर्ता-विशिष्ट सेवाओं के लिए हैं।

/usr/lib/systemd/user/ where services provided by installed packages go.
/etc/systemd/user/ where system-wide user services are placed by the system administrator.
~/.config/systemd/user/ where the user puts its own services.

अपडेट 2015-08-31:

दूसरों की खातिर, यहाँ एक संबंधित प्रश्न का एक लिंक है जो मैंने हाल ही में पूछा है: मैं सिस्टमड यूनिट्स द्वारा निष्पादित स्क्रिप्ट्स को कहाँ रखूँ?


4
/etc/systemd/systemवह जगह है जहाँ आप अपनी स्क्रिप्ट डालते हैं, pacman पैकेज स्क्रिप्ट डालता है /usr/lib/systemd/systemऔर जारी करने systemctl enable foo.serviceसे /usr/etc
सिम्बलिंक्स

1
देखें man systemd.target: यह समूहों के पीछे के तर्क को स्पष्ट करता है।
जासनवरियन

जवाबों:


57

सिस्टम यूनिट फ़ाइलों को रखने के लिए सबसे अच्छी जगह : /etc/systemd/system बस [इंस्टॉल] अनुभाग के तहत एक लक्ष्य जोड़ना सुनिश्चित करें, "यह कैसे पता चलता है?" ब्योरा हेतु। अद्यतन : /usr/local/lib/systemd/systemएक और विकल्प है, विवरण के लिए "ग्रे एरिया" पढ़ें।

उपयोगकर्ता इकाई फ़ाइलों को रखने के लिए सबसे अच्छी जगह : /etc/systemd/user या $HOME/.config/systemd/user यह अनुमतियों और स्थिति पर निर्भर करता है।

सच्चाई यह है कि सिस्टमड इकाइयां (या जैसा कि इंट्रो वाक्य उन्हें कहता है, "यूनिट कॉन्फ़िगरेशन") कहीं भी जा सकता है -प्रोवर्ड आप मैनुअल सिम्बलिंक बनाने के इच्छुक हैं और आपको कैविट्स के बारे में पता है। यह इकाई को रखना आसान बनाता है जहां systemctl daemon-reloadकुछ अच्छे कारणों के लिए इसे पा सकते हैं:

  • एक मानक स्थान का उपयोग करने का मतलब है कि सिस्टमड जनरेटर्स उन्हें ढूंढेंगे और बूट के साथ उन्हें सक्षम करना आसान बना देंगे systemctl enable। ऐसा इसलिए है क्योंकि आपकी इकाई स्वचालित रूप से एक इकाई निर्भरता पेड़ (एक इकाई कैश) में जोड़ दी जाएगी।
  • आपको अनुमतियों के बारे में सोचने की आवश्यकता नहीं है, क्योंकि केवल सही विशेषाधिकार प्राप्त उपयोगकर्ता निर्दिष्ट क्षेत्रों को लिख सकते हैं।

यह कैसे पता चलता है?

और वास्तव में कैसे systemctl enableपता चलता है कि सिमलिंक कहाँ बनाया जाए? आप इसे [install]अनुभाग के अंतर्गत इकाई के भीतर हार्ड कोड देते हैं । आमतौर पर जैसी लाइन होती है

[Install]
WantedBy = multi-user.target

जो फाइल सिस्टम पर पूर्वनिर्धारित जगह से मेल खाती है। इस तरह, यह systemctlजानता है कि यह इकाई इकाई फ़ाइलों के एक समूह पर निर्भर है जिसे multi-user.target"लक्ष्य" कहा जाता है। यह निर्भरता समूहों को नामित करने के लिए प्रयोग किया जाता है। आप सभी समूहों को सूचीबद्ध कर सकते हैं systemctl list-units --type target)। एक लक्ष्य के साथ लोड की जाने वाली इकाई फ़ाइलों का समूह एक targetname.target.wantsनिर्देशिका में रखा जाता है । यह सिम्बलिंक (या वास्तविक चीज़) से भरी एक निर्देशिका है। अपने तो [Install]खंड कहते हैं कि यह है , लेकिन अगर यह करने के लिए एक सिमलिंक में मौजूद नहीं है निर्देशिका, तो यह लोड नहीं होगा। जब सिस्टमड यूनिट जेनरेटर बूट पर निर्भरता ट्री कैश में आपकी यूनिट फाइल जोड़ते हैं (आप मैन्युअल रूप से जनरेटर को ट्रिगर कर सकते हैं ), तो यह स्वचालित रूप से जानता है कि इस मामले में डायरेक्टरी में सिमलिंक कहां रखा जाए।WantedBymulti-user.targetmulti-user.target.wantssystemctl daemon-reload/etc/systemd/system/multi-user.target.wants/ क्या आपको इसे सक्षम करना चाहिए।

मैनुअल में मुख्य बिंदु:

अतिरिक्त यूनिटों को सिस्टम लोड ("लिंक्ड") में लोड किया जा सकता है, न कि यूनिट लोड पथ पर निर्देशिकाओं से। Systemctl (1) के लिए लिंक कमांड देखें।

Systemctl के तहत, Unit File Commands को देखें

यूनिट फ़ाइल लोड पथ

यूनिट फ़ाइलों को संकलन के दौरान निर्धारित पथों के एक सेट से लोड किया गया है, नीचे दो तालिकाओं में वर्णित है। पहले से सूचीबद्ध निर्देशिकाओं में मिली यूनिट फाइलें सूची में समान नाम वाली फाइलों को ओवरराइड करती हैं।

जब चर $SYSTEMD_UNIT_PATHसेट किया जाता है, तो इस चर की सामग्री यूनिट लोड पथ को ओवरराइड करती है। यदि $SYSTEMD_UNIT_PATHएक खाली घटक (":") के साथ समाप्त होता है, तो सामान्य इकाई लोड पथ को चर की सामग्री में जोड़ा जाएगा।

तालिका 1 और तालिका 2 से man systemd.unitअच्छे हैं।

सिस्टम मोड में चलने पर पथ लोड करें ( --system)।

  • /etc/systemd/system स्थानीय विन्यास
  • /run/systemd/system रनटाइम इकाइयों
  • /usr/lib/systemd/system स्थापित पैकेजों की इकाइयाँ

उपयोगकर्ता मोड में चलते समय लोड पथ ( --user)

प्रति उपयोगकर्ता इकाइयों और सभी / वैश्विक उपयोगकर्ता इकाइयों के बीच अंतर है ।

उपयोगकर्ता पर निर्भर

  • $XDG_CONFIG_HOME/systemd/user उपयोगकर्ता कॉन्फ़िगरेशन (केवल जब $XDG_CONFIG_HOMEसेट किया जाता है)
  • $HOME/.config/systemd/user उपयोगकर्ता कॉन्फ़िगरेशन (केवल जब $XDG_CONFIG_HOMEसेट नहीं किया जाता है)
  • $XDG_RUNTIME_DIR/systemd/user रनटाइम इकाइयों (केवल जब $XDG_RUNTIME_DIRसेट किया जाता है)

  • $XDG_DATA_HOME/systemd/user पैकेजों की इकाइयाँ जो गृह निर्देशिका में स्थापित की गई हैं (केवल तब उपयोग की जाती हैं जब $XDG_DATA_HOMEसेट की जाती हैं)

  • $HOME/.local/share/systemd/user पैकेजों की इकाइयाँ जो गृह निर्देशिका में स्थापित की गई हैं (केवल तब उपयोग की जाती हैं जब $XDG_DATA_HOMEसेट नहीं होती हैं)

--global (सभी उपयोगकर्ताओं)

सभी उपयोगकर्ताओं पर लागू होने वाली इकाइयाँ - प्रत्येक उपयोगकर्ता के स्वामित्व वाली अर्थ भी। इसलिए प्रत्येक उपयोगकर्ता इन सेवाओं को रोक सकता है, भले ही कोई प्रशासक उन्हें बूट करने में सक्षम करे।

  • /etc/systemd/user सभी उपयोगकर्ताओं के लिए स्थानीय कॉन्फ़िगरेशन ( systemctl --global enable userunit.service)
  • /usr/lib/systemd/user संकुल की इकाइयाँ जो सभी उपयोगकर्ताओं के लिए सिस्टम-वाइड स्थापित की गई हैं
  • /run/systemd/user रनटाइम इकाइयों

ग्रे एरिया

एक ओर, फ़ाइल पदानुक्रम मानक निर्दिष्ट करता /etcहै जो स्थानीय कॉन्फ़िगरेशन के लिए है जो बायनेरिज़ को निष्पादित नहीं करता है। दूसरी ओर यह निर्दिष्ट करता है कि /usr/local/"स्थानीय रूप से सॉफ़्टवेयर स्थापित करते समय सिस्टम व्यवस्थापक द्वारा उपयोग के लिए है"। आप यह भी तर्क दे सकते हैं (यदि केवल संगठन के उद्देश्य के लिए) नहीं है कि सभी सिस्टम यूनिट फ़ाइलों के तहत जाना चाहिए /usr/local/lib/systemd/system, लेकिन यह यूनिट फाइलों के लिए है जो पैकेज प्रबंधक से नहीं "सॉफ्टवेयर" का हिस्सा हैं। सिस्टम-वाइड हैं जो संबंधित systemd उपयोगकर्ता इकाइयाँ चल सकती हैं /usr/local/lib/systemd/user


इकाई फ़ाइलों को रखने के बारे में /etc/systemd/systemसलाह, स्व-निर्मित इकाई फ़ाइलों के लिए सामान्य सलाह है? पैकेज मैनेजर द्वारा स्थापित कुछ भी हमेशा उन्हें /usr/lib/systemd/systemउदाहरण के लिए रखना चाहिए ।
स्लम

@ एसएलएम हां, जब प्रश्न मेरे सिस्टमड यूनिट फाइलों को संदर्भित करता है , तो इसका मतलब स्व-निर्मित लोगों को लागू करना है।
जोनाथन कोमार

मैं विशिष्ट होगा: /etc/systemd/user(गारंटीकृत) सिस्टम विस्तृत उपयोगकर्ता सेवाओं के लिए और ~/.config/systemd/userकस्टम उपयोगकर्ता विशिष्ट सेवाओं के लिए।
सूयूहेगी

16

/etc/systemd/systemवह जगह है जहाँ आप अपनी स्क्रिप्ट्स डालते हैं, पैक्मैन पैकेज स्क्रिप्ट्स को अंदर डालता है /usr/lib/systemd/system

जारी करने systemctl enable foo.serviceसे /usrकरने के लिए सहानुभूति पैदा करता है /etcman systemd.unit(5)अधिक विवरण के लिए यूनिट लोड पथ अनुभाग देखें ।


@ macmadness86 यह याद नहीं है क्योंकि यह प्रश्न से संबंधित नहीं है।
जसोनव्रीयन

1

मैंने 3 लिखा है, एक के लिए ntpd, एक दूसरे के लिए, स्थिर ईथरनेट कार्ड, और एक चलने के लिए p0f, निष्क्रिय ओएस पहचानकर्ता। मैंने उन सबको अंदर डाल दिया /etc/systemd/system। ऐसा लगता है कि मैं शायद systemdNTP सामान को संभाल सकता हूं , लेकिन मुझे नहीं लगता कि मैं उस पर भरोसा करना चाहता हूं।

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