Systemd /etc/init.d स्क्रिप्ट का उपयोग कैसे करता है?


120

मैं बस डेबियन जेसी में बदल गया, और ज्यादातर चीजें ठीक चलती हैं, जिसमें मेरा ग्राफिकल डिस्प्ले मैनेजर भी शामिल है wdm

बात यह है, मुझे समझ नहीं आता कि यह कैसे काम करता है। जाहिर है मेरी /etc/init.d/wdmस्क्रिप्ट को कहा जाता है, क्योंकि जब मैं exitवहां जल्दी जाता हूं , तो wdm शुरू नहीं होता है। लेकिन जब मैं वैकल्पिक रूप से /etc/rc3.d निर्देशिका का नाम बदल देता हूं (मेरा डिफ़ॉल्ट रनलेवल 3 हुआ करता था), तब भी wdm शुरू हो जाता है।

मुझे यह पता नहीं चल पाया कि सिस्टमड इस स्क्रिप्ट को कैसे ढूँढता है और मुझे समझ में नहीं आता है कि यह अन्य सभी init.d स्क्रिप्ट्स का क्या करता है।

  • कब और कैसे systemit init.d स्क्रैप को चलाता है?
  • लंबे समय में, क्या मुझे सभी init.d स्क्रिप्ट से छुटकारा पाना चाहिए?

जवाबों:


166

अराजकता का जवाब कुछ दस्तावेज कहते हैं। लेकिन यह नहीं है कि वास्तव में systemd क्या करता है। (यह क्या नहीं वैन Smoorenburg है rc, किया था या तो। वैन Smoorenburgrc सबसे निश्चित रूप से नहीं किया उपेक्षा LSB हेडर, जो insservऐसी है कि "असंगतताएं" पेज के रूप में, Freedesktop प्रलेखन स्थिर orderings गणना के लिए इस्तेमाल शुरुआत के लिए,।), वास्तव में गलत, पर है ये और अन्य बिंदु। ( HOMEवास्तव में पर्यावरण चर अक्सर उदाहरण के लिए सेट किया जाता है । यह लंबे समय के लिए कहीं भी पूर्ण रूप से अनधिकृत रूप से चला गया है। यह अब मैनुअल में प्रलेखित है, कम से कम, लेकिन यह कि फ्रीडेसटॉप डब्ल्यूडब्ल्यूडब्ल्यू पेज अभी भी सही नहीं हुआ है।)

सिस्टमड के लिए मूल सेवा प्रारूप सेवा इकाई है । systemd के सेवा प्रबंधन उचित संचालित पूरी तरह से उन है, जो यह नौ निर्देशिका जहां (सिस्टम-वाइड) में से एक से पढ़ता है के मामले में .serviceफ़ाइलों रह सकते हैं। /etc/systemd/system, /run/systemd/system, /usr/local/lib/systemd/system, और /usr/lib/systemd/systemउन निर्देशिकाओं के चार हैं।

वैन स्मुरेनबर्ग rcस्क्रिप्ट के साथ संगतता रूपांतरण कार्यक्रम के साथ हासिल की जाती है, जिसका नाम है systemd-sysv-generator। इस कार्यक्रम को /usr/lib/systemd/system-generators/निर्देशिका में सूचीबद्ध किया गया है और इस प्रकार बूटस्ट्रैप प्रक्रिया में हर बूट पर आरंभ में स्वचालित रूप से चलाया जाता है, और फिर हर बार सिस्टमड को इसके कॉन्फ़िगरेशन को बाद में लोड करने का निर्देश दिया जाता है।

यह प्रोग्राम एक जनरेटर है , एक प्रकार का सहायक उपयोगिता जिसका काम मक्खी पर सर्विस यूनिट फाइलें बनाना है, एक tmpfs में जहां उन नौ निर्देशिकाओं में से तीन (जो केवल जनरेटर द्वारा उपयोग किए जाने का इरादा है) स्थित हैं। systemd-sysv-generatorसेवा इकाइयों को उत्पन्न करता है जो वैन स्मरनबर्ग rcलिपियों को चलाते हैं /etc/init.d, अगर यह मूल सिस्टेम सेवा इकाई को उस नाम से नहीं मिलती है जो पहले से ही अन्य छह स्थानों में मौजूद है।

