Debian : Activer les mises à jour automatique avec unattended-upgrades

debian-logo



Introduction



Avec Debian, il est possible d'automatiser les mises à jour. Cela se fait avec l'outil unattended-upgrades.
Dans cet article, nous allons voir sa mise en place.

Installation



Dans un premier temps, on met à jour les miroirs :

Code BASH :
apt update


Puis, on installe l'outil :

Code BASH :
apt install unattended-upgrades


Configuration de l'outil



Le fichier de configuration est /etc/apt/apt.conf.d/50unattended-upgrades :

Code BASH :
vi /etc/apt/apt.conf.d/50unattended-upgrades


Il y a plusieurs sections dans ce fichier :

Section Unattended-Upgrade::Origins-Pattern : Cela correspond aux sources de mise à jour. Par défaut seul Debian (dépôt de base) et Debian-Security sont actifs. Si on souhaite tout mettre à jour, on peut décommenter updates et proposed-updates

Code TEXT :
//      "origin=Debian,codename=${distro_codename}-updates";
//      "origin=Debian,codename=${distro_codename}-proposed-updates";
        "origin=Debian,codename=${distro_codename},label=Debian";
        "origin=Debian,codename=${distro_codename},label=Debian-Security";


Section Unattended-Upgrade::Package-Blacklist : Elle permet de blacklister des paquets de la mise à jour automatique. Il y a des exemples, je vous traduis les commentaires en anglais :

Code TEXT :
    // tous les paquets commençant par linux-
//  "linux-";
    // Utiliser $ pour marquer explicitement la fin d'un paquet. Sans
    // the $, tous les paquets contenant "libc6" seront concernés.
//  "libc6$";
//  "libc6-dev$";
//  "libc6-i686$";
    // Caractères spéciaux doivent être échappés
//  "libstdc\+\+6$";
    // Expressions régulières de façon à ce que xen-system-amd64, xen-utils-4.1,
    // xenstore-utils et libxenstore3.0 soit exclus.
//  "(lib)?xen(store)?";


