L'immagine della VM del server Ubuntu 16.04 apparentemente avvia "apt-daily.service" ogni
12 ore circa; questo servizio esegue varie attività relative ad APT come l'aggiornamento
dell'elenco dei pacchetti disponibili, l'esecuzione di aggiornamenti automatici se necessario, ecc.
Quando si avvia da uno "snapshot" della VM, il servizio viene attivato immediatamente , poiché (
suppongo) systemd si rende presto conto che il timer sarebbe dovuto scattare molto tempo fa.
Tuttavia, un APT in esecuzione impedisce altri apt
processi dall'esecuzione poiché mantiene un blocco
su /var/lib/dpkg
. Il messaggio di errore che indica questo è simile al seguente:
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?
Devo disabilitare questa attività APT automatizzata finché Ansible
non ha completato la configurazione della macchina (che in genere prevede l'installazione di pacchetti);
vedere https://github.com/gc3-uzh-ch/elasticluster/issues/ 304 per maggiori info e
contesto.
Ho provato varie opzioni per disabilitare la funzione "aggiornamenti non presidiati"
tramite uno script "dati utente" per cloud-init
, ma finora hanno fallito tutti
.
1. Disattiva l'attività di sistema
attività di sistema apt-daily.service
viene attivato da apt-daily.timer
. Ho provato
a disabilitare l'uno o l'altro, o entrambi, con varie combinazioni dei seguenti
comandi; ancora, il apt-daily.service
viene avviato pochi istanti dopo che la macchina virtuale diventa
pronta per accettare connessioni SSH::
#!/bin/bash
systemctl stop apt-daily.timer
systemctl disable apt-daily.timer
systemctl mask apt-daily.service
systemctl daemon-reload
2. Disabilita l'opzione di configurazione APT::Periodic::Enable
Script /usr/lib/apt/apt.systemd.daily
legge alcune variabili di configurazione APT
; l'impostazione APT::Periodic::Enable
disabilita completamente la funzionalità
(linee 331–337). Ho provato a disabilitarlo con il seguente
script::
#!/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
Tuttavia, nonostante APT::Periodic::Enable
avente valore dalla riga di comando
(vedi sotto), gli unattended-upgrades
il programma è ancora in esecuzione...
[email protected]:~$ apt-config shell AutoAptEnable APT::Periodic::Enable
AutoAptEnable='0'
3. Rimuovi /usr/lib/apt/apt.systemd.daily
del tutto
Il seguente cloud-init
lo script rimuove del tutto lo script degli aggiornamenti automatici
::
#!/bin/bash
mv /usr/lib/apt/apt.systemd.daily /usr/lib/apt/apt.systemd.daily.DISABLED
Tuttavia, l'attività viene eseguita e posso vederlo nella tabella dei processi! sebbene il file
non esista se rilevato dalla riga di comando::
[email protected]:~$ ls /usr/lib/apt/apt.systemd.daily
ls: cannot access '/usr/lib/apt/apt.systemd.daily': No such file or directory
Sembra che il cloud-init
script (insieme alla riga di comando SSH)
e il processo di root systemd vengono eseguiti in filesystem e processi separati
spazi…
Domande
C'è qualcosa di ovvio che mi sfugge? O c'è qualche magia nello spazio dei nomi in corso
di cui non sono a conoscenza?
Soprattutto:come posso disabilitare apt-daily.service
tramite uncloud-init
copione?
Risposta accettata:
Sì, c'era qualcosa di ovvio che mi mancava.
Systemd riguarda l'avvio simultaneo dei servizi, quindi cloud-init
lo script viene
eseguito contemporaneamente il apt-daily.service
è scatenato. Entro il tempo cloud-init
esegue il payload specificato dall'utente, apt-get update
è
già in esecuzione. Quindi i tentativi 2. e 3. sono falliti non a causa di qualche magia dello spazio dei nomi
, ma perché hanno alterato il sistema troppo tardi per apt.systemd.daily
per
raccogliere le modifiche.
Questo significa anche che praticamente non c'è modo di prevenire apt.systemd.daily
dall'esecuzione:uno può ucciderlo solo dopo che è stato avviato.
Questo script "dati utente" segue questa strada::
#!/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
C'è ancora una finestra di tempo durante la quale gli accessi SSH sono ancora possibili apt-get
non funzionerà, ma non riesco a immaginare un'altra soluzione che possa funzionare sull'immagine cloud stock
Ubuntu 16.04.