systemd सेवा प्रबंधन केवल सेवा इकाइयों के बारे में जानता है। ये स्वचालित रूप से (पुनः) जेनरेट की गई सेवा इकाइयाँ वैन स्मरनबर्ग rcलिपियों को लागू करने के लिए लिखी जाती हैं। उनके पास अन्य चीजें हैं:

[यूनिट]
Sourcepath = / etc / init.d / wibble
[सेवा]
ExecStart = / etc / init.d / wibble प्रारंभ
ExecStop = / etc / init.d / wibble रोक

प्राप्त ज्ञान यह है कि वैन स्मरनबर्ग rcलिपियों में एक एलएसबी हेडर होना चाहिए, और /etc/rc?.d/सिस्टम द्वारा लगाए गए प्राथमिकताओं का सम्मान किए बिना समानांतर में चलाया जाता है। यह सभी बिंदुओं पर गलत है।

वास्तव में, वे नहीं अगर वे करते हैं एक LSB हेडर की आवश्यकता नहीं है, और systemd-sysv-generator(अधिक सीमित वर्ष RedHat टिप्पणी हेडर को पहचान सकते हैं description:, pidfile:, और आगे)। इसके अलावा, एलएसबी हेडर की अनुपस्थिति में यह /etc/rc?.dप्रतीकात्मक लिंक फार्मों की सामग्री पर वापस आ जाएगा , लिंक नामों में एन्कोड की गई प्राथमिकताओं को पढ़ना और उनसे ऑर्डर करने से पहले / बाद में निर्माण करना, सेवाओं को क्रमबद्ध करना। न केवल एलएसबी हेडर एक आवश्यकता नहीं है, और न केवल वे खुद को आदेशों से पहले / बाद में सांकेतिक शब्दों में बदलना है कि चीजों को एक हद तक क्रमबद्ध करें, उनकी पूर्ण अनुपस्थिति में गिरावट का व्यवहार वास्तव में काफी गैर-समानांतर संचालन है।

जो कारण /etc/rc3.dसामने नहीं आया वह यह है कि आपके पास संभवतः वह स्क्रिप्ट किसी अन्य /etc/rc?.d/निर्देशिका के माध्यम से सक्षम थी । systemd-sysv-generatorमें से किसी में सूचीबद्ध होने के लिए अनुवाद /etc/rc2.d/, /etc/rc3.d/और /etc/rc4.d/एक देशी में Wanted-Bysystemd के लिए संबंध multi-user.target। सिस्टम वर्ल्ड में रन स्तर "अप्रचलित" हैं, और आप उनके बारे में भूल सकते हैं।

आगे की पढाई


2
डेबियन में प्रणाली जनरेटर निर्देशिका / usr / lib पर lib रहते नहीं है, लेकिन / packages.debian.org/sid/amd64/systemd/filelist
Braiam

5
यह एक सीधे ऊपर अद्भुत जवाब है। शाबाश सर।
छिलका

1
धन्यवाद, धन्यवाद, इसके लिए धन्यवाद! डेबियन 8 और आरएच / सेंटोस 7 सिस्टम के मिश्रण से निपटने से SysVInit बनाम Systemd सेवा निर्भरता प्रबंधन का प्रबंधन थोड़ा सिरदर्द हो गया है, लेकिन सिस्टमड क्या कर रहा है, इस स्पष्टीकरण से मेरी समझ में बहुत मदद मिली है।
टॉबी

यह जनरेटर काम करता है। मैं अनुयायियों के लिए भी उल्लेख करूंगा, कि यदि आपके पास systemd/etc/init.d स्क्रिप्ट का पुराना संस्करण है और "बूट ऑन स्टार्ट" पर सेट नहीं है, तब भी यह अपेक्षित रूप से काम करेगा, लेकिन दिखाई नहीं देगा। शो-यूनिट्स लिस्ट: unix.stackexchange.com/a/518894/8337
rogerdpack

