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 apt
processi 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.service
viene 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.daily
legge alcune variabili di configurazione APT; l'impostazione APT::Periodic::Enable
disabilita 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::Enable
abbia valore 0
dalla riga di comando (vedi sotto), il unattended-upgrades
programma è ancora in esecuzione ...
ubuntu@test:~$ apt-config shell AutoAptEnable APT::Periodic::Enable
AutoAptEnable='0'
3. Rimuovere del /usr/lib/apt/apt.systemd.daily
tutto
Il seguente cloud-init
script 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-init
script (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.service
tramite uno
cloud-init
script?
--now
bandiera nel systemctl disable
comando per rendere immediatamente effettiva la modifica. Questo era il mio problema.
disable --now
equivale a stop
seguito da disable
.