Gambar VM server Ubuntu 16.04 tampaknya memulai "apt-daily.service" setiap
12 jam atau lebih; layanan ini melakukan berbagai tugas terkait APT seperti menyegarkan
daftar paket yang tersedia, melakukan peningkatan tanpa pengawasan jika diperlukan, dll.
Saat memulai dari "snapshot" VM, layanan akan dipicu segera , karena (saya
duga) systemd menyadari dengan cepat bahwa pengatur waktu seharusnya sudah mati sejak lama.
Namun, APT yang berjalan mencegah apt
. lainnya proses berjalan karena memegang
kunci pada /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 hingga Ansible
telah menyelesaikan penyiapan mesin (yang biasanya melibatkan pemasangan paket);
lihat https://github.com/gc3-uzh-ch/elasticluster/issues/ 304 untuk info lebih lanjut dan
konteks.
Saya telah mencoba berbagai opsi untuk menonaktifkan fitur “unattended upgrades”
melalui skrip “user data” untuk cloud-init
, tapi sejauh ini semuanya gagal
.
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; tetap saja, apt-daily.service
dimulai beberapa saat setelah VM menjadi
siap 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
Skrip /usr/lib/apt/apt.systemd.daily
membaca beberapa konfigurasi APT
variabel; pengaturan APT::Periodic::Enable
menonaktifkan fungsionalitas
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 dari baris perintah
(lihat di bawah), unattended-upgrades
program masih berjalan…
[email protected]:~$ apt-config shell AutoAptEnable APT::Periodic::Enable
AutoAptEnable='0'
3. Hapus /usr/lib/apt/apt.systemd.daily
sama sekali
Berikut cloud-init
skrip menghapus skrip pemutakhiran yang tidak dijaga
sama sekali::
#!/bin/bash
mv /usr/lib/apt/apt.systemd.daily /usr/lib/apt/apt.systemd.daily.DISABLED
Tetap saja, tugas berjalan dan saya bisa melihatnya di tabel proses! meskipun file
tidak ada jika diperiksa dari baris perintah::
[email protected]:~$ ls /usr/lib/apt/apt.systemd.daily
ls: cannot access '/usr/lib/apt/apt.systemd.daily': No such file or directory
Sepertinya cloud-init
skrip (bersama dengan baris perintah SSH)
dan proses sistem root dijalankan di sistem file dan ruang proses
yang terpisah…
Pertanyaan
Apakah ada sesuatu yang jelas saya lewatkan? Atau apakah ada keajaiban namespace
yang tidak saya sadari?
Yang terpenting:bagaimana saya bisa menonaktifkan apt-daily.service
melaluicloud-init
naskah?
Jawaban yang Diterima:
Ya, jelas ada sesuatu yang saya lewatkan.
Systemd adalah tentang memulai layanan secara bersamaan, jadi cloud-init
skrip
dijalankan bersamaan apt-daily.service
dipicu. Pada saat cloud-init
dapat mengeksekusi payload yang ditentukan pengguna, apt-get update
sudah berjalan. Jadi upaya 2. dan 3. gagal bukan karena keajaiban namespace
, tetapi karena mereka terlambat mengubah sistem untuk apt.systemd.daily
untuk
mengambil perubahan.
Ini juga berarti bahwa pada dasarnya tidak ada cara untuk mencegah apt.systemd.daily
dari menjalankan — seseorang hanya dapat membunuhnya setelah dimulai.
Skrip “data pengguna” ini mengambil rute ini::
#!/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
Masih ada jendela waktu yang memungkinkan login SSH apt-get
tidak akan berjalan, tetapi saya tidak dapat membayangkan solusi lain yang dapat bekerja pada gambar awan stok
Ubuntu 16.04.