On peut être alerté par mail (pour tout ou seulement en cas d'erreur), via les lignes suivantes à décommenter (doit avoir un serveur de mail fonctionnel) :

Code BASH :
//Unattended-Upgrade::Mail "";
//Unattended-Upgrade::MailOnlyOnError "false";


Je déconseille de décommenter cette ligne, mais si vous voulez faire du ménage dans les noyaux, libre à vous :

Code BASH :
//Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";


On peut aussi désinstaller les dépendances inutiles (les orphelins) via ces lignes à décommenter :

Code BASH :
//Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
//Unattended-Upgrade::Remove-Unused-Dependencies "false";


En cas de mise à jour du noyau, il faut redémarrer. Si votre serveur n'est pas dans un environnement critique, vous pouvez automatiser ce reboot (à étudier en fonction du contexte). Attention, le reboot se fait sans aucune conformation :

Code BASH :
//Unattended-Upgrade::Automatic-Reboot "false";
//Unattended-Upgrade::Automatic-Reboot-Time "03:30";


On peut limiter la bande passante lors du téléchargement avec la ligne ci-dessous (valeur en ko/s) :

Code BASH :
//Acquire::http::Dl-Limit "70";


On peut activer le log sur la mise à jour auto en décommentant et en passant à true :

Code BASH :
Unattended-Upgrade::SyslogEnable "true";
// Unattended-Upgrade::SyslogFacility "daemon";


Il y a d'autres petites options dans ce fichier évidemment...

Activation de l'outil



Après la configuration, place à l'activation. Cela se passe dans /etc/apt/apt.conf.d/20auto-upgrades.

Copier le modèle :

Code BASH :
cp /usr/share/unattended-upgrades/20auto-upgrades /etc/apt/apt.conf.d/20auto-upgrades


Puis l'éditer :

Code BASH :
vi /etc/apt/apt.conf.d/20auto-upgrades


Voici quelques valeurs possibles :

Code BASH :
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "30";



Tester la mise à jour



On peut tester l'outil via la commande suivante (mode debug pour bien tout voir, et en simulation) :

Code BASH :
unattended-upgrades --debug --dry-run 


Tous les logs se trouvent dans /var/log/unattended-upgrades.

Journaux d'activité



Toutes les actions réalisées par unattended-upgrades sont journalisées dans /var/log/unattended-upgrades

Le fichier unattended-upgrades.log trace toutes ces actions :

Code TEXT :
2021-02-17 06:20:56,451 INFO Enabled logging to syslog via local7 facility 
2021-02-17 06:20:56,464 INFO Initial blacklist : 
2021-02-17 06:20:56,465 INFO Initial whitelist: 
2021-02-17 06:20:56,465 INFO Démarrage du script de mise à niveau automatique
2021-02-17 06:20:56,465 INFO Les origines permises sont: origin=Debian,codename=buster-updates, origin=Debian,codename=buster-proposed-updates, origin=Debian,codename=buster,label=Debian, origin=Debian,codename=buster,label=Debian-Security
2021-02-17 06:21:00,246 INFO Paquets mis à niveau: base-files ca-certificates file grub-common grub-pc grub-pc-bin grub2-common iproute2 libgnutls30 libldap-2.4-2 libldap-common libmagic-mgc libmagic1 libnss-systemd libp11-kit0 libpam-systemd libsystemd0 libudev1 libzstd1 linux-image-amd64 python-apt-common python3-apt systemd systemd-sysv tzdata udev
2021-02-17 06:21:00,247 INFO Writing dpkg log to /var/log/unattended-upgrades/unattended-upgrades-dpkg.log
2021-02-17 06:22:00,655 INFO Toutes les mises à niveau ont été installées
2021-02-17 06:22:00,900 WARNING Found /var/run/reboot-required, rebooting
2021-02-17 06:22:00,907 WARNING Shutdown msg: b"Shutdown scheduled for Thu 2021-02-18 04:00:00 CET, use 'shutdown -c' to cancel."


Le fichier unattended-upgrades-dpkg.log lui affiche ce que la sortie d'apt vous aurait affichée, dont voici un extrait :

Code TEXT :
Log started: 2021-02-17  06:21:49
Préconfiguration des paquets...
(Lecture de la base de données... 38903 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de .../grub2-common_2.02+dfsg1-20+deb10u3_amd64.deb ...
Dépaquetage de grub2-common (2.02+dfsg1-20+deb10u3) sur (2.02+dfsg1-20+deb10u2) ...
Préparation du dépaquetage de .../grub-pc_2.02+dfsg1-20+deb10u3_amd64.deb ...
Dépaquetage de grub-pc (2.02+dfsg1-20+deb10u3) sur (2.02+dfsg1-20+deb10u2) ...
Préparation du dépaquetage de .../grub-pc-bin_2.02+dfsg1-20+deb10u3_amd64.deb ...
Dépaquetage de grub-pc-bin (2.02+dfsg1-20+deb10u3) sur (2.02+dfsg1-20+deb10u2) ...
Préparation du dépaquetage de .../grub-common_2.02+dfsg1-20+deb10u3_amd64.deb ...
Dépaquetage de grub-common (2.02+dfsg1-20+deb10u3) sur (2.02+dfsg1-20+deb10u2) ...
Paramétrage de grub-common (2.02+dfsg1-20+deb10u3) ...
Paramétrage de grub2-common (2.02+dfsg1-20+deb10u3) ...
Paramétrage de grub-pc-bin (2.02+dfsg1-20+deb10u3) ...
Paramétrage de grub-pc (2.02+dfsg1-20+deb10u3) ...
Installation pour la plate-forme i386-pc.
Installation terminée, sans erreur.
Création du fichier de configuration GRUB…
Image Linux trouvée : /boot/vmlinuz-4.19.0-14-amd64
Image mémoire initiale trouvée : /boot/initrd.img-4.19.0-14-amd64
Image Linux trouvée : /boot/vmlinuz-4.19.0-13-amd64
Image mémoire initiale trouvée : /boot/initrd.img-4.19.0-13-amd64
Image Linux trouvée : /boot/vmlinuz-4.19.0-5-amd64
Image mémoire initiale trouvée : /boot/initrd.img-4.19.0-5-amd64
fait
Traitement des actions différées (« triggers ») pour man-db (2.8.5-2) ...
Log ended: 2021-02-17  06:21:53
 
Log started: 2021-02-17  06:21:54
(Lecture de la base de données... 38903 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de .../libgnutls30_3.6.7-4+deb10u6_amd64.deb ...
Dépaquetage de libgnutls30:amd64 (3.6.7-4+deb10u6) sur (3.6.7-4+deb10u5) ...
Paramétrage de libgnutls30:amd64 (3.6.7-4+deb10u6) ...
Traitement des actions différées (« triggers ») pour libc-bin (2.28-10) ...
Log ended: 2021-02-17  06:21:54
 


Changer l'heure de planification



Par défaut, unattended-upgrades utilise un timer systemd pour planifier le lancement :

Code BASH :
systemctl cat apt-daily-upgrade.timer


Code TEXT :
# /lib/systemd/system/apt-daily-upgrade.timer
[Unit]
Description=Daily apt upgrade and clean activities
After=apt-daily.timer
 
[Timer]
OnCalendar=*-*-* 6:00
RandomizedDelaySec=60m
Persistent=true
 
[Install]
WantedBy=timers.target


On voit ici que la mise à jour se déclenche tous les jours à partir de 6h dans un délai aléatoire entre 6h et 7h...

Pour forcer une heure précise, on va modifier le service en créant /etc/systemd/system/apt-daily-upgrade.timer.d/override.conf, cela de manière automatisée avec :

Code BASH :
systemctl edit apt-daily-upgrade.timer


On va fixer à 3h30 la mise à jour ainsi :

Code TEXT :
[Timer]
OnCalendar=
OnCalendar=03:30
RandomizedDelaySec=0


Et on redémarre le timer pour prendre tout cela en compte :

Code BASH :
systemctl restart apt-daily-upgrade.timer



On a la même procédure avec apt-daily.timer pour le téléchargement des paquets :

Code BASH :
systemctl cat apt-daily.timer


Code TEXT :
# /lib/systemd/system/apt-daily.timer
[Unit]
Description=Daily apt download activities
 
[Timer]
OnCalendar=*-*-* 6,18:00
RandomizedDelaySec=12h
Persistent=true
 
[Install]
WantedBy=timers.target


Code BASH :
systemctl edit apt-daily.timer


On va fixer à 3h05 le téléchargement ainsi :

Code TEXT :
[Timer]
OnCalendar=
OnCalendar=03:05
RandomizedDelaySec=0


Et on redémarre pour prendre cela en compte

Code BASH :
systemctl restart apt-daily.timer