Ubuntu क्लाउड VM छवि पर `apt-daily.service` को अक्षम कैसे करें?


60

उबंटू 16.04 सर्वर वीएम छवि स्पष्ट रूप से "एपेट-डेली.स्वाइस" हर 12 घंटे या तो शुरू करती है; यह सेवा विभिन्न एपीटी से संबंधित कार्य करती है जैसे उपलब्ध पैकेजों की सूची को ताज़ा करना, यदि आवश्यक हो, तो अप्राप्य उन्नयन का प्रदर्शन करना आदि।

वीएम "स्नैपशॉट" से शुरू होने पर, सेवा तुरंत चालू हो जाती है , जैसा कि (मुझे लगता है) सिस्टमड को जल्दी से पता चलता है कि टाइमर बहुत पहले बंद हो जाना चाहिए था।

हालाँकि, एक चालू APT अन्य aptप्रक्रियाओं को चलने से रोकता है क्योंकि यह एक लॉक रखता है /var/lib/dpkg। यह इंगित करने वाला त्रुटि संदेश इस तरह दिखता है:

E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

मुझे इस स्वचालित APT कार्य को अक्षम करने की आवश्यकता है जब तक कि Ansible ने मशीन सेटअप पूरा नहीं कर लिया है (जिसमें आमतौर पर पैकेज स्थापित करना शामिल है); अधिक जानकारी और संदर्भ के लिए https://github.com/gc3-uzh-ch/elasticluster/issues/304 देखें ।

मैंने "उपयोगकर्ता डेटा" स्क्रिप्ट के माध्यम से "अनअटेंडेड अपग्रेड" सुविधा को अक्षम करने के लिए विभिन्न विकल्पों की कोशिश की है cloud-init, लेकिन उनमें से सभी अब तक विफल रहे हैं।

1. सिस्टमड कार्य को अक्षम करें

systemd कार्य apt-daily.serviceको ट्रिगर करता है apt-daily.timer। मैंने निम्नलिखित आदेशों के विभिन्न cobments के साथ एक या दूसरे को या दोनों को अक्षम करने की कोशिश की है; apt-daily.serviceVM द्वारा SSH कनेक्शन स्वीकार करने के लिए तैयार होने के बाद भी, कुछ क्षणों के लिए शुरुआत की जाती है ::

    #!/bin/bash

    systemctl stop apt-daily.timer
    systemctl disable apt-daily.timer
    systemctl mask apt-daily.service
    systemctl daemon-reload

2. कॉन्फ़िगर विकल्प को अक्षम करें APT::Periodic::Enable

स्क्रिप्ट /usr/lib/apt/apt.systemd.dailyकुछ APT कॉन्फ़िगरेशन चर पढ़ता है; सेटिंग APT::Periodic::Enableपूरी तरह से कार्यक्षमता को निष्क्रिय कर देती है (लाइनें 331--337)। मैंने इसे निम्नलिखित स्क्रिप्ट के साथ अक्षम करने का प्रयास किया है ::

    #!/bin/bash

    # cannot use /etc/apt/apt.conf.d/10periodic as suggested in
    # /usr/lib/apt/apt.systemd.daily, as Ubuntu distributes the
    # unattended upgrades stuff with priority 20 and 50 ...
    # so override everything with a 99xxx file
    cat > /etc/apt/apt.conf.d/99elasticluster <<__EOF
    APT::Periodic::Enable "0";
    // undo what's in 20auto-upgrade
    APT::Periodic::Update-Package-Lists "0";
    APT::Periodic::Unattended-Upgrade "0";
    __EOF

हालांकि, कमांड लाइन से APT::Periodic::Enableमूल्य होने के बावजूद 0(नीचे देखें), unattended-upgradesकार्यक्रम अभी भी चलाया जाता है ...

    ubuntu@test:~$ apt-config shell AutoAptEnable APT::Periodic::Enable
    AutoAptEnable='0'

3. /usr/lib/apt/apt.systemd.dailyपूरी तरह से हटा दें

निम्नलिखित cloud-initस्क्रिप्ट पूरी तरह से अप्राप्त अपग्रेड स्क्रिप्ट को हटा देती है ::

    #!/bin/bash

    mv /usr/lib/apt/apt.systemd.daily /usr/lib/apt/apt.systemd.daily.DISABLED

