चुरोट के अंदर एक सिस्टमड सेवा शुरू करें


38

Init स्क्रिप्ट के साथ (या ओपन आर्क के साथ) मैं एक अलग इंस्टॉलेशन रूट से सेवाएं चला सकता हूं।
लेकिन जब मैं दौड़ता chroot /somepath/to_root /usr/bin/systemctl start someserviceहूँ तो मुझे :

Running in chroot, ignoring request.

क्या सिस्टम को सेवा चलाने के लिए मजबूर करने का कोई तरीका है?

अपडेट:
मैं अपने होस्ट सिस्टम को इनिट स्क्रिप्ट्स या ओपन आर्क चलाने के लिए कहना भूल गया, लेकिन कभी भी सिस्टमड नहीं हुआ, और मैं यूनिक्स सिस्टम को परेशान करने के लिए चेरोट का उपयोग करता हूं जो न्यूनतम शेल भी लॉन्च नहीं कर सकता है।


1
मुझे सेवाओं को चेरोट में चलाने की भी आवश्यकता है, यह हमेशा Openrc2 से पहले काम करता था, अब असंभव लगता है;
neofutur

आप गलत समस्या को हल करने का प्रयास कर रहे हैं। यदि आपके पास OpenRC है, तो आपको systemd सेवा को OpenRC सेवा में बदलने की आवश्यकता है। वहाँ वास्तव में उस के आसपास कोई रास्ता नहीं है।
डैनियल बी

@ डैनियलबी: नहीं! क्या आपने कभी systemrescuecd के बारे में सुना है?
user2284570

नहीं, मैं यह भी नहीं देखता कि यह आपके प्रश्न से कैसे संबंधित है।
डैनियल बी

जवाबों:


29

सिस्टमड डिस्ट्रोस (आर्क लिनक्स, ओपनएसयूएसई, फेडोरा) में एक प्रसिद्ध समस्या है।

Systemd sysvinit की जगह लेता है, और इस पर एक महान लाभ प्रदान करता है। Sysvinit में, जब आप किसी सेवा को शुरू करने के लिए कहते हैं, तो यह स्क्रिप्ट को लागू करने वाले व्यक्ति के निष्पादन संदर्भ को विरासत में मिलती है, जिसमें पर्यावरण चर, ulimits, और इसी तरह शामिल हैं। सिस्टमैड इसके विपरीत एक डेमॉन को सूचित करके सुधारता है, जो सेवा को एक अच्छी तरह से परिभाषित, स्वस्थ, निरंतर वातावरण में शुरू करेगा, जहां निश्चित रूप से सेवाओं का प्रदर्शन भविष्यवाणी करना बहुत आसान है, क्योंकि पर्यावरण हमेशा समान होता है।

इसका तात्पर्य यह है कि, जब मैं चेरोट के भीतर से सिस्टमक्टेल को कॉल करता हूं, तो यह अप्रासंगिक है कि मैं चेरोट के अंदर हूं, जो वातावरण विरासत में मिलेगा, वह अभी भी पीआईडी ​​1 का है, मेरा वर्तमान नहीं। लेकिन यह इससे भी बदतर हो जाता है: चूंकि संचार सॉकेट्स को अंदर / रन / सिस्टमड में रखा जाता है, इसलिए क्रॉच में एक प्रक्रिया भी इनिट सिस्टम से बात नहीं कर पाएगी!

