L'image de la machine virtuelle du serveur Ubuntu 16.04 démarre apparemment le "apt-daily.service" toutes les 12 heures environ; Ce service effectue diverses tâches liées à APT, telles que l'actualisation de la liste des packages disponibles, l'exécution de mises à niveau sans assistance si nécessaire, etc.
Lorsque vous démarrez à partir d'une "capture instantanée" de machine virtuelle, le service est immédiatement déclenché , car (je présume), systemd réalise rapidement que la minuterie aurait dû sonner depuis longtemps.
Cependant, un APT en cours d'exécution empêche d'autres apt
processus de s'exécuter car il est verrouillé /var/lib/dpkg
. Le message d'erreur indiquant ceci ressemble à ceci:
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?
Je dois désactiver cette tâche APT automatisée jusqu'à ce qu'Ansible ait terminé la configuration de la machine (ce qui implique généralement l'installation de packages). voir https://github.com/gc3-uzh-ch/elasticluster/issues/304 pour plus d'informations et le contexte.
J'ai essayé diverses options pour désactiver la fonctionnalité "Mises à niveau sans surveillance" via un script "Données utilisateur" cloud-init
, mais toutes ont échoué jusqu'à présent.
1. Désactiver la tâche systemd
La tâche systemd apt-daily.service
est déclenchée par apt-daily.timer
. J'ai essayé de désactiver l'un ou l'autre, ou les deux, avec divers cobinations des commandes suivantes; cependant, il apt-daily.service
est démarré quelques instants après que la VM soit prête à accepter les connexions SSH:
#!/bin/bash
systemctl stop apt-daily.timer
systemctl disable apt-daily.timer
systemctl mask apt-daily.service
systemctl daemon-reload
2. Désactiver l'option de configuration APT::Periodic::Enable
Le script /usr/lib/apt/apt.systemd.daily
lit quelques variables de configuration APT; le paramètre APT::Periodic::Enable
désactive complètement la fonctionnalité (lignes 331 à 337). J'ai essayé de le désactiver avec le script suivant:
#!/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
Cependant, malgré APT::Periodic::Enable
sa valeur 0
depuis la ligne de commande (voir ci-dessous), le unattended-upgrades
programme est toujours exécuté ...
ubuntu@test:~$ apt-config shell AutoAptEnable APT::Periodic::Enable
AutoAptEnable='0'
3. Supprimer /usr/lib/apt/apt.systemd.daily
complètement
Le cloud-init
script suivant supprime complètement le script de mises à niveau sans assistance ::
#!/bin/bash
mv /usr/lib/apt/apt.systemd.daily /usr/lib/apt/apt.systemd.daily.DISABLED
Malgré tout, la tâche est exécutée et je peux la voir dans la table de processus! bien que le fichier n'existe pas s'il est interrogé à partir de la ligne de commande ::
ubuntu@test:~$ ls /usr/lib/apt/apt.systemd.daily
ls: cannot access '/usr/lib/apt/apt.systemd.daily': No such file or directory
Il semble que le cloud-init
script (avec la ligne de commande SSH) et le processus racine de systemd s'exécutent dans des systèmes de fichiers et des espaces de processus distincts ...
Des questions
Y a-t-il quelque chose d'évident qui me manque? Ou y a-t-il une magie de l'espace de noms en cours dont je ne suis pas au courant?
Plus important encore: comment puis-je désactiver le apt-daily.service
via un
cloud-init
script?
la source
--now
drapeau dans lasystemctl disable
commande pour que le changement prenne effet immédiatement. C'était mon problème.disable --now
est équivalent àstop
suivi dedisable
.Réponses:
Oui, il y avait quelque chose d'évident qui me manquait.
Systemd concerne le démarrage simultané des services. Le
cloud-init
script est donc exécuté en même temps que leapt-daily.service
déclenchement. Au moment oùcloud-init
doit exécuter la charge utile spécifiée par l'utilisateur,apt-get update
est déjà en cours d'exécution. Ainsi, les tentatives 2. et 3. ont échoué, non pas à cause de la magie de l'espace de noms, mais parce qu'elles ont modifié le système trop tard pour queapt.systemd.daily
les modifications soient prises en compte.Cela signifie également qu'il n'y a fondamentalement aucun moyen d' empêcher
apt.systemd.daily
de courir - on peut seulement le tuer après l'avoir démarré.Ce script "données utilisateur" emprunte cette route:
Il existe encore une fenêtre de temps pendant laquelle les connexions SSH sont possibles mais
apt-get
ne s'exécutent pas, mais je ne peux pas imaginer une autre solution pouvant fonctionner sur l'image stock d'Ubuntu 16.04.la source
apt-get -o Acquire::http::AllowRedirect=false update
Remarque: Malheureusement, une partie de la solution ci - dessous ne fonctionne pas sur les systèmes Ubuntu 16.04 (comme celui de l'interrogateur) car l'
systemd-run
invocation suggérée ne fonctionne que sur Ubuntu 18.04 et les versions ultérieures (voir les commentaires pour plus de détails ). Je laisse la réponse ici car cette question est toujours populaire, quelle que soit la version d'Ubuntu que vous utilisez ...Sur Ubuntu 18.04 (et plus), il peut y avoir jusqu’à deux services impliqués dans le démarrage et la mise à jour / mise à niveau. Le premier
apt-daily.service
actualise la liste des packages. Cependant, il peut y avoir une secondeapt-daily-upgrade.service
qui installe réellement des paquets critiques pour la sécurité. Une réponse à la question "Arrêtez et désactivez / supprimez la mise à niveau automatique avant que la commande ne retourne" donne un excellent exemple de la procédure à suivre pour attendre la fin de ces deux opérations (copiée ici pour plus de commodité):(notez que ceci doit être exécuté en tant que root). Si vous essayez de désactiver ces services lors de futurs démarrages, vous devrez masquer les deux services:
Vous pouvez également
systemctl disable
utiliser les services ET leurs minuteurs associés (c.apt-daily.timer
-à- d. Etapt-daily-upgrade.timer
).Notez que les techniques de masquage / désactivation dans cette réponse empêchent uniquement la mise à jour / mise à niveau lors de futurs démarrages - elles ne les arrêteront pas si elles sont déjà en cours d'exécution dans le démarrage actuel.
la source
systemd-run
sur Ubuntu 16.04 est trop vieux pour supporter l’--wait
option, mais cela ne devrait pas vraiment être nécessaire pour le but recherché. (Selon la page de manuel,--wait
attend la fin d'une unité, mais il suffit d'attendre son début, ce qui est le comportement par défaut desystemd-run
.)systemd-run
incantation donnée ne fonctionne pas du tout sur Ubuntu 16.04; il meurt avec un message d'erreur Affectation inconnue après = apt-daily.service apt-daily-upgrade.service . Il semble que certaines propriétés de l'unité ne sont pas disponibles àsystemd-run
, voir par exemple iciVous pouvez le désactiver via le module cloud-init "bootcmd". Cela s'exécute avant que le réseau soit mis en place, ce qui est nécessaire avant que apt update puisse avoir une chance de s'exécuter.
Une fois que vous avez intégré SSH à l'instance, vous devez également attendre la fin des phases finales de cloud-init, car celle-ci déplace les sources / listes.
Ceci est également utile pour voir à quelle heure le bootcmd s'exécute:
Vous pouvez vérifier que cela fonctionne comme suit:
la source
Ne serait pas plus facile de masquer l'unité
?
la source
ls -al /etc/systemd/system/ | grep alsa lrwxrwxrwx 1 root root 9 Sep 1 13:17 alsa-init.service -> /dev/null
les données sont vides.sudo dpkg-reconfigure -plow unattended-upgrades
et l'utilise. Donc, le statut de l'unité apt-daily.service est mort.apt-daily.service
uncloud-init
script et avant qu'il ne démarre après le redémarrage de la machine virtuelle: cela signifie: (1) cela doit être fait de manière non interactive, (2) cela doit être fait avantapt-daily.service
le premier déclenchement. (Si ma compréhension de systemd est correcte, (2) ne peut pas réellement être accompli en tant quecloud-init
etapt-daily
s'exécute simultanément - voir ma propre réponse pour plus.)Cela attend 1 seconde dans une boucle complète et vérifie si le verrou est libéré.
la source