फिर भी, कार्य चलता है और मैं इसे प्रक्रिया तालिका में देख सकता हूं! हालाँकि कमांड लाइन से जांच की गई तो फ़ाइल मौजूद नहीं है ::

ubuntu@test:~$ ls /usr/lib/apt/apt.systemd.daily
ls: cannot access '/usr/lib/apt/apt.systemd.daily': No such file or directory

ऐसा लगता है जैसे cloud-initस्क्रिप्ट (SSH कमांड-लाइन के साथ) और रूट systemd प्रक्रिया अलग-अलग फाइल सिस्टम और प्रोसेस ...

प्रशन

क्या ज़ाहिर तौर पर कुछ ऐसा है, जिसका मुझे स्मरण नहीं है? या क्या कुछ नामचीन जादू चल रहा है जिसके बारे में मुझे जानकारी नहीं है?

सबसे महत्वपूर्ण: मैं स्क्रिप्ट के apt-daily.serviceमाध्यम से कैसे निष्क्रिय कर सकता हूं cloud-init?


2
यह तब तक आपकी मदद करने वाला नहीं है, जब तक कि यह आधिकारिक पैकेज अपडेट में शामिल नहीं हो जाता, लेकिन कृपया मुझे केवल डेबियन बग # 8443 पर पोस्ट किए गए पैच को देखें ।
zwol

हो सकता है कि बदलाव को तुरंत प्रभावी बनाने के लिए आप कमांड में --nowध्वज को याद कर रहे हों systemctl disable। यह मेरा मुद्दा था।
डैनियल एफ

@DanielF नहीं, क्योंकि इसके बाद के disable --nowबराबर stopहै disable
sourcejedi

1
जाहिरा तौर पर यह किया गया है अंत में 2019 फ़रवरी systemd में ठीक किया गया: github.com/systemd/systemd/issues/5659 । तो उम्मीद है कि यह उबंटू 20.04 में होगा।
स्नैप

जवाबों:


38

हां, कुछ स्पष्ट था कि मैं गायब था।

सिस्टमड सेवाओं के समवर्ती शुरुआत के बारे में है, इसलिए cloud-initस्क्रिप्ट उसी समयapt-daily.service चालू होती है जब ट्रिगर किया जाता है। cloud-initउपयोगकर्ता द्वारा निर्दिष्ट पेलोड को निष्पादित करने के लिए समय लगने से, apt-get updateपहले से ही चल रहा है। इसलिए प्रयास 2. और 3. कुछ नामस्थान जादू के कारण असफल नहीं हुए, बल्कि इसलिए कि उन्होंने apt.systemd.dailyबदलावों को लेने के लिए सिस्टम को बहुत देर कर दिया।

इसका मतलब यह भी है कि मूल रूप से चलने से रोकने का कोई तरीका नहीं है apt.systemd.daily- इसे शुरू करने के बाद ही कोई इसे मार सकता है।

यह "उपयोगकर्ता डेटा" स्क्रिप्ट इस मार्ग को ले जाता है ::

#!/bin/bash

systemctl stop apt-daily.service
systemctl kill --kill-who=all apt-daily.service

# wait until `apt-get updated` has been killed
while ! (systemctl list-units --all apt-daily.service | egrep -q '(dead|failed)')
do
  sleep 1;
done

# now proceed with own APT tasks
apt install -y python

अभी भी एक समय खिड़की है जिसके दौरान SSH लॉगिन संभव है, अभी तक apt-get नहीं चलेगा, लेकिन मैं एक और समाधान की कल्पना नहीं कर सकता जो कि Ubuntu 16.04 क्लाउड इमेज पर काम कर सके।


यह मेरे लिए काम पर ubuntu 16.04, समाधान के लिए धन्यवाद
krisdigitx

हां, मैं एक कस्टम एएमआई बनाने की राह पर चल रहा हूं। इससे सामान्य सेवाओं की स्थापना में भी तेजी आती है।
जियोर्जियोसिरोनी

यह पर्याप्त प्रतीत नहीं होता है, मुझे लगता है कि वहाँ अभी भी झटके के उदाहरण हैंapt-get -o Acquire::http::AllowRedirect=false update
एडवर्ड जेड यांग