तो आप सिस्टमड डिस्ट्रो में चेरोटिंग के बारे में कैसे जाते हैं?

  1. यदि आप सभी लिनक्स कंटेनर रखना चाहते हैं, तो यह आर्क विकी पेज आपको बताएगा कि 30 सेकंड से भी कम समय में लिनक्स कंटेनर कैसे स्थापित किया जाए systemd-nspawn

  2. यदि इसके बजाय आप वास्तव में एक क्रोकेट वातावरण चाहते हैं, तो यह सुंदर और क्रिस्टल स्पष्ट वेब पेज आपको दो कार्य समाधान प्रदान करेगा (दूसरा एक बिंदु # 1 पर प्रस्तुत एक का संशोधित संस्करण है)।


मैंने तलाश की है systemd-nspawnलेकिन मैं इसे नहीं चला सकता। और नहीं यह एक कंटेनर के लिए नहीं है क्योंकि सेवा को मेजबान और लक्ष्य वास्तुकला दोनों द्वारा उपयोग करने की आवश्यकता है।
user2284570 17

2
कि मैं अपने मेजबान सिस्टम रूट में systemd का उपयोग कभी नहीं करता। मेरे मामले में मैं खुलेआम के साथ systemd मिश्रण नहीं कर सकता।
user2284570

1
@TwoD जो काम नहीं करेगा। रनिंग systemd-nspawnके साथ विफल "नॉट ए systemd सिस्टम पर चल रहा है।" जब तक मेजबान सिस्टम के रूप में अच्छी तरह से उपयोग कर रहा है।
hvd

1
@TwoD और मैंने जवाब दिया क्योंकि यह मेरे लिए बिल्कुल भी ऐसा नहीं है। :) "मैं इसे नहीं चला सकता" कहने के लिए एक अजीब बात है अगर आपको निष्पादन योग्य खोजने में परेशानी हो रही है, यही कारण है कि मुझे संदेह है कि समस्या यह है कि मैंने अपनी टिप्पणी में क्या लिखा है: इसे चलाने से वह त्रुटि संदेश और doesn 'कुछ भी उपयोगी नहीं है। लेकिन यहां तक ​​कि अगर यह समस्या का पता लगाता है कि वास्तव में यह कहां था systemd-nspawn, तो नए रूट में इंगित करने से मदद नहीं मिलेगी। या तो होस्ट पहले से ही है (क्योंकि यह सिस्टमड चल रहा है), जिस स्थिति में होस्ट संस्करण का उपयोग किया जा सकता है, या मेजबान के पास नहीं है, लेकिन नए रूट का संस्करण काम नहीं करेगा।
hvd

1
systemdको चलाने से इंकार कर दिया जाएगाchroot
एरकिन अल्प ग्यूनी

4

systemd केवल "सेवाओं" को अनदेखा करता है, इसलिए मैं सिर्फ डेमॉन कमांड को मैन्युअल रूप से चलाता हूं।

इसलिए इसके बजाय

service sshd start

मैं उपयोग करता हूं

/usr/sbin/sshd -D &

यह सभी सेवाओं के लिए काम नहीं करता है। कुछ को Xorg जैसी सिस्टम सर्विस स्टार्टर के हिस्से के रूप में शुरू करने की आवश्यकता होती है।
user2284570

startxके लिए काम करेंगे Xorg
एरकेन गुनी

@ ErkinAlpGüney: चुरोट में नहीं ... क्योंकि डब की वजह से।
1922 को user2284570

4

कई वर्षों के दौरान मुझे स्वीकार करना चाहिए कि अधिकांश सिस्टमैड व्यावहारिक समस्याओं का केवल एक ही समाधान है। क्योंकि एरर सिस्टमड ही है

मैं वास्तव में सिस्टमड से तंग आ चुका हूं क्योंकि मुझे ऐसी समस्याएं थीं जिनका सामना मुझे कभी भी उपस्टार्ट या ओपन आर्क जैसी चीजों से नहीं करना पड़ा:

  • केवल 24Mb की रैम और कोई लिखने योग्य भंडारण के साथ एम्बेडेड सिस्टम के लिए भी एक कर्नेल की आवश्यकता को लागू करने के लिए cgroups समर्थन की आवश्यकता होती है (एक डिफ़ॉल्ट फ़ाइल के अंदर डिफ़ॉल्ट रूप से सक्षम)
  • मॉड्यूलर होने के दावे के बावजूद, रनटाइम पर निर्भरता नर्क इसे एक मजबूत ईश्वर वस्तु बनाता है: एक एकल रेज़र रूटफुट पर बूट करना चाहते हैं? यह संभव नहीं है क्योंकि कई कार्यक्रमों की आवश्यकता systemd-udevdहोती है systemd-initजिनके लिए systemd-bootपैकेज की आवश्यकता होती है जो एक ही समय में स्थापित नहीं किए जा grub2सकते हैं और न ही एक reiser4 विभाजन से कर्नेल चित्र पढ़ सकते हैं।
  • ब्लूटूथ डायलअप के माध्यम से इंटरनेट से कनेक्ट करना चाहते हैं? यदि यह आपके सैमसंग जावा मी फोन के साथ काम नहीं करता है, तो आप स्क्रिप्ट और कमांड लाइन सॉफ्टवेयर को चलाने में सक्षम नहीं हैं जो पहले मैन्युअल रूप से काम करता था networkd
  • हालांकि मैं सबसे बड़ी समस्या यह मानता हूं कि यदि आप अपने स्वयं के लिनक्स वितरण का निर्माण और रखरखाव कर रहे हैं: तो सिस्टम इनिट मॉड्यूल में ही इतनी अधिक निर्भरताएँ हैं कि आप विभिन्न इंस्टाल पैकेजों के माध्यम से अन्य इनिट सिस्टम चुनने का प्रस्ताव नहीं कर सकते।
  • लॉग देखने के लिए सौभाग्य यदि आप अपने सिस्टम में चेरोट नहीं कर सकते हैं या यदि आप libdb4.8 से अपग्रेड किए गए हैं (जबकि कम से कम, सबसे खराब स्थिति में Microsoft ने इसे xml प्रारूप में लॉग फाइल किया है)

