In der Vergangenheit habe ich Server so konfiguriert, daß Updates automatisiert über cron-apt heruntergeladen und installiert wurden. Seit der Einführung von systemd steht mit den uattended-upgrades eine weitere Möglichkeit zur Verfügung, welche eine detailliertere Konfiguration erlaubt.
$ sudo apt-get install unattended-upgrades
Die Grundkonfiguration erfolgt über die Datei “/etc/apt/apt.conf.d/50unattended-upgrades”, in der nach erfolgter Installation zumindest die Parameter “Unattended-Upgrade::Mail” sowie “Unattended-Upgrade::MailReport” angepasst werden sollten.
...
Unattended-Upgrade::Mail "an.wen.auch.immer@wo.auch.immer";
...
Unattended-Upgrade::MailReport "always";
...
“Unattended-Upgrade::MailReport” kann nach erfolgreicher Testphase auch wieder zurück auf den Default-Wert “on-change” gestellt werden, falls das tägliche “es gab nix zu tun” nervt.
Um die Funktionalität zu aktivieren, kann entweder die Datei “/etc/apt/apt.conf.d/20auto-upgrades” manuell angepasst oder “dpkg-reconfigure” verwendet werden. Nach dem Aufruf von
$ sudo dpkg-reconfigure unattended-upgrades
die Frage “Aktualisierungen für Stable automatisch herunterladen und installieren?” mit “ja” beantworten.
Für einen Testlauf kann “unattended-upgrade” mit dem Parameter “-d” für Debug manuell gestartet werden:
$ sudo unattended-upgrade -d
Anpassung Zeitsteuerung
Der Zeitpunkt, zu dem das Herunterladen bzw. Installieren tatsächlich durchgeführt wird, lässt sich über zwei Overrides definieren. Wichtig ist hierbei, im ersten Schritt mit “OnCalendar=” erst einmal bestehende Einträge zu löschen, bevor dann die eigenen Werte gesetzt werden - sonst werden die angegebenen Werte zusätlich übernommen.
$ sudo mkdir /etc/systemd/system/apt-daily.timer.d
$ sudo vi /etc/systemd/system/apt-daily.timer.d/override.conf
[Timer]
OnCalendar=
OnCalendar=04:00
RandomizedDelaySec=0
$ sudo mkdir /etc/systemd/system/apt-daily-upgrade.timer.d
$ sudo vi /etc/systemd/system/apt-daily-upgrade.timer.d/override.conf
[Timer]
OnCalendar=
OnCalendar=05:00
RandomizedDelaySec=0
Anschließend müssen die geänderten Konfigurationsdateien noch eingelesen und die Timer neu gestartet werden:
$ sudo systemctl daemon-reload
$ sudo systemctl restart apt-daily.timer
$ sudo systemctl restart apt-daily-upgrade.timer
Der Status der Einplanung lässt sich mittels “systemctl” einsehen
$ sudo systemctl status apt-daily.timer
● apt-daily.timer - Daily apt download activities
Loaded: loaded (/lib/systemd/system/apt-daily.timer; enabled; preset: enabled)
Drop-In: /etc/systemd/system/apt-daily.timer.d
└─override.conf
Active: active (waiting) since Tue 2024-09-17 11:29:25 CEST; 46s ago
Trigger: Wed 2024-09-18 04:00:00 CEST; 16h left
Triggers: ● apt-daily.service
$ sudo systemctl status apt-daily-upgrade.timer
● apt-daily-upgrade.timer - Daily apt upgrade and clean activities
Loaded: loaded (/lib/systemd/system/apt-daily-upgrade.timer; enabled; preset: enabled)
Drop-In: /etc/systemd/system/apt-daily-upgrade.timer.d
└─override.conf
Active: active (waiting) since Tue 2024-09-17 11:29:33 CEST; 53s ago
Trigger: Wed 2024-09-18 05:00:00 CEST; 17h left
Triggers: ● apt-daily-upgrade.service
Was unattended-upgrades tatsächlich so angestellt hat, lässt sich auch mit Hilfe von “journalctl” auswerten:
$ sudo journalctl --since yesterday -u apt-daily.service
$ sudo journalctl --since yesterday -u apt-daily-upgrade.service
Drittanbieterquellen
In der Standardkonfiguration aktualisiert unattended-upgrades nur die vom System bereitgestellten Quellen, alle weiteren Quellen müssen in der Datei “/etc/apt/apt.conf.d/50unattended-upgrades” noch hinzugefügt werden. Dies sieht man im Debug-Modus hier auch am Beispiel von “zammad”:
# unattended-upgrade -d | grep zammad
Marking not allowed <apt_pkg.PackageFile object: filename:'/var/lib/apt/lists/dl.packager.io_srv_deb_zammad_zammad_stable_debian_dists_12_main_binary-amd64_Packages' a=,c=main,v=,o=https://packager.io/gh/zammad/zammad,l=Debian 12 packages for zammad/zammad arch='amd64' site='dl.packager.io' IndexType='Debian Package Index' Size=56880 ID:33> with -32768 pin
Applying pin -32768 to package_file: <apt_pkg.PackageFile object: filename:'/var/lib/apt/lists/dl.packager.io_srv_deb_zammad_zammad_stable_debian_dists_12_main_binary-amd64_Packages' a=,c=main,v=,o=https://packager.io/gh/zammad/zammad,l=Debian 12 packages for zammad/zammad arch='amd64' site='dl.packager.io' IndexType='Debian Package Index' Size=56880 ID:33>
Checking: zammad ([<Origin component:'main' archive:'' origin:'https://packager.io/gh/zammad/zammad' label:'Debian 12 packages for zammad/zammad' site:'dl.packager.io' isTrusted:True>])
adjusting candidate version: zammad=6.3.1-1726553725.106af4c8.bookworm
Package zammad has a higher version available, checking if it is from an allowed origin and is not pinned down.
Die benötigten Angaben kann man direkt aus der Debugausgabe entnehmen
"origin=https://packager.io/gh/zammad/zammad,component=main,label=Debian 12 packages for zammad/zammad"
und die Zeile dann der Sektion “Unattended-Upgrade::Origins-Pattern” hinzufügen:
Unattended-Upgrade::Origins-Pattern {
...
"origin=https://packager.io/gh/zammad/zammad,component=main,label=Debian 12 packages for zammad/zammad";
...
};
Anschließend wird Zammad wie geplant aktualisiert:
# unattended-upgrade -d | grep zammad
Erlaubte Ursprünge sind: origin=Debian,codename=bookworm,label=Debian, origin=Debian,codename=bookworm,label=Debian-Security, origin=Debian,codename=bookworm-security,label=Debian-Security, origin=https://packager.io/gh/zammad/zammad,component=main,label=Debian 12 packages for zammad/zammad
Checking: zammad ([<Origin component:'main' archive:'' origin:'https://packager.io/gh/zammad/zammad' label:'Debian 12 packages for zammad/zammad' site:'dl.packager.io' isTrusted:True>])
pkgs that look like they should be upgraded: zammad
...
Pakete, welche aktualisiert werden: zammad
...
zammad (6.3.1-1726721589.817498f6.bookworm) wird eingerichtet ...