12

नोट: दुर्भाग्य से नीचे दिए गए समाधान का हिस्सा उबंटू 16.04 सिस्टम (जैसे कि प्रश्नकर्ता) systemd-runपर काम नहीं करता है क्योंकि सुझाए गए आह्वान केवल उबंटू 18.04 और इसके बाद के संस्करण पर काम करते हैं ( विवरण के लिए टिप्पणियां देखें )। मैं यहाँ उत्तर छोड़ दूंगा क्योंकि यह सवाल अभी भी एक लोकप्रिय हिट है कि आप किस उबंटू संस्करण का उपयोग कर रहे हैं ...

उबंटू 18.04 (और ऊपर) में बूट टाइम एप / अपडेट / अपग्रेड में शामिल दो सेवाओं तक हो सकता है। पहले apt-daily.serviceसंकुल की सूची को ताज़ा करता है। हालांकि एक दूसरा भी हो सकता है apt-daily-upgrade.serviceजो वास्तव में सुरक्षा महत्वपूर्ण पैकेज स्थापित करता है। एक "बर्खास्त और अक्षम / आदेश रिटर्न से पहले पहुंच से बाहर उन्नयन हटाने" का जवाब सवाल इन दोनों के लिए प्रतीक्षा करने के लिए कैसे खत्म करने के लिए एक उत्कृष्ट उदाहरण (यहाँ सुविधा के लिए नकल की) देता है:

systemd-run --property="After=apt-daily.service apt-daily-upgrade.service" --wait /bin/true

(ध्यान दें कि इसे रूट के रूप में चलाया जाना है)। यदि आप भविष्य के जूते पर इन सेवाओं को निष्क्रिय करने की कोशिश कर रहे हैं, तो आपको बीओटीएच सेवाओं को मास्क करना होगा:

systemctl mask apt-daily.service apt-daily-upgrade.service

वैकल्पिक रूप से आप systemctl disableदोनों सेवाओं और उनके संबंधित टाइमर (यानी apt-daily.timerऔर apt-daily-upgrade.timer) कर सकते हैं।

इस उत्तर में मास्किंग / अक्षम करने वाली तकनीकों पर ध्यान दें, केवल भविष्य के बूट पर अपडेट / अपग्रेड को रोकते हैं - यदि वे पहले से ही चालू बूट में चल रहे हैं तो उन्हें रोक नहीं पाएंगे।


2
बहुत बढ़िया जवाब, धन्यवाद! हालांकि, ध्यान दें कि systemd-runउबंटू 16.04 --waitविकल्प का समर्थन करने के लिए बहुत पुराना है , लेकिन यह वास्तव में हाथ में उद्देश्य के लिए आवश्यक नहीं होना चाहिए। (मैन पेज के अनुसार, एक इकाई --waitकी समाप्ति की प्रतीक्षा करता है , लेकिन इसकी शुरुआत के लिए प्रतीक्षा करने के लिए पर्याप्त है जो कि डिफ़ॉल्ट व्यवहार है systemd-run।)
रिकार्डो मुरी

मैं सही खड़ा हूं: दिए गए उबंटू उबंटू 16.04 पर बिल्कुल भी काम नहींsystemd-run करता है ; यह त्रुटि संदेश के साथ मर जाता है अज्ञात असाइनमेंट के बाद = apt-daily.service apt-daily-upgrade.service । ऐसा लगता है कि कुछ यूनिट गुण उपलब्ध नहीं थे , उदाहरण के लिए यहाँ देखेंsystemd-run
रिकार्डो मुर्री

@ रिकार्डो-मुरी तुम मुझे :-)! मैं वास्तव में खुद के बारे में 16.04 / 18.04 के बारे में सोच रहा था (इसलिए वीसेली ने "दो तक") और फिर कैविएट को डालना भूल गया। आप क्या बदलाव सुझाएंगे?
एनॉन १

@ riccardo-murri आह यह बहुत बुरा है मैं जवाब के शीर्ष पर एक बड़ी चेतावनी जोड़ूंगा, यह उबंटू 16.04 पर इस्तेमाल नहीं किया जा सकता
एनॉन