एकमात्र समाधान :

सिस्टमड समस्याओं को हल करने के लिए एकतरफा जटिल है: ossv4 के बजाय एल्सा की तरह। इसलिए यदि आपके पास कुछ ऐसा है जो सिस्टमड का उपयोग करता है तो सभी डेटा मिटा दें:

dd if=/dev/urandom of=/dev/dm−0 bs=1M

और कुछ ऐसा स्थापित करें जो ओपनस्कैन के साथ जेंटू जैसी SysV Init की समस्याओं को हल करते समय इसका उपयोग न करें।
मेरे प्रश्न प्रणाली के बारे में Windows® रजिस्ट्री जैसी चीजें बनाती हैं: यदि इसका एक हिस्सा खराब हो जाता है, तो यह खत्म हो गया है।


3
कृपया पहचानें कि किसी चीज़ का डिज़ाइन वास्तव में उत्तर पाने से रोक सकता है ताकि उत्तर उस चीज़ पर स्विच कर सके जो काम करती है । और यह एक वास्तविक जवाब है।
user2284570

1
मेरी भी यही राय थी, अब मैं थोड़ा और संतुलित दृष्टिकोण पर हूं। सिस्टमड का सुपर-बड़ा फायदा है कि यह वास्तव में मार सकता है जिसे मारना चाहिए । ऐसा इसलिए है क्योंकि यह कर्नेल cgroup सुविधा के साथ सभी कांटे की उप-प्रक्रियाओं को ट्रैक करता है। कोई भी पुराना उपकरण ऐसा नहीं कर सकता है। इसके अलावा, क्या आपको /etc/init/*.sh?I में भी स्क्रिप्ट्स की बकवास याद है, लेकिन यह आज मेरे लिए केवल एक बुरी याद है। सिस्टमड सर्विस फाइलें स्पष्ट हैं और लगभग 10 पंक्तियाँ लंबी विन्यास हैं । 200 लाइन लंबी स्क्रिप्ट नहीं । इन विशाल फायदों में सिस्टमड है, मैं मानता हूं कि इसकी अन्य सभी विशेषताएं नुकसान हैं।
पीटर ने कहा कि मोनिका

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

@peterh: दुर्भाग्य से हर कोई इसे साझा नहीं करता है, जिसका अर्थ है कि मैं पोस्ट को हटाने की बात करता हूं। यह Systemd के खिलाफ SysV init के बारे में नहीं है, बल्कि Openrc या यहां तक ​​कि अपस्टार्ट (जो छोटी स्टार्टअप स्क्रिप्ट और साथ ही समानांतर सेवा शुरू करने की अनुमति देता है) जैसी चीजों के खिलाफ है। कम से कम मैंने एक बात सीखी: डार्विन ज्यादातर ऐप्पल ™ के हैं the विंडोज माइक्रोसॉफ्ट का is है और लिनक्स डिज़ाइन ज्यादातर लाल टोपी के साथ चलाया जाता है। हालांकि धीमा होने के दौरान SysV init आपको रनटाइम पर क्या कर सकता है, इस पर कोई रोक नहीं है।
user2284570 13

जब आप Openrc का उपयोग करते हैं तो @peterh सेवाएँ स्क्रिप्ट भी बहुत स्पष्ट होती हैं। Systemd पर cgroup की समस्या यह एक विकल्प नहीं है, जो Systemd को डार्विन या NetBSD जैसी चीजों को चलाने से रोकती है।
user2284570

3

नहीं। Systemd द्वारा सिस्टम निष्पादित किया जाता है (pid 1), न कि सीधे systemctl द्वारा (जो कि केवल एक स्टार्ट रिक्वेस्ट भेजता है), और चूंकि systemd chroot के बाहर चलता है, इसलिए यह सेवा करेगा।

यद्यपि तकनीकी रूप से इसे लागू करना संभव हो सकता है (सिस्टेक्ट्ल को किसी तरह इसकी जड़ को सिस्टमड में पास करके), यह कुछ हद तक होने की संभावना नहीं है क्योंकि पहले से ही पूर्ण कंटेनर ( systemd-nspawn /somepath/to_root) बनाने के लिए एक उपकरण है । आप हमेशा मेलिंग सूची से संपर्क कर सकते हैं ।


1
अच्छा, लेकिन मुझे होस्टल का उपयोग करने की आवश्यकता है क्योंकि मेरा होस्ट सिस्टम ऑप्नेक का उपयोग करता है। मुझे पूर्ण स्वतंत्र समाधान चाहिए
user2284570

3
मैं अभी भी कहकर पानी को मैला करूँगा: Psst! उल्लेख RootDirectory=के बाद से आप खतरनाक रूप से अपवित्र हैं। (-:
JdeBP

@JdeBP: वेरिएबल RootDirectoryऔर chrootकमांड के बीच अंतर क्या है (परिणामों की अवधि में) ?
user2284570

@grawity: तो अगर अपीयरेंस है तो क्या करें pid 1?
user2284570

1

इस समस्या का सामना करते समय एक बार चेरोट से नेटवर्क कॉन्फ़िगरेशन का उपयोग करके नेटवर्क को बचाव मोड में लाने की कोशिश की गई थी। अंत में यह मेरे लिए काम करता है:

service --skip-redirect <service> restart

या:

SYSTEMCTL_SKIP_REDIRECT=_ /etc/init.d/<service> restart

अच्छा लगा। लेकिन यह केवल विरासत इनिट संगत सेवाओं के साथ काम करता है (फेडोरा रॉहाइड में नेटवर्किंग के लिए काम नहीं करेगा) । जैसा कि मैंने अपने जवाब में कहा, असली समाधान सिस्टमैड का उपयोग करने वाली किसी भी चीज को खराब करना है।
user2284570

0

यदि आप सॉकेट सक्रियण के साथ एक inetd- शैली सेवा शुरू कर रहे हैं, तो विन्यास फाइल के साथ स्टनलाइन को लॉन्च करने पर विचार करें जो कि chetot और आपके बाइनरी दोनों को inetd- शैली लॉन्च लक्ष्य के रूप में निर्दिष्ट करता है।

ध्यान दें कि आपके पास SELINUX समस्याएँ हो सकती हैं। ओरेकल लिनक्स 7.1 सिस्टम पर, मुझे उन सभी फाइलों पर "chcon -v --type = stunnel_etc_t" पढ़ना होगा, जिन्हें पढ़ने के लिए स्टनलाइन की आवश्यकता थी।

आपको सॉकेट के क्लाइंट पक्ष पर टीएलएस एन्क्रिप्शन का उपयोग करने की आवश्यकता होगी (यानी, कॉन्फ़िगरेशन में "क्लाइंट = हां" के साथ एक और स्टनलाइन)। यदि आप इस पर अधिक जानकारी चाहते हैं तो मुझे बताएं।


नहीं, यह डी-बस जैसी चीजों के बारे में नहीं है। मैं इसे लक्ष्य chroot पर समस्याओं का निदान करने के लिए करता हूं।
user2284570

-1

आप nohupचेरोट में सेवाएं शुरू करने के लिए कमांड का उपयोग कर सकते हैं । httpdउदाहरण के लिए सेवा शुरू करने के लिए, मैं इसे इस तरह से करता हूं।

nohup httpd /dev/null &

इसे रोकने के लिए pkill httpd


Dbus जैसी सेवाओं के बारे में क्या जो केवल स्थापित बाइनरी सिस्टमड स्क्रिप्ट द्वारा शुरू किया जा सकता है?
user2284570

आप इस तरह की सेवाओं को इसकी कमांड से स्टार्ट कमांड के साथ शुरू कर सकते हैं।
११:१६ को

जो कि systemctl के खिलाफ एक सहानुभूति है। तो यह काम नहीं करता है।
user2284570

मैं अपने एंड्रॉइड पर चलने वाले फेडोरा पर हर समय ऐसा करता हूं। हो सकता है कि मैं नहीं जानता कि आपकी समस्या क्या है।
इल्यान्यु

परिणाम यह संदेश है Running in chroot, ignoring request.:। मुझे नहीं लगता कि आप इसे हर समय करते हैं, हालांकि चुरोट। दरअसल, स्टार्टअप स्क्रिप्ट को सिस्टमड की आवश्यकता होती है।
user2284570
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.