मैं उनकी संबंधित सेवाओं को शुरू किए बिना पैकेज कैसे स्थापित कर सकता हूं?


13

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

यह मेरे लिए एक समस्या है।

मैंने खुद को LXC कंटेनरों के निर्माण के लिए टेम्पलेट्स का प्रबंधन करने की आवश्यकता पाई है। कई कंटेनर हैं, जिनमें से प्रत्येक में डेबियन या उबंटू रिलीज़ होता है। (रेड हैट-आधारित कंटेनर भी हैं, लेकिन वे यहां प्रासंगिक नहीं हैं।)

/var/lib/libvirt/filesystems/debian6_template
/var/lib/libvirt/filesystems/debian7_template
/var/lib/libvirt/filesystems/ubuntu1004_template
/var/lib/libvirt/filesystems/ubuntu1204_template

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

उदाहरण के अनुसार, मैंने पाया कि टेम्पलेट्स में एक सैसलॉग डेमॉन नहीं था, इसलिए मैंने एक स्थापित किया:

for template in /var/lib/libvirt/filesystems/{debian,ubuntu}*_template; do
    chroot $template apt-get install rsyslog
done

और तुरंत rsyslog की चार प्रतियों के साथ चल रहा है। Exim4 की दो प्रतियों का उल्लेख नहीं। ऊप्स!


मैं कहीं पढ़ता हूं (हालांकि अब मैं इसे दोबारा नहीं पा सकता) चेरोट में चलने के दौरान सेवाओं को शुरू करने के लिए नहीं माना जाता है, लेकिन यह स्पष्ट रूप से यहां नहीं है।

एक संभावित व्यवहार्य गंदा हैक कॉल के लिए अस्थायी रूप से विभिन्न आदेशों की जगह लेता है जो वास्तव में सेवाएं शुरू करते हैं, जैसे कि start-stop-daemonऔर initctl, हालांकि यह बहुत अधिक काम है जो मैं वास्तव में करना चाहता था। अगर मेरे पास कोई अन्य विकल्प नहीं है, हालांकि ...

यहां आदर्श समाधान डेबियन-आधारित सिस्टम के लिए इस बकवास को रोकने के लिए होगा, लेकिन यह असफल हो सकता है कि, शायद एक अस्पष्ट या अनिर्दिष्ट कमांड लाइन विकल्प के लिए apt-get?

यदि यह स्पष्ट नहीं था, तो मैं वास्तव में यदि संभव हो तो टेम्प्लेट के बाहर टेम्पलेट्स के प्रबंधन से संबंधित कुछ भी रखना चाहता हूं ।

जवाबों:


23

डेबियन के लिए आप पॉलिसी-आरओडीडी के साथ ऐसा कर सकते हैं । यहाँ एक स्पष्टीकरण है :

एक पैकेज की अनुरक्षक स्क्रिप्ट केवल इनोक प्रणाली के साथ इनवोक- rc.d, अपडेट- rc.d और एलएसबी इनिट स्क्रिप्ट हेडर के माध्यम से इंटरफेस करने के लिए माना जाता है ... इनवोक-आरओडी, अपनी कार्रवाई करने से पहले, जाँच करेगा कि क्या /usr/sbin/policy-rc.d निष्पादन योग्य है, इसे संबंधित सेवा नाम और इसकी कमांड लाइन पर वर्तमान रनवेवल संख्या के साथ कॉल करेगा और इसके निकास कोड के अनुसार कार्य करेगा। उदाहरण के लिए, 101 का रिटर्न मान नियोजित कार्रवाई को रोकने से रोक देगा। इसमें पैकेज स्थापना पर सेवा की स्वचालित शुरुआत और पैकेज हटाने पर सेवा को रोकना शामिल है और पैकेज अपग्रेड के दौरान स्टॉप-अपग्रेड-रीस्टार्ट अनुष्ठान को कम करके केवल अपग्रेड करने का कार्य करना है जो सेवा के पुराने संस्करण को छोड़ सकता है।

