Kapitel 1: Die Grundlagen von systemd
Einführung: Das Herzstück moderner Linux-Systeme
Systemd stellt eine fundamentale Revolution in der Linux-Systemverwaltung dar. Als Init-System und Systemmanager hat es die Art und Weise, wie wir Linux-Systeme verstehen und verwalten, grundlegend verändert. Dieses Kapitel führt Sie durch die essentiellen Grundlagen von systemd und vermittelt Ihnen das notwendige Verständnis für die tiefergehenden Konzepte der folgenden Kapitel.
Die Bedeutung von systemd kann nicht überschätzt werden. Es ist nicht nur ein einfacher Ersatz für das traditionelle SysV-Init-System, sondern ein vollständiges Ökosystem von Tools und Diensten, die zusammenarbeiten, um ein modernes, effizientes und wartbares Linux-System zu schaffen.
Was ist systemd?
Systemd ist ein System- und Service-Manager für Linux-Betriebssysteme. Es wurde von Lennart Poettering entwickelt und erstmals 2010 veröffentlicht. Der Name "systemd" folgt der Unix-Konvention, Daemon-Programme mit einem "d" am Ende zu kennzeichnen.
Die Kernfunktionen von systemd
Systemd übernimmt verschiedene kritische Aufgaben im Linux-System:
Prozess-Management: Als PID 1 (der erste Prozess, der beim Systemstart gestartet wird) ist systemd verantwortlich für das Starten, Überwachen und Beenden aller anderen Prozesse im System.
Service-Verwaltung: Systemd verwaltet Systemdienste und stellt sicher, dass sie ordnungsgemäß gestartet, gestoppt und überwacht werden.
Ressourcen-Management: Durch die Integration von Control Groups (cgroups) kann systemd Systemressourcen wie CPU, Speicher und I/O für Dienste begrenzen und überwachen.
Logging: Das systemd-journal bietet ein zentralisiertes, strukturiertes Logging-System, das traditionelle Syslog-Implementierungen ergänzt oder ersetzt.
Architektur und Design-Prinzipien
Die Architektur von systemd basiert auf mehreren Schlüsselprinzipien:
Parallelisierung: Systemd startet Dienste parallel, wo immer möglich, was zu deutlich schnelleren Boot-Zeiten führt.
Socket-basierte Aktivierung: Dienste können bei Bedarf gestartet werden, wenn eine Anfrage an ihren Socket gestellt wird.
Bus-basierte Aktivierung: Dienste können automatisch gestartet werden, wenn sie über D-Bus angefordert werden.
Abhängigkeits-Management: Systemd verwaltet komplexe Abhängigkeiten zwischen Diensten automatisch.
Historischer Kontext: Von SysV zu systemd
Um systemd vollständig zu verstehen, ist es wichtig, den historischen Kontext zu betrachten. Traditionelle Linux-Systeme verwendeten das SysV-Init-System, das auf einer sequenziellen Ausführung von Shell-Skripten basierte.
Probleme des traditionellen Init-Systems
Das SysV-Init-System hatte mehrere inhärente Probleme:
Sequenzielle Ausführung: Dienste wurden nacheinander gestartet, was zu langen Boot-Zeiten führte.
Komplexe Skript-Verwaltung: Die Verwaltung von Init-Skripten war fehleranfällig und schwer zu debuggen.
Mangelnde Überwachung: Es gab keine eingebaute Überwachung von Diensten nach dem Start.
Ressourcen-Management: Keine integrierte Kontrolle über Systemressourcen.
Die systemd-Lösung
Systemd adressiert diese Probleme durch:
# Beispiel: Vergleich zwischen SysV und systemd
# SysV-Stil (traditionell):
/etc/init.d/apache2 start
service apache2 status
# systemd-Stil (modern):
systemctl start apache2
systemctl status apache2
Hinweis: Die systemctl-Befehle sind nicht nur syntaktisch unterschiedlich, sondern bieten auch erweiterte Funktionalität wie detaillierte Statusinformationen, Abhängigkeitsverfolgung und integrierte Logging-Unterstützung.
Grundlegende systemd-Konzepte
Units: Die Bausteine von systemd
In systemd ist alles eine "Unit". Units sind die grundlegenden Objekte, die systemd verwaltet. Es gibt verschiedene Arten von Units:
Unit-Typ
Beschreibung
Dateiendung
Beispiel
Service
Systemdienste
.service
apache2.service
Socket
IPC-Sockets
.socket
docker.socket
Target
Gruppierung von Units
.target
multi-user.target
Timer
Zeitbasierte Aktivierung
.timer
backup.timer
Mount
Dateisystem-Mountpoints
.mount
home.mount
Automount
Automatische Mounts
.automount
home.automount
Device
Gerätedateien
.device
dev-sda1.device
Swap
Swap-Dateien/-Partitionen
.swap
dev-sda2.swap
Service Units im Detail
Service Units sind die häufigste Art von Units und repräsentieren Systemdienste. Eine typische Service Unit-Datei sieht folgendermaßen aus:
# Beispiel einer Service Unit-Datei: /etc/systemd/system/myapp.service
[Unit]
Description=My Application Service
After=network.target
Requires=network.target
[Service]
Type=simple
User=myapp
Group=myapp
ExecStart=/usr/bin/myapp --daemon
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Erklärung der Sektionen:
[Unit]: Enthält allgemeine Metadaten über die Unit
- Description: Beschreibung der Unit - After: Startet nach den angegebenen Units - Requires: Harte Abhängigkeit zu anderen Units
[Service]: Spezifische Konfiguration für Service Units
- Type: Art des Services (simple, forking, oneshot, etc.) - User/Group: Benutzer und Gruppe für die Ausführung - ExecStart: Kommando zum Starten des Services - ExecReload: Kommando zum Neuladen der Konfiguration - Restart: Neustart-Politik - RestartSec: Wartezeit vor Neustart
[Install]: Installationsinformationen
- WantedBy: Target, das diese Unit aktivieren soll
Targets: Systemzustände definieren
Targets sind spezielle Units, die Gruppen von anderen Units repräsentieren. Sie entsprechen den Runlevels des traditionellen SysV-Systems, sind aber flexibler.
# Wichtige System-Targets anzeigen
systemctl list-units --type=target
# Aktuelles Default-Target anzeigen
systemctl get-default
# Default-Target ändern
sudo systemctl set-default multi-user.target
Wichtige Standard-Targets:
Target
Beschreibung
Entspricht Runlevel
poweroff.target
System herunterfahren
0
rescue.target
Single-User-Modus
1
multi-user.target
Multi-User ohne GUI
2, 3, 4
graphical.target
Multi-User mit GUI
5
reboot.target
System neustarten
6
Grundlegende systemctl-Befehle
Das systemctl-Kommando ist das primäre Tool für die Interaktion with systemd. Es bietet umfassende Funktionalität für die Verwaltung von Units.
Service-Management
# Service starten
sudo systemctl start servicename
# Service stoppen
sudo systemctl stop servicename
# Service neustarten
sudo systemctl restart servicename
# Service-Konfiguration neu laden (ohne Neustart)
sudo systemctl reload servicename
# Service-Status anzeigen
systemctl status servicename
# Detaillierte Service-Informationen
systemctl show servicename
Hinweis: Der reload-Befehl funktioniert nur, wenn der Service das Neuladen der Konfiguration unterstützt (SIGHUP-Signal).
Service-Aktivierung und -Deaktivierung
# Service beim Systemstart aktivieren
sudo systemctl enable servicename
# Service beim Systemstart deaktivieren
sudo systemctl disable servicename
# Service aktivieren und sofort starten
sudo systemctl enable --now servicename
# Service deaktivieren und sofort stoppen
sudo systemctl disable --now servicename
# Prüfen, ob Service aktiviert ist
systemctl is-enabled servicename
# Prüfen, ob Service aktiv ist
systemctl is-active...