Automatische Updates in Linux

Automatische Updates für dein Linux-System einrichten. Inklusive Erklärung aller verwendeten Befehle und Techniken.

Automatische Updates in Linux

In diesem Post möchte ich dir zeigen, wie automatische Updates für ein Linux System eingerichtet werden können.

Erstelle hierfür eine Datei unter /usr/local/bin/

Verwende einen Editor deiner Wahl (nano, vim, etc.).

nano auto-update-setup.sh

Füge folgenden Code ein.

#!/bin/bash
set -e

# Prüfe, ob das Skript als root ausgeführt wird
if [[ $EUID -ne 0 ]]; then
   echo "Bitte als root ausführen: sudo $0"
   exit 1
fi

# Aktualisiere das Paketverzeichnis
apt update

# Installiere das Paket "unattended-upgrades" und bestätige Rückfragen mit "yes"
apt install -y unattended-upgrades

# Erstelle oder ändere die Konfiguration für die unattended-upgrades
cat <<EOL | tee /etc/apt/apt.conf.d/50unattended-upgrades
// Aktualisiere Pakete aus diesen Quellen automatisch
Unattended-Upgrade::Allowed-Origins {
    "\${distro_id}:\${distro_codename}-security";
    "\${distro_id}:\${distro_codename}-updates";
    // Kommentiere die nächste Zeile ein, wenn du alle Pakete einbeziehen möchtest
    // "*:*";
};

// Nicht mehr benötigte Abhängigkeiten und Aktualisierungen entfernen
Unattended-Upgrade::Remove-Unused-Dependencies "true";

// Automatisch neu starten, falls nach Update notwendig
// ACHTUNG: Auf Produktivservern mit laufenden Diensten (Datenbanken, etc.) ggf. deaktivieren!
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";
EOL

# Aktiviere periodische Aktualisierung in der APT-Konfig
echo "Enabling periodic updates in APT..."
cat <<EOL | tee /etc/apt/apt.conf.d/10periodic
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";
EOL

# Den Dienst neu starten, um die Änderungen zu übernehmen
systemctl restart unattended-upgrades

# Timer bearbeiten, wann apt update ausgeführt wird
echo "Edit timer when apt update is running..."
mkdir -p /etc/systemd/system/apt-daily.timer.d

cat <<EOL | tee /etc/systemd/system/apt-daily.timer.d/override.conf
[Timer]
OnCalendar=
OnCalendar=*-*-* 01:00
RandomizedDelaySec=5m
EOL

# Timer bearbeiten, wann apt upgrade ausgeführt wird
echo "Edit timer when apt upgrade is running..."
mkdir -p /etc/systemd/system/apt-daily-upgrade.timer.d

cat <<EOL | tee /etc/systemd/system/apt-daily-upgrade.timer.d/override.conf
[Timer]
OnCalendar=
OnCalendar=*-*-* 01:30
RandomizedDelaySec=5m
EOL

# Daemon reload VOR dem Restart der Timer
systemctl daemon-reload

# Die Dienste "apt-daily.timer" und "apt-daily-upgrade.timer" neu starten
systemctl restart apt-daily.timer
systemctl restart apt-daily-upgrade.timer

echo "Automatische Updates wurden erfolgreich eingerichtet!"

Speichere und schließe die Datei mittels STRG+O und dann STRG+X

Das Skript ausführbar machen.

chmod +x auto-update-setup.sh

Führe das Skript aus.

sudo ./auto-update-setup.sh

Stelle sicher, dass der Timer angepasst worden ist.

sudo systemctl --all list-timers apt-daily{,-upgrade}.timer

was passiert hier genau?

Bevor wir uns den Code genauer anschauen, hier eine kurze Erklärung der Befehle und Techniken.

set -e

Sorgt dafür, dass das Skript beim ersten Fehler sofort abbricht. Ohne set -e würde das Skript einfach weiterlaufen, selbst wenn ein Befehl fehlschlägt und das kann zu Unvorhersehbarem führen.

cat

Steht für concatenate und gibt den Inhalt einer Datei aus. In Kombination mit einem Here-Document (siehe unten) kann cat auch dazu verwendet werden, Text in eine Datei zu schreiben.

