উবুন্টু ক্লাউড ভিএম চিত্রে কীভাবে `apt-daily.serviceserv অক্ষম করবেন?


59

উবুন্টু 16.04 সার্ভার ভিএম ইমেজটি দৃশ্যত প্রতি 12 ঘন্টা বা তার পরে "অ্যাপট-ডেইলি। সার্ভিস" শুরু করে; এই পরিষেবাটি এপিটি-সম্পর্কিত বিভিন্ন কার্য সম্পাদন করে যেমন উপলভ্য প্যাকেজগুলির তালিকাকে রিফ্রেশ করা, প্রয়োজনে অপ্রত্যাশিত আপগ্রেড করা ইত্যাদি etc.

কোনও ভিএম "স্ন্যাপশট" থেকে শুরু করার সাথে সাথে পরিষেবাটি তাত্ক্ষণিকভাবে ট্রিগার করা হয় , (আমি অনুমান করি) সিস্টেমড দ্রুত বুঝতে পারে যে টাইমারটি অনেক আগেই বন্ধ হওয়া উচিত ছিল।

যাইহোক, একটি চলমান এপিটি 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?

উত্তরীয় মেশিন সেটআপ সম্পন্ন না করা পর্যন্ত আমাকে এই স্বয়ংক্রিয় এপিটি কার্যটি নিষ্ক্রিয় করতে হবে (যার মধ্যে সাধারণত প্যাকেজ ইনস্টল করা জড়িত); দেখতে https://github.com/gc3-uzh-ch/elasticluster/issues/304 আরও তথ্য এবং প্রসঙ্গ জন্য।

"অপ্রয়োজনীয় আপগ্রেড" বৈশিষ্ট্যটি "ব্যবহারকারী ডেটা" স্ক্রিপ্টের মাধ্যমে অক্ষম করার জন্য আমি বিভিন্ন বিকল্পের চেষ্টা করেছি cloud-init, তবে এগুলি এখনও পর্যন্ত ব্যর্থ হয়েছে।

1. সিস্টেমযুক্ত কাজটি অক্ষম করুন

systemd টাস্ক apt-daily.serviceদ্বারা ট্রিগার করা হয় apt-daily.timer। আমি নিম্নলিখিত কমান্ডগুলির বিভিন্ন কোবিনেশন সহ একটি বা অন্য, বা উভয়কে অক্ষম করার চেষ্টা করেছি; তবুও, apt-daily.serviceভিএম এসএসএইচ সংযোগগুলি গ্রহণ করতে প্রস্তুত হওয়ার কয়েক মুহুর্ত পরে শুরু হয়েছে ::

    #!/bin/bash

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

২. কনফিগারেশন বিকল্পটি অক্ষম করুন APT::Periodic::Enable

স্ক্রিপ্ট /usr/lib/apt/apt.systemd.dailyকয়েকটি এপিটি কনফিগারেশন ভেরিয়েবলগুলি পড়ে; সেটিংস 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স্ক্রিপ্ট (এসএসএইচ কমান্ড-লাইনের সাথে একত্রে) এবং মূল সিস্টেমড প্রক্রিয়া পৃথক ফাইল সিস্টেম এবং প্রক্রিয়া স্পেসগুলিতে চালিত হয় ...

প্রশ্নাবলি

আমি কি অনুপস্থিত কিছু স্পষ্টত আছে? বা এমন কোনও নেমস্পেস যাদু চলছে যা সম্পর্কে আমি অবগত নই?

সর্বাধিক গুরুত্বপূর্ণ: আমি কীভাবে apt-daily.serviceকোনও cloud-initস্ক্রিপ্টের মাধ্যমে অক্ষম করতে পারি ?


2
এই পর্যন্ত এটি একটি সরকারী প্যাকেজ আপডেট মধ্যে সমন্বিত পরার আপনাকে সাহায্য করার জন্য, কিন্তু দয়া করে দেখুন যাচ্ছে না প্যাচ আমি শুধু ডেবিয়ান বাগ # 844453 পোস্ট
zwol

পরিবর্তনটি তত্ক্ষণাত কার্যকর করার জন্য আপনি কমান্ডের --nowপতাকাটি নিখোঁজ systemctl disableকরতে পারেন। এটা আমার সমস্যা ছিল।
ড্যানিয়েল এফ

@ ড্যানিয়েলএফ নং, কারণ অনুসরণ করা disable --nowসমান । stopdisable
সোর্সজেডি

1
দৃশ্যত এই হয়েছে অবশেষে মধ্যে 2019 ফেব্রুয়ারী systemd হল সংশোধন: github.com/systemd/systemd/issues/5659 । সুতরাং আশা করি এটি উবুন্টু 20.04 এ হবে।
স্ন্যাপ করুন

উত্তর:


37

হ্যাঁ, এখানে কিছু স্পষ্ট ছিল যে আমি অনুপস্থিত ছিলাম।

সিস্টেমড হ'ল পরিষেবাগুলির একযোগে শুরু, তাই 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

এখনও একটি সময় উইন্ডো রয়েছে যার সময় এসএসএইচ লগইনগুলি এখনও apt-get চালানো সম্ভব নয়, তবে আমি অন্য একটি সমাধান কল্পনা করতে পারি না যা উবুন্টু 16.04 ক্লাউড ইমেজের স্টকটিতে কাজ করতে পারে।


এটি আমার জন্য উবুন্টু 16.04 এ কাজ করেছে, সমাধানটির জন্য ধন্যবাদ
ক্রিডজিটিক্স

হ্যাঁ, আমি একটি কাস্টম এএমআই তৈরির পথে যাচ্ছি। এটি সাধারণ পরিষেবাগুলির ইনস্টলেশনের গতিও করে।
জিওরিজিওসিরনি

এটি যথেষ্ট বলে মনে হচ্ছে না, এখনও খুঁজে পাওয়া যায় নাapt-get -o Acquire::http::AllowRedirect=false update
এডওয়ার্ড জেড ইয়াং ইয়াং

11

দ্রষ্টব্য: দুর্ভাগ্যক্রমে নীচের সমাধানের অংশটি উবুন্টু ১.0.০৪ সিস্টেমে (যেমন প্রশ্নকারীর মতো) তেমন কাজ করে না কারণ প্রস্তাবিত systemd-runপ্রার্থনাটি কেবল উবুন্টুতে ১৮.০৪ এবং তার উপরে কাজ করে ( বিশদগুলির জন্য মন্তব্যগুলি দেখুন )। আমি উত্তরটি এখানে রেখে দেব কারণ আপনি যে উবুন্টু সংস্করণটি ব্যবহার করছেন তা নির্বিশেষে এই প্রশ্নটি এখনও জনপ্রিয় হিট ...

উবুন্টু 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অপশনটি সমর্থন করার পক্ষে খুব পুরানো , তবে এটি উদ্দেশ্যটির পক্ষে প্রয়োজন নেই। (Man পৃষ্ঠা মতে, --waitজন্য অপেক্ষা পরিসমাপ্তি একটি ইউনিট কিন্তু এটা তার সূচনা যার ডিফল্ট আচরণ জন্য অপেক্ষা করতে যথেষ্ট systemd-run।)
Riccardo Murri

আমি সংশোধন করে দাঁড়িয়েছি: প্রদত্ত systemd-runআগুনটি উবুন্টুতে 16.04 এ মোটেই কাজ করে না ; এটি ত্রুটির বার্তার সাথে মরে যায় অজানা অ্যাসাইনমেন্ট = apt-daily.service অ্যাপ্ট-ডেইলি-আপগ্রেড.সার্ভিস পরে । দেখে মনে হচ্ছে কিছু ইউনিটের সম্পত্তি পাওয়া যায় নি systemd-run, উদাহরণস্বরূপ এখানে দেখুন
রিকার্ডো মুরি

@ রিচার্ডো-মুরি আপনি আমাকে পেয়েছেন :-)! আমি নিজেই 16.04 / 18.04 এর মধ্যে নিজের মধ্যে পার্থক্য সম্পর্কে ভাবছিলাম (অতএব weaselly "দুই অবধি") এবং তারপরে ক্যাভেটটি রাখা ভুলে গেছি What আপনি কী পরিবর্তন প্রস্তাব করবেন?
আনন

@ রিচার্ডো-মুরি আহ খুব খারাপ যে আমি উত্তরের উপরে একটি বড় সতর্কতা যুক্ত করব যে এটি উবুন্টু 16.04 এ ব্যবহার করা যাবে না
আনন

পরিষেবাগুলি অক্ষম করে পুনরায় আরম্ভ করুন এবং এটি কাজ করে!
digz6666

3

আপনি এটি "বুটসিএমডি" ক্লাউড-ইডি মডিউলটির মাধ্যমে অক্ষম করতে পারেন। নেটওয়ার্কটি সামনে আনার আগে এটি চলবে, যা অ্যাপটি আপডেট চালানোর সুযোগ পাওয়ার আগে প্রয়োজনীয়।

#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

উদাহরণস্বরূপ আপনি একবার অনুসন্ধান করার পরে, আপনার ক্লাউড-থ্রিমের চূড়ান্ত পর্যায়ক্রমিক সমাপ্তির জন্যও অপেক্ষা করা উচিত, যেহেতু এটি উত্স উত্স / তালিকাকে চারদিকে ঘুরিয়ে দেয়।

# 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

1

ইউনিটটি মাস্ক করা সহজ নয় oud

systemctl mask apt-daily.service

?


কাজ করে না - বিভাগ 1 দেখুন question প্রশ্নের লেখায় সিস্টেমযুক্ত কাজটি অক্ষম করুন । তবে পরামর্শের জন্য যাইহোক ধন্যবাদ! :-)
রিকার্ডো মুরি

2
কোনও পরিষেবা অক্ষম করুন এবং মুখোশ করুন এক নয়। মাস্ক একটি লিঙ্ক তৈরি / dev / নাল। 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কোনও cloud-initস্ক্রিপ্ট থেকে কীভাবে অক্ষম করা যায় এবং ভিএম রিবুট হওয়ার পরে এটি শুরু হওয়ার আগে: এর অর্থ: (1) এটি অবশ্যই আন্তঃ-ইন্টারেক্টিভভাবে করা উচিত, (2) এটি apt-daily.serviceপ্রথমবারের জন্য অগ্নিকাণ্ডের আগে করা উচিত । (যদি সিস্টেমড সম্পর্কে আমার ধারণাটি সঠিক হয়, (2) আসলে হিসাবে হিসাবে সম্পাদন করা যাবে নাcloud-init এবং apt-dailyএকই সাথে চালানো যেতে পারে - আরও তার জন্য আমার নিজের উত্তর দেখুন))
রিকার্ডো মুরি

1
আমি এটি একটি সাধারণ শারীরিক মেশিনে (যেমন কোনও ভিএম নয়) চেষ্টা করেছি এবং নিশ্চিত করতে পারি যে এটি কাজ করে না। আপনাকে টাইমারটি থামাতে হবে: systemctl স্টপ apt-daily.timer; systemctl অ্যাপ্ট-ডেইলি.টিমার অক্ষম করুন
হ্যাপিস্কেপটিক

0

এটি এক ঝাঁকুনিতে 1 সেকেন্ডের জন্য অপেক্ষা করে এবং লকটি প্রকাশিত হয় কিনা তা পরীক্ষা করে।

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.