सेवाओं को अक्षम कर दिया और पुनः आरंभ किया और यह काम करता है!
डाइजेन्6666

4

आप इसे "bootcmd" क्लाउड-इनिट मॉड्यूल के माध्यम से अक्षम कर सकते हैं। नेटवर्क लाने से पहले यह चलता है, जिसे एप अपडेट करने से पहले चलाने का मौका मिल सकता है।

#cloud-config
bootcmd:
    - echo 'APT::Periodic::Enable "0";' > /etc/apt/apt.conf.d/10cloudinit-disable
    - apt-get -y purge update-notifier-common ubuntu-release-upgrader-core landscape-common unattended-upgrades
    - echo "Removed APT and Ubuntu 18.04 garbage early" | systemd-cat

एक बार जब आप उदाहरण में ssh, आप भी खत्म होने के लिए क्लाउड-इनिट के अंतिम चरणों की प्रतीक्षा करनी चाहिए, क्योंकि यह उपयुक्त स्रोतों / सूचियों को स्थानांतरित करता है।

# Wait for cloud-init to finish moving apt sources.list around... 
# a good source of random failures
# Note this is NOT a replacement for also disabling apt updates via bootcmd
while [ ! -f /var/lib/cloud/instance/boot-finished ]; do
    echo 'Waiting for cloud-init to finish...'
    sleep 3
done

यह देखने के लिए भी उपयोगी है कि बूटकैम कितनी जल्दी चलता है:

# Show microseconds in systemd journal
journalctl -r -o short-precise

आप इस प्रकार काम कर सकते हैं:

apt-config dump | grep Periodic

# Verify nothing was updated until we run apt update ourselves.
cd /var/lib/apt/lists
sudo du -sh .   # small size
ls -ltr         # old timestamps

2

इकाई का मुखौटा लगाना आसान नहीं होगा

systemctl mask apt-daily.service

?


काम नहीं करता है - अनुभाग देखें 1. प्रश्न के पाठ में सिस्टमड कार्य को अक्षम करें । लेकिन सुझाव के लिए वैसे भी धन्यवाद! :-)
रिकार्डो मुरी

2
अक्षम और एक सेवा मुखौटा एक ही नहीं है। मास्क / देव / अशक्त के लिए एक लिंक बनाएँ। ls -al /etc/systemd/system/ | grep alsa lrwxrwxrwx 1 root root 9 Sep 1 13:17 alsa-init.service -> /dev/nullडेटा खाली है।

2
मैं अप्राप्य उन्नयन से छुटकारा पाने के लिए sudo dpkg-reconfigure -plow unattended-upgradesऔर इसे मना कर दिया। तो इकाई apt-daily.service की स्थिति मृत है।

हाय @Bautut आपके प्रयासों के लिए धन्यवाद! हालांकि, यह सवाल है कि स्क्रिप्ट apt-daily.serviceसे कैसे निष्क्रिय किया जाए और वीएम रिबूट के बाद शुरू होने से पहले: इसका मतलब है: (1) इसे गैर-अंतःक्रियात्मक रूप से किया जाना चाहिए, (2) इसे पहली बार आग से पहले किया जाना चाहिए । (अगर सिस्टमड की मेरी समझ सही है, (2) वास्तव में पूरा नहीं किया जा सकता है और समवर्ती रूप से चलाया जा सकता है - अधिक के लिए मेरा जवाब देखें।)cloud-initapt-daily.servicecloud-initapt-daily
रिकार्डो मुरारी

1
मैंने इसे एक सामान्य भौतिक मशीन पर आज़माया (यानी VM नहीं) और यह पुष्टि कर सकता है कि यह काम नहीं करता है। आपको टाइमर को बंद करने की भी आवश्यकता है: systemctl stop apt-daily.timer; systemctl apt-daily.timer
happyskeptic

1

यह एक व्हिल लूप में 1sec की प्रतीक्षा करता है और लॉक जारी होने पर जांच करता है।

while : ; do
                sleep 1
                echo $( ps aux | grep -c lock_is_held ) processes are using apt.
                ps aux | grep -i apt
                [[ $( ps aux | grep -c lock_is_held ) > 2 ]] || break
        done
        echo Apt released
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.