चूँकि आप चाहते हैं कि कोई भी सेवाएं कभी भी शुरू न हों, इसलिए आपकी पॉलिसी- rc.d स्क्रिप्ट बस हो सकती है

#!/bin/sh
exit 101

यह एक प्रकार की तकनीक है जो कि पाइलडर और डॉकर के mkimage-debootstrap जैसे उपकरणों द्वारा उपयोग की जाती है ।

दुर्भाग्य से, यह तकनीक उबंटू चेरोट्स के साथ काम नहीं करती है । स्थापना के दौरान इनवोक- rc.d के बजाय upstart init सिस्टम कॉल / usr / sbin / initctl के साथ एकीकृत करने वाले पैकेज और initctl नीति-rc.d से परामर्श नहीं करता है। अपस्टार्ट के लेखक के अनुसार वर्कअराउंड / सिबिन / इनिटैक्टल को सिम्क्लिन के साथ / बिन / ट्रू को चेरोट में बदलना है। आप इसे mimimage-debootstrap में भी देख सकते हैं, वे करते हैं

dpkg-divert --local --rename --add /sbin/initctl
ln -sf /bin/true sbin/initctl

यह बहुत साफ लगता है, हालांकि इसे भी टेम्पलेट से एक कंटेनर बनाने से पहले निकालना होगा।
माइकल हैम्पटन

1
इसके लिए धन्यवाद। मैं अंत में सिर्फ डॉकर की mimimage-debootstrap स्क्रिप्ट को चीर कर समाप्त हो सकता हूं, क्योंकि वे ज्यादातर इस समस्या को हल करते हैं।
माइकल हैम्पटन

4

तुम कर सकते हो:

export RUNLEVEL=1
for template in /var/lib/libvirt/filesystems/{debian,ubuntu}*_template; do
    chroot $template apt-get install rsyslog
done
exit

मैंने चेरोट के साथ इसका परीक्षण नहीं किया है, लेकिन यह काम करना चाहिए। सबसे पहले यह RUNLEVEL पर्यावरण चर को सेट करता है, इसलिए apt-get द्वारा शुरू की गई प्रक्रियाएं कोई भी सेवा शुरू नहीं करेंगी , क्योंकि वे "थिंक" सिस्टम सिंगल मोड में चल रही हैं। जैसा कि पर्यावरण को संशोधित किया जाता है जिस तरह से यह भविष्य के आदेशों को प्रभावित कर सकता है, शेल को बाहर निकलने की आवश्यकता होती है जब संशोधित वातावरण की आवश्यकता नहीं होती है, यह अंत में निकास आदेश द्वारा पूरा किया जाता है । वहाँ हो सकता है कुछ (दुर्लभ?) संकुल है कि एकल मोड (लेकिन AFAIK ज्यादातर मामलों में इस समस्या को नहीं होना चाहिए) में ठीक से स्थापित नहीं होंगे।


क्या export RUNLEVEL=1यहाँ महत्वपूर्ण हिस्सा है? क्या वास्तव में यह होने का कारण बनता है?
माइकल हैम्पटन

@ मिचेल हैम्पटन का मानना ​​है कि रनवे का पर्यावरण वैरिएबल वर्तमान रन स्तर प्रदान करेगा। इस उदाहरण में, वह इसे केवल इसलिए लिख रहा है ताकि कोई भी आवेदन यह सोच ले कि यह 1 पर चल रहा है। यह "कीचड़" की तरह है, लेकिन इसे पर्याप्त होना चाहिए।
विंकीवौली

मूल उत्तर के लिए स्पष्टीकरण जोड़ा गया। मूल रूप से यह बात @ @WinkyWolly ने कही है।
डेविसएनटी

दुर्भाग्य से rsyslog"दुर्लभ" पैकेजों में से एक हुआ जो इस तरह से स्थापित करने की कोशिश करते समय पूरी तरह से उड़ा दिया। यह अभी भी उपयोगी हो सकता है, हालांकि, आप ऊपर रख सकते हैं :)
माइकल हैम्पटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.