Gambar Ubuntu server 16,04 rupanya memulai "apt-daily.service" setiap 12 jam atau lebih; layanan ini melakukan berbagai tugas terkait APT seperti memperbarui daftar paket yang tersedia, melakukan peningkatan tanpa pengawasan jika diperlukan, dll.
Ketika mulai dari "snapshot" VM, layanan dipicu segera , karena (saya kira) systemd menyadari dengan cepat bahwa timer seharusnya sudah mati sejak lama.
Namun, menjalankan APT mencegah apt
proses lain dari berjalan karena memegang kunci /var/lib/dpkg
. Pesan kesalahan yang menunjukkan ini terlihat seperti ini:
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?
Saya perlu menonaktifkan tugas APT otomatis ini sampai Ansible telah menyelesaikan pengaturan mesin (yang biasanya melibatkan pemasangan paket); lihat https://github.com/gc3-uzh-ch/elasticluster/issues/304 untuk info dan konteks lebih lanjut.
Saya telah mencoba berbagai opsi untuk menonaktifkan fitur "peningkatan tanpa pengawasan" melalui skrip "data pengguna" cloud-init
, tetapi semuanya gagal sejauh ini.
1. Nonaktifkan tugas systemd
tugas systemd apt-daily.service
dipicu oleh apt-daily.timer
. Saya telah mencoba untuk menonaktifkan satu atau yang lain, atau keduanya, dengan berbagai kombinasi dari perintah berikut; masih, apt-daily.service
beberapa saat dimulai setelah VM menjadi siap untuk menerima koneksi SSH ::
#!/bin/bash
systemctl stop apt-daily.timer
systemctl disable apt-daily.timer
systemctl mask apt-daily.service
systemctl daemon-reload
2. Nonaktifkan opsi konfigurasi APT::Periodic::Enable
Script /usr/lib/apt/apt.systemd.daily
membaca beberapa variabel konfigurasi APT; pengaturan APT::Periodic::Enable
menonaktifkan fungsi sama sekali (baris 331-337). Saya telah mencoba menonaktifkannya dengan skrip berikut ::
#!/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
Namun, meskipun APT::Periodic::Enable
memiliki nilai 0
dari baris perintah (lihat di bawah), unattended-upgrades
program ini masih berjalan ...
ubuntu@test:~$ apt-config shell AutoAptEnable APT::Periodic::Enable
AutoAptEnable='0'
3. Hapus /usr/lib/apt/apt.systemd.daily
semuanya
cloud-init
Skrip berikut menghapus skrip upgrade yang tidak dijaga sama sekali ::
#!/bin/bash
mv /usr/lib/apt/apt.systemd.daily /usr/lib/apt/apt.systemd.daily.DISABLED
Tetap saja, tugasnya berjalan dan saya bisa melihatnya di tabel proses! meskipun file tidak ada jika diselidiki dari baris perintah ::
ubuntu@test:~$ ls /usr/lib/apt/apt.systemd.daily
ls: cannot access '/usr/lib/apt/apt.systemd.daily': No such file or directory
Tampaknya seolah-olah cloud-init
skrip (bersama-sama dengan SSH command-line) dan proses systemd mengeksekusi di filesystem terpisah dan ruang proses ...
Pertanyaan
Apakah ada sesuatu yang jelas saya hilang? Atau adakah keajaiban namespace yang terjadi yang tidak saya sadari?
Yang paling penting: bagaimana saya bisa menonaktifkan apt-daily.service
melalui
cloud-init
naskah?
sumber
--now
bendera disystemctl disable
perintah untuk membuat perubahan itu efektif dengan segera. Itu masalah saya.disable --now
sama denganstop
diikuti olehdisable
.Jawaban:
Ya, ada sesuatu yang jelas bahwa saya hilang.
Systemd adalah semua tentang awal bersamaan pelayanan, sehingga
cloud-init
naskah dijalankan pada saat yang sama yangapt-daily.service
dipicu. Pada saatcloud-init
mengeksekusi payload yang ditentukan pengguna,apt-get update
sudah berjalan. Jadi upaya 2. dan 3. gagal bukan karena beberapa namespace magic, tetapi karena mereka mengubah sistem terlambat untukapt.systemd.daily
mengambil perubahan.Ini juga berarti bahwa pada dasarnya tidak ada cara untuk mencegah
apt.systemd.daily
berjalan - seseorang hanya dapat membunuhnya setelah dimulai.Skrip "data pengguna" ini menggunakan rute ini ::
Masih ada jendela waktu di mana login SSH dimungkinkan namun
apt-get
tidak akan berjalan, tapi saya tidak bisa membayangkan solusi lain yang dapat bekerja pada stock image cloud Ubuntu 16.04.sumber
apt-get -o Acquire::http::AllowRedirect=false update
Catatan: Sayangnya bagian dari solusi di bawah ini tidak berfungsi pada sistem Ubuntu 16.04 (seperti yang dimiliki penanya) karena
systemd-run
permohonan yang disarankan hanya berfungsi di Ubuntu 18.04 dan lebih tinggi (lihat komentar untuk detailnya ). Saya akan meninggalkan jawabannya di sini karena pertanyaan ini masih menjadi hit populer terlepas dari versi Ubuntu yang Anda gunakan ...Pada Ubuntu 18.04 (dan lebih tinggi) mungkin ada dua layanan yang terlibat dalam waktu boot untuk memperbarui / meningkatkan. Yang pertama
apt-daily.service
menyegarkan daftar paket. Namun ada yang keduaapt-daily-upgrade.service
yang benar-benar menginstal paket keamanan kritis. Sebuah jawaban untuk "Memutus dan menonaktifkan / menghapus Upgrade tanpa pengawasan sebelum kembali perintah" Pertanyaan memberikan contoh yang sangat baik tentang bagaimana untuk menunggu kedua ini untuk menyelesaikan (disalin di sini untuk kenyamanan):(perhatikan ini harus dijalankan sebagai root). Jika Anda mencoba untuk menonaktifkan layanan ini pada boot selanjutnya, Anda perlu menutupi KEDUA layanan:
Atau Anda dapat menggunakan
systemctl disable
kedua layanan DAN pengatur waktu terkait (mis.apt-daily.timer
Danapt-daily-upgrade.timer
).Perhatikan teknik penutupan / penonaktifan dalam jawaban ini hanya mencegah pembaruan / peningkatan pada boot berikutnya - mereka tidak akan menghentikannya jika sudah berjalan di boot saat ini.
sumber
systemd-run
pada Ubuntu 16.04 terlalu tua untuk mendukung--wait
opsi, tetapi seharusnya tidak benar-benar diperlukan untuk tujuan yang ada. (Menurut halaman manual,--wait
menunggu penghentian sebuah unit tetapi cukup untuk menunggu awal yang merupakan perilaku default darisystemd-run
.)systemd-run
mantra yang diberikan tidak bekerja di Ubuntu 16,04 sama sekali; ia mati dengan pesan kesalahan Penugasan tidak diketahui Setelah = apt-daily.service apt-daily-upgrade.service . Sepertinya beberapa properti unit tidak tersedia disystemd-run
, lihat contohnya di siniAnda dapat menonaktifkan ini melalui modul cloud-init "bootcmd". Ini berjalan sebelum jaringan dinyalakan, yang diperlukan sebelum pembaruan apt bisa mendapatkan kesempatan untuk berjalan.
Setelah Anda masuk ke instance, Anda juga harus menunggu fase akhir cloud-init selesai, karena ia memindahkan sumber / daftar yang ada di sekitar.
Ini juga membantu untuk melihat seberapa awal bootcmd berjalan:
Anda dapat memverifikasi ini berfungsi sebagai berikut:
sumber
Tidak akan lebih mudah untuk menutupi unit
?
sumber
ls -al /etc/systemd/system/ | grep alsa lrwxrwxrwx 1 root root 9 Sep 1 13:17 alsa-init.service -> /dev/null
Data kosong.sudo dpkg-reconfigure -plow unattended-upgrades
dan mengabaikannya. Jadi status unit apt-daily.service sudah mati.apt-daily.service
daricloud-init
skrip dan sebelum dimulai setelah VM reboot: ini berarti: (1) harus dilakukan secara non-interaktif, (2) harus dilakukan sebelumapt-daily.service
kebakaran untuk pertama kalinya. (Jika pemahaman saya tentang systemd benar, (2) tidak dapat benar-benar diselesaikancloud-init
danapt-daily
dijalankan secara bersamaan - lihat balasan saya sendiri untuk informasi lebih lanjut.)Ini menunggu 1detik dalam putaran whil dan memeriksa apakah kunci dilepaskan.
sumber