यह जनरेटर काम करता है। मैं अनुयायियों के लिए भी उल्लेख करूंगा, कि यदि आपके पास systemd और /etc/init.d स्क्रिप्ट का एक पुराना संस्करण है, जो "बूट ऑन स्टार्ट" पर सेट नहीं है, यह अभी भी सिस्टमटाइल का उपयोग करके अपेक्षित रूप से प्रारंभ / बंद होगा लेकिन जीता शो-इकाइयों की सूची में t शो नहीं है: unix.stackexchange.com/questions/517872/… भी NB कि आप मूल रूप से /etc/init.d/xx को सीधे चलाकर या इन सिस्टमों को चलाकर "इन सेवाओं को नियंत्रित नहीं कर सकते" ... उलझन में है कि क्या चल रहा है और क्या नहीं है: |
रोज़गारपैक

17

Systemd SysV init स्क्रिप्ट के साथ पिछड़ा संगत है । LSB 3.1 के अनुसार, init स्क्रिप्ट में सूचनात्मक टिप्पणी परंपराएं होनी चाहिए , यह परिभाषित करते हुए कि स्क्रिप्ट को शुरू / रोकना है और स्क्रिप्ट को शुरू / बंद करने के लिए क्या आवश्यक है। यह एक उदाहरण है:

### BEGIN INIT INFO
# Provides: my-service
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop service my-service
# Description: my-service blah blah ...
### END INIT INFO

यह एक टिप्पणी अनुभाग है जिसे SysV द्वारा अनदेखा किया गया है। दूसरी ओर, सिस्टमड उस निर्भरता जानकारी को पढ़ता है और उसके आधार पर उन स्क्रिप्ट को चलाता है।

लेकिन एक बिंदु है, जहां init स्क्रिप्ट के संदर्भ में systemd और SysV भिन्न हैं। SysV फ़ाइल नाम में उनकी संख्या के आधार पर अनुक्रमिक क्रम में स्क्रिप्ट निष्पादित करता है। Systemd नहीं करता है। यदि निर्भरताएं पूरी होती हैं, तो सिस्टम स्क्रिप्ट के नामों की संख्या का सम्मान किए बिना, स्क्रिप्ट को तुरंत चलाता है। उनमें से कुछ आदेश देने के कारण संभवतः सबसे विफल हो जाएंगे। बहुत सारी अन्य असंगतताएं हैं जिन पर विचार किया जाना चाहिए।


यदि एक ही सेवा के लिए init स्क्रिप्ट और .service फाइलें हैं, तो systemd दोनों को निष्पादित करेगा, जैसे ही निर्भरताएं पूरी होती हैं (init स्क्रिप्ट के मामले में, जो LSB हेडर में परिभाषित हैं)।


ठीक है, लेकिन मेरे पास / lib / systemd / system / में .service फ़ाइलों का एक पूरा गुच्छा है। Systemd वास्तव में क्या निष्पादित करता है? सेवा फ़ाइलों (निर्भरता क्रम में), init.d स्क्रिप्ट या दोनों में जो कुछ भी निर्दिष्ट है?
मार्टिन ड्रुतज़बर्ग

@MartinDrautzburg मैंने जवाब में कहा कि
अराजकता 13

1
एक विचार के रूप में, डेबियन ने एलएसबी संगतता को बस डंप करने की घोषणा की है: article.gmane.org/gmane.linux.debian.devel.lsb/1103
Jan

systemd SysV स्क्रिप्ट के साथ संगत BUT है। न केवल यह कथन गलत है, बल्कि संदर्भित लिंक यह स्पष्ट करता है कि यह केवल "ज्यादातर संगत" है और समान परिणाम उत्पन्न करने के लिए आवश्यक प्रयास की मात्रा बहुत अधिक है।
ऑस्टिन में जूली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.