# Linux

Verschiedene Grundlagen zum Linux Kernel bzw. insbesondere zu diversen Linux Distributionen. SystemD, Autostart, Desktopumgebungen, SSH, ...

# Autostart

Je nach Linux Distribution stehen verschiedene Möglichkeiten zur Auswahl, um Programme automatisch zu starten

### GUI (z. B. KDE, Gnome, Xfce)

Bei Distributionen mit einer grafischen Desktopumgebung wie z. B. Ubuntu (Gnome), Linux Mint (KDE, Xfce, Cinnamon, Mate) oder Debian (KDE) gibt es in der Regel ein Programm mit dem Namen Autostart.

[![grafik.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/gtdgrafik.png)](https://jaeckel.one/uploads/images/gallery/2024-03/gtdgrafik.png)

In dem Einstellungsfenster können nun für den aktuellen Benutzer Programme hinterlegt werden, welche beim Anmelden automatisch gestartet werden sollen. Dazu einfach auf das Pluszeichen oder *Hinzufügen* klicken. Es können nicht nur Programme ausgewählt werden, sondern auch An- und Abmelde Skripte, die ausgeführt werden sollen. Der folgende Screenshot zeit das Menü Autostart der Distribution Manjaro mit KDE als Desktopumgebung.

[![grafik.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/kmzgrafik.png)](https://jaeckel.one/uploads/images/gallery/2024-03/kmzgrafik.png)

Als Beispiel wird nun *Anwendung hinzufügen* ausgewählt, was der häufigste Anwendungsfall sein dürfte. In dem Fall öffnet sich ein neues Fenster, in dem nun das Programm ausgewählt werden kann. Oben wird ein Suchfeld angezeigt, in das der Name des Programms oder ein Teil davon eingegeben werden kann, um die Liste zu durchsuchen.

[![grafik.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/8oQgrafik.png)](https://jaeckel.one/uploads/images/gallery/2024-03/8oQgrafik.png)

Wird das Programm mit OK bestätigt, zeigt das Einstellungsfenster es nun in der Liste der Autostart Programme an. Dort kann es jederzeit wieder bearbeitet oder entfernt werden. Natürlich lassen sich noch weitere Programme oder Skripte zum Autostart hinzufügen.

[![grafik.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/bkTgrafik.png)](https://jaeckel.one/uploads/images/gallery/2024-03/bkTgrafik.png)

# Dateien live einlesen

Bei Logdateien ist es häufig hilfreich, wenn diese konstant eingelesen und dargestellt werden.

Hierfür bietet sich das Tool *tail* an. Angenommen wir haben eine Logdatei */var/log/mysql/abfragen.log*. In diese Logdatei werden alle Abfragen eines MySQL-Servers geschrieben. Wenn nun live im Log gelesen werden soll, welche Abfragen gerade ausgeführt werden, so geht dies mit dem folgenden Befehl.

```bash
tail -f /var/log/mysql/abfragen.log
```

Wird der Befehl ausgeführt, wird die Datei geöffnet und ans Ende gesprungen. Ab dann werden alle neuen Einträge im Terminal angezeigt.

[![grafik.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/Dlbgrafik.png)](https://jaeckel.one/uploads/images/gallery/2024-03/Dlbgrafik.png)

# Automatische Updates

Um Linux Server automatisch auf dem neusten Stand zu halten und somit den besten Schutz gegen Angriffe bieten zu können, bieten sich die automatischen Updates an.

### Automatische Sicherheitsupdates aktivieren

Hierfür steht das Paket unattended-upgrades bereit, welches ggf. mit folgenden Befehl nachinstalliert werden muss:

```bash
sudo apt -y install unattended-upgrades
```

Nach der Installation können die Auto-Updates wie folgt aktiviert werden:

```bash
sudo dpkg-reconfigure -plow unattended-upgrades
```

Zusätzlich sind noch einige Einstellungen vorzunehmen, damit auch wirklich alle Updates automatisch eingespielt werden.

Zuerst wird der automatische Neustart aktiviert, damit nach der Installation von Updates auch ein Neustart, sofern notwendig, durchgeführt wird. Hierfür ist die Konfigurationsdatei `/etc/apt/apt.conf.d/50unattended-upgrades` anzupassen. Diese enthält diverse Einstellungen, also am besten nach `Automatic-Reboot` suchen, auskommentieren und auf `true` ändern, wie im folgenden Beispiel zu sehen.

```ini
// Automatically reboot *WITHOUT CONFIRMATION* if
//  the file /var/run/reboot-required is found after the upgrade
Unattended-Upgrade::Automatic-Reboot "true";
```

### Sicherheits- und Standard-Pakete aktualisieren

Die Datei noch nicht schließen, denn standardmäßig werden nur Sicherheitsupdates installiert. Also in der selben Konfigurationsdatei nach folgender Zeile suchen und die Kommentarzeichen entfernen.

```ini
"${distro_id}:${distro_codename}-updates";
```

### Zeitpunkt der Suche/Installation anpassen

Nun können wir noch den Zeitpunkt anpassen, wann nach Updates gesucht und wann diese Installiert werden sollen. Dazu dient der folgenden Befehl, mit dessen Hilfe die Konfigurationsdatei bearbeitet wird.

```bash
sudo systemctl edit apt-daily.timer
```

Daraufhin öffnet sich die Konfiguration für die Update-Suche. Um die Updates z. B. jeden Tag um 01:00 Uhr automatisch suchen zu lassen, wird die Update-Suche wie folgt konfiguriert.

```ini
### Editing /etc/systemd/system/apt-daily.timer.d/override.conf
### Anything between here and the comment below will become the new contents of the file

[Timer]
OnCalendar=
OnCalendar=01:00
RandomizedDelaySec=0

### Lines below this comment will be discarded

### /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
```

Die Konfiguration für die Installation der Updates könnte z. B. wie folgt gestaltet werden, um diese eine halbe Stunde nach der Suche zu installieren.

```bash
sudo systemctl edit apt-daily-upgrade.timer
```

Und folgendes in die Konfigurationsdatei.

```ini
### Editing /etc/systemd/system/apt-daily-upgrade.timer.d/override.conf
### Anything between here and the comment below will become the new contents of the file

[Timer]
OnCalendar=
OnCalendar=01:30
RandomizedDelaySec=0

### Lines below this comment will be discarded

### /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
```

Nun noch die Dienste neu starten und den Status prüfen.

```bash
sudo systemctl restart apt-daily.timer
sudo systemctl restart apt-daily-upgrade.timer 
sudo systemctl status apt-daily.timer
sudo systemctl status apt-daily-upgrade.timer 
```

<p class="callout info">Unter /var/log/unattended-upgrades/ werden die verschiedenen Logs für Update-Suche, Installation und Neustart abgelegt. Das Log /var/log/unattended-upgrades/unattended-upgrades.log enthält z. B. die wichtigsten Informationen zu installierten Updates und Neustart.</p>

### Zusätzliche Pakete aktualisieren  


Wenn auf einem System zusätzliche Paketquellen wie z. B. für Docker hinzugefügt wurden, dann müssen diese manuell mit aufgenommen werden.

Mit folgenden Befehl können alle Paketquellen des Systems eingelesen werden.

```bash
ls -l /var/lib/apt/lists/ | grep "Release"
# Optional kann auch der folgende Befehl genutzt werden, um verschiedene Standard-Paketquellen rauszufiltern
ls -l /var/lib/apt/lists/ | grep "Release" | grep -v "security.ubuntu.com\|asi-fs-n."
```

Die Ausgabe könnte z. B. wie folgt aussehen.

[![grafik.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/9Brgrafik.png)](https://jaeckel.one/uploads/images/gallery/2024-03/9Brgrafik.png)

Hier sehen wir nun oben die Standard-Pakete von Contabo unter Ubuntu und ganz unten eine Paketquelle von Docker, die zur Zeit nicht aktualisiert wird. Also ermitteln wir zuerst einige Informationen über diese Paketquelle mit folgendem Befehl.

```bash
cat /var/lib/apt/lists/download.docker.com_linux_ubuntu_dists_jammy_InRelease | grep "Origin\|Suite"
```

In diesem Fall wird nun folgendes ausgegeben.

[![grafik.png](https://jaeckel.one/uploads/images/gallery/2024-03/scaled-1680-/mxRgrafik.png)](https://jaeckel.one/uploads/images/gallery/2024-03/mxRgrafik.png)

Jetzt können wir das Docker Paket hinzufügen, indem wir wieder die Datei `/etc/apt/apt.conf.d/50unattended-upgrades` bearbeiten. In dieser fügen wir die Zeilen in folgendem Abschnitt zwischen den geschweiften Klammern hinzu. Das Format für die Eingabe ist: `"<Origin>:<Suite>";`und somit in diesem Fall: `"Docker:jammy";`.

```ini
Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}";
        "${distro_id}:${distro_codename}-security";
        // Extended Security Maintenance; doesn't necessarily exist for
        // every release and this system may not have it installed, but if
        // available, the policy for updates is such that unattended-upgrades
        // should also install from here by default.
        "${distro_id}ESMApps:${distro_codename}-apps-security";
        "${distro_id}ESM:${distro_codename}-infra-security";
        "${distro_id}:${distro_codename}-updates";
//      "${distro_id}:${distro_codename}-proposed";
//      "${distro_id}:${distro_codename}-backports";
};
```

Danach sieht der Abschnitt wie folgt aus und wir speichern die Änderung.

```ini
Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}";
        "${distro_id}:${distro_codename}-security";
        // Extended Security Maintenance; doesn't necessarily exist for
        // every release and this system may not have it installed, but if
        // available, the policy for updates is such that unattended-upgrades
        // should also install from here by default.
        "${distro_id}ESMApps:${distro_codename}-apps-security";
        "${distro_id}ESM:${distro_codename}-infra-security";
        "${distro_id}:${distro_codename}-updates";
//      "${distro_id}:${distro_codename}-proposed";
//      "${distro_id}:${distro_codename}-backports";
        "Docker:jammy";
};
```

Nun das ganze einmal mit folgendem Befehl testen.

```bash
sudo unattended-upgrade --dry-run --debug
```

Jetzt sollten auch die Docker Updates angewendet werden. Aufgrund des Parameters `--dry-run` wird der Vorgang nur simuliert und nimmt keine Änderungen am System vor.