# Datei ausgeben
cat /etc/hostname

# Text in eine Datei schreiben
cat <<EOL > /pfad/zur/datei.conf
Inhalt der Datei
EOL

<<EOL ... EOL (Here-Document)

Ein Here-Document erlaubt es dir, mehrzeiligen Text direkt im Skript zu übergeben. EOL steht hierbei für End Of Line und dient als Markierung, wo der Textblock beginnt und endet.

cat <<EOL
Das ist Zeile 1
Das ist Zeile 2 und somit der erste Verlierer 
EOL

Der Name EOL ist frei wählbar. Man könnte auch ENDE, EOF, oder sonst was schreiben. Wichtig ist nur, dass Anfang und Ende übereinstimmen.

tee

Die Kombination aus cat, Here-Document und tee nutzen wir im Skript, um Konfigurationsdateien zu erstellen. Der Ablauf ist:

  1. cat <<EOL definiert den mehrzeiligen Text
  2. | (Pipe) leitet die Ausgabe weiter
  3. tee /pfad/zur/datei schreibt den Text in die Datei und zeigt diesen im Terminal an
cat <<EOL | tee /etc/apt/apt.conf.d/10periodic
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
EOL
💡
Achtung: Hierbei wir die genannte Konfiguration ersetzt.

| (Pipe)

Die Pipe leitet Ausgaben eines Befehls weiter. In dem Fall weiter als Eingabe für den nächsten Befehl.

# Ausgabe von cat wird an tee weitergeleitet
cat <<EOL | tee /pfad/zur/datei.conf
Inhalt
EOL

mkdir -p

Erstellt ein Verzeichnis. Das -p Flag bringt zwei Vorteile mit sich.

  1. Es erstellt auch übergeordnete Verzeichnisse, falls diese noch nicht existieren sollten.
  2. Es wirft keinen Fehler, wenn das Verzeichnis bereits vorhanden ist.
# Ohne -p: Fehler, wenn Verzeichnis existiert
mkdir /etc/systemd/system/apt-daily.timer.d

# Mit -p: Kein Fehler, erstellt bei Bedarf alle Ebenen
mkdir -p /etc/systemd/system/apt-daily.timer.d

chmod +x

Macht eine Datei ausführbar. Ohne diesen Befehl kannst du das Skript nicht direkt starten.

chmod +x auto-update-setup.sh

systemctl

Ist das Werkzeug zur Verwaltung von systemd-Diensten und Timern unter Linux.

# Dienst neu starten
systemctl restart unattended-upgrades

# Systemd-Konfiguration neu laden
systemctl daemon-reload

# Alle Timer anzeigen
systemctl --all list-timers

Wichtig: Nach Änderungen an Timer- oder Service-Dateien ist immer ein deamon-reload notwendig. Damit liest systemd die neuen Konfigurationen ein.

EUID

Eine Systemvariable, welche die effektive User-ID des aktuellen Benutzers enthält. Root hat immer die ID 0. Damit lässt sich prüfen, ob das Skript mit Root-Rechten ausgeführt wird.

if [[ $EUID -ne 0 ]]; then
   echo "Bitte als root ausführen: sudo $0"
   exit 1
fi

-ne steht für not equal. $0 enthält den Namen des aktuell ausgeführten Skripts.


Transparenz:

Ich bin kein begnadeter Skriptierer, aber ich weiß mir zu helfen. Durch Internetrecherche, durch Erklärungen der KI und Hirn einschalten, komme ich an gute Ergebnisse - so wie in diesem Beitrag.

Da KI häufig negativ betrachtet wird, eine kurze Erklärung. Ich sehe KI als Bereicherung und als wertvolle Lern- und Arbeitshilfe. Sie ersetzt nicht das eigene Verständnis, aber sie beschleunigt den Weg dorthin. Alles, was ich mithilfe von KI erstellt habe und hier veröffentliche, habe ich nach bestem Wissen und Gewissen geprüft und getestet. Wenn dir dennoch ein Fehler auffällt oder du Verbesserungsvorschläge hast, freue ich mich sehr über dein Feedback 😊