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 aggiornare l'elenco dei pacchetti disponibili, eseguire aggiornamenti automatici se necessario, ecc.
Quando si parte da uno "snapshot" della macchina virtuale, il servizio viene attivato immediatamente , poiché (presumo) systemd si rende conto rapidamente che il timer dovrebbe essere scaduto molto tempo fa.
Tuttavia, un APT in esecuzione impedisce l'esecuzione di altri aptprocessi poiché contiene un blocco /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 fino a quando Ansible non avrà completato l'installazione della macchina (che in genere comporta l'installazione di pacchetti); vedi https://github.com/gc3-uzh-ch/elasticluster/issues/304 per maggiori informazioni e contesto.
Ho provato varie opzioni per disabilitare la funzione "Aggiornamenti non presidiati" tramite uno script "Dati utente" per cloud-init, ma finora tutti hanno fallito.
1. Disabilitare l'attività di systemd
l'attività di systemd apt-daily.serviceè attivata da apt-daily.timer. Ho provato a disabilitare l'uno o l'altro, o entrambi, con varie combinazioni dei seguenti comandi; tuttavia, apt-daily.serviceviene avviato pochi istanti dopo che la VM è pronta per accettare le 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
Lo script /usr/lib/apt/apt.systemd.dailylegge alcune variabili di configurazione APT; l'impostazione APT::Periodic::Enabledisabilita completamente la funzionalità (righe 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::Enableabbia valore 0dalla riga di comando (vedi sotto), il unattended-upgradesprogramma è ancora in esecuzione ...
ubuntu@test:~$ apt-config shell AutoAptEnable APT::Periodic::Enable
AutoAptEnable='0'
3. Rimuovere del /usr/lib/apt/apt.systemd.dailytutto
Il seguente cloud-initscript rimuove del tutto lo script degli aggiornamenti non presidiati ::
#!/bin/bash
mv /usr/lib/apt/apt.systemd.daily /usr/lib/apt/apt.systemd.daily.DISABLED
Tuttavia, l'attività viene eseguita e posso vederla nella tabella dei processi! sebbene il file non esista se sondato dalla riga di comando ::
ubuntu@test:~$ ls /usr/lib/apt/apt.systemd.daily
ls: cannot access '/usr/lib/apt/apt.systemd.daily': No such file or directory
Sembra che lo cloud-initscript (insieme alla riga di comando SSH) e il processo root systemd vengano eseguiti in filesystem e spazi di processo separati ...
Domande
C'è qualcosa di ovvio che mi manca? O c'è qualche magia dello spazio dei nomi in corso di cui non sono a conoscenza?
Ancora più importante: come posso disabilitare il apt-daily.servicetramite uno
cloud-initscript?
--nowbandiera nel systemctl disablecomando per rendere immediatamente effettiva la modifica. Questo era il mio problema.
disable --nowequivale a stopseguito da disable.