Linux · Tag 3 · Kapitel 02 von 6

Runlevels, systemd & Targets

Phase 4 des Boots aufgeklappt: was systemd genau macht, was Runlevels (0–6) sind, wie sie zu modernen Targets passen — und wie du mit systemctl Services und ganze System-Zustände steuerst. Im Lab verwandelst du deine Minimal-Installation in einen vollen Desktop.

📚 Kapitel 02 ⏱️ ca. 35 min Theorie + 45 min Lab 🧪 Lab 3.2
Inhalt dieses Kapitels
2.1

Runlevels — die klassische Welt

Pflicht

In der klassischen Unix-Welt (und in Linux bis etwa 2015) gab es das Konzept der Runlevels: Sieben definierte System-Zustände, in die der Computer nach dem Boot gebracht werden konnte. Heute (mit systemd) sind sie offiziell überholt — aber sie sind in jeder Prüfung Thema, und du musst die Mapping-Tabelle können.

Die klassische Runlevel-Tabelle

RunlevelBedeutungsystemd-Target (modern)
0System herunterfahren (Halt)poweroff.target
1Single-User-Modus (Rescue)rescue.target
2Multi-User, ohne Netzwerkmulti-user.target
3Multi-User, ohne GUI (Server-Standard)multi-user.target
4Benutzerdefiniert (selten genutzt)(je nach Distro)
5Multi-User mit GUIgraphical.target
6System neu starten (Reboot)reboot.target
🧠
Merksätze für die Prüfung
  • Runlevel 0 = Shutdown (System aus)
  • Runlevel 1 = Rescue (für Notfälle, Single User)
  • Runlevel 3 = Server-Normal (Multi-User, kein GUI)
  • Runlevel 5 = Desktop-Normal (Multi-User mit GUI)
  • Runlevel 6 = Reboot (System neustart)
💡
Eselsbrücke

Die Endpunkte (0 und 6) sind die einprägsamen: 0 = aus, 6 = restart. Dazwischen: 3 = Server (am häufigsten in der Praxis), 5 = Desktop. Den Rest brauchst du selten.

2.2

systemd — der moderne init

Pflicht

systemd hat seit 2015 das alte SysV-init in fast allen großen Distributionen ersetzt. Es ist der erste Prozess, den der Kernel startet (PID 1) und der Vater aller anderen Prozesse. Es ist viel mehr als nur ein init — es ist ein Service-Manager.

systemd-Architektur · Targets, Units & Services systemd PID 1 · /sbin/init Service-Manager TARGETS (Zustände) graphical.target multi-user.target rescue.target poweroff.target reboot.target = „Welcher Zustand?" UNIT-TYPEN • .service · Dienste • .target · Zustände • .mount · Mountpoints • .timer · Zeitgeber • .socket · Sockets SERVICES (Beispiele) sshd.service · SSH-Daemon httpd.service · Webserver NetworkManager.service crond.service · Cron firewalld.service = „Was läuft konkret?" systemctl dein Steuer-Tool

Alles ist eine Unit

Das wichtigste Wort in der systemd-Welt heißt Unit. Eine Unit ist nichts Magisches — es ist eine einfache Textdatei, die systemd sagt: „Hier ist etwas, das du verwalten sollst." Ein Service, ein Target, ein Mount-Point, ein Timer — alles sind Units. Sie unterscheiden sich nur durch die Endung.

Unit-TypEndungWofür?
Service.serviceein laufendes Programm (sshd, httpd, NetworkManager)
Target.targetein System-Zustand (multi-user, graphical, rescue)
Mount.mountein Dateisystem-Mountpoint
Timer.timerzeitgesteuerter Trigger (Cron-Ersatz)
Socket.socketNetzwerk- oder Unix-Socket

Targets vs. Services — die zwei, die du täglich brauchst

Targets sind System-Zustände — wie die alten Runlevels. „multi-user.target" bedeutet: das System ist bereit, mehrere User können sich einloggen, Services laufen, aber keine grafische Oberfläche. „graphical.target" bedeutet: zusätzlich noch die GUI.

Services sind einzelne Programme/Dienste: der SSH-Server (sshd.service), der Webserver (httpd.service), der Netzwerk-Manager (NetworkManager.service). Du kannst sie einzeln starten, stoppen, aktivieren (= bei Boot mitstarten) oder deaktivieren.

Beide werden mit einem einzigen Werkzeug gesteuert: systemctl.

Wo leben Unit-Dateien?

systemd schaut an zwei Stellen nach Unit-Dateien:

PfadInhalt
/usr/lib/systemd/system/Units, die mit Paketen kommen (z. B. sshd.service von openssh-server). Hier nicht editieren! Wird beim Paket-Update überschrieben.
/etc/systemd/system/Eigene Units & Anpassungen. Wenn hier eine Datei mit gleichem Namen liegt wie unter /usr/lib/..., gewinnt /etc/.

Wenn du wissen willst, was ein Service wirklich macht, schaust du in seine Unit-Datei. Beispiel — die SSH-Server-Unit ansehen:

bash
cat /usr/lib/systemd/system/sshd.service

Du siehst dann etwa diese Struktur (gekürzt):

ini
[Unit]
Description=OpenSSH server daemon

[Service]
Type=notify
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

Drei Sektionen, drei Aufgaben:

  • [Unit] — Beschreibung, was die Unit überhaupt ist (Description, Dokumentation, …)
  • [Service] — wie wird der Dienst gestartet, neu geladen, beendet (welcher Befehl, mit welchen Parametern)
  • [Install] — wann soll der Dienst aktiviert werden? WantedBy=multi-user.target heißt: wenn jemand systemctl enable sshd aufruft, soll er beim Erreichen des multi-user.target gestartet werden.
💡
Das eigentliche Aha

systemd ist keine Black Box. Hinter jedem systemctl start xyz steht eine simple Textdatei, die du lesen und verstehen kannst. Wenn ein Service nicht startet, schaust du in seine Unit-Datei — und in seine Logs (gleich mehr dazu).

▶ Tiefer einsteigen: Warum war systemd so umstritten?

Als systemd 2010 vorgestellt wurde, gab es heftige Debatten in der Linux-Community. Vorher: SysV-init startete Services einzeln, nacheinander, mit Shell-Skripten. Simpel, gut zu debuggen, aber langsam (10–30 Sekunden Boot-Zeit war normal).

systemd dagegen: startet Services parallel, kümmert sich um Abhängigkeiten, hat eingebautes Logging (journalctl), behandelt Timer (Cron-Ersatz), Mountpoints, Sockets — alles in einem. Dadurch: Boot in 3–5 Sekunden.

Kritiker: systemd macht zu viel, ist zu komplex, widerspricht dem Unix-Prinzip „eine Sache, dafür gut". Befürworter: moderne Hardware und Services brauchen eben moderne Lösungen. Heute (2026) ist die Debatte praktisch entschieden: systemd ist Standard auf allen großen Distributionen außer ein paar puristischen (Devuan, Alpine, Gentoo).

2.3

systemctl · Target-Unit (Zustände wechseln)

Pflicht

Mit systemctl und Target-Befehlen kontrollierst du den gesamten System-Zustand: GUI an, GUI aus, Rescue-Modus, Reboot.

Die wichtigsten Target-Befehle

BefehlWirkung
systemctl get-defaultZeigt das default Target (welches beim Boot angefahren wird)
sudo systemctl set-default [TARGET]Default Target ändern (wirkt erst beim nächsten Boot)
sudo systemctl isolate [TARGET]Sofort zum Target wechseln (ohne Reboot!)
systemctl list-units --type=targetAlle aktiven Targets anzeigen
telinit [0-6]Klassischer Befehl, wechselt zum Runlevel (Wrapper für isolate)
runlevelAktuellen "Runlevel" anzeigen (Legacy-Befehl)
bash
# Aktuelles Default-Target anzeigen
systemctl get-default
# → multi-user.target  (auf Minimal-Installation)
# oder graphical.target  (auf Desktop-Installation)

# Default auf graphical setzen (wirkt beim NÄCHSTEN Boot)
sudo systemctl set-default graphical.target

# SOFORT zu multi-user wechseln (ohne Reboot)
sudo systemctl isolate multi-user.target

# Über Runlevel-Nummer (Klassik)
sudo telinit 3       # entspricht multi-user
sudo telinit 5       # entspricht graphical
sudo telinit 6       # neu starten
sudo telinit 0       # herunterfahren
⚠️
isolate vs. set-default

set-default ändert das Target, das beim nächsten Boot angefahren wird. Jetzt passiert nichts.

isolate wechselt das Target sofort — aber nur für die aktuelle Sitzung. Beim nächsten Boot ist alles wieder wie in get-default steht.

Beste Praxis: erst isolate testen (kein Reboot nötig), wenn alles funktioniert, mit set-default dauerhaft setzen.

2.4

systemctl · Service-Unit (Dienste steuern)

Pflicht

Hier wirst du als Admin täglich arbeiten: einzelne Dienste starten, stoppen, prüfen.

Die wichtigsten Service-Befehle

BefehlWirkung
sudo systemctl status [DIENST]Status anzeigen (läuft, gestoppt, Fehler?)
sudo systemctl start [DIENST]Dienst jetzt starten
sudo systemctl stop [DIENST]Dienst jetzt stoppen
sudo systemctl restart [DIENST]Dienst neu starten (stop + start)
sudo systemctl reload [DIENST]Config neu laden (ohne Restart, wenn Dienst es unterstützt)
sudo systemctl enable [DIENST]Dienst beim Boot mitstarten (dauerhaft)
sudo systemctl disable [DIENST]Beim Boot nicht mehr starten
sudo systemctl is-active [DIENST]Schnell-Check: läuft? (gibt nur „active" oder „inactive" zurück)
sudo systemctl is-enabled [DIENST]Schnell-Check: wird beim Boot gestartet?
sudo journalctl -u [DIENST]Logs des Dienstes anzeigen
bash
# Status SSH-Server
sudo systemctl status sshd
# ● sshd.service - OpenSSH server daemon
#    Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
#    Active: active (running) since Mon 2026-05-27 08:15:23 CEST
#    ...

# Starten / stoppen / neustarten
sudo systemctl start sshd
sudo systemctl stop sshd
sudo systemctl restart sshd

# Beim Boot mitstarten (dauerhaft aktivieren)
sudo systemctl enable sshd

# Bei Boot NICHT mehr mitstarten
sudo systemctl disable sshd

# Beides in einem: enable + start jetzt
sudo systemctl enable --now sshd
💡
start vs. enable — der häufigste Verständnis-Fehler

start = Dienst jetzt anwerfen (aber: beim nächsten Boot ist er wieder aus, falls nicht enabled).

enable = bei jedem Boot automatisch mitstarten (aber: er läuft jetzt noch nicht, wenn nicht zusätzlich start).

Kombi-Trick: systemctl enable --now sshd macht beides in einem Befehl — sofort starten UND beim Boot aktivieren.

▶ Was passiert technisch bei systemctl enable?

Wenn du sudo systemctl enable sshd ausführst, legt systemd einen Symlink an — und sonst nichts. Schau selbst:

bash
ls -l /etc/systemd/system/multi-user.target.wants/
# sshd.service -> /usr/lib/systemd/system/sshd.service

Der Symlink steht in einem Verzeichnis mit der Endung .target.wants/. Übersetzt: „Das multi-user.target möchte diesen Service haben." Wenn das Target beim Boot aktiviert wird, startet systemd alle Services, die im .wants/-Verzeichnis stehen.

Diesen Mechanismus kennst du aus Tag 2 (Soft Links) wieder — ein Verzeichnis voller Symlinks, die auf die echten Unit-Dateien zeigen. Mehr Magie steckt nicht dahinter.

2.5

Herunterfahren & Neustarten

Praxis

Es gibt mehrere Wege, ein Linux-System herunterzufahren oder neu zu starten. Alle modernen sind systemctl-Befehle — die klassischen wie shutdown und reboot funktionieren aber weiterhin (sind Wrapper).

Herunterfahren

BefehlWirkung
sudo shutdownHerunterfahren in 1 Minute (Default)
sudo shutdown nowSofort herunterfahren
sudo shutdown +5In 5 Minuten herunterfahren
sudo shutdown -cGeplanten Shutdown abbrechen
sudo poweroffSofort herunterfahren (wie Stromtrennung)
sudo systemctl poweroffModerner Weg — sofort herunterfahren
sudo haltAnhalten ohne Strom abschalten (Legacy)
sudo telinit 0Klassik-Variante: Runlevel 0 = halt

Neustarten

BefehlWirkung
sudo rebootSofort neustarten
sudo shutdown -r nowSofort neustarten
sudo shutdown -r +5In 5 Minuten neustarten
sudo systemctl rebootModerner Weg — sofort neustarten
sudo telinit 6Klassik-Variante: Runlevel 6 = reboot
⚠️
In Produktionsumgebungen

Auf Servern niemals einfach sudo poweroff. Stattdessen:

  • sudo shutdown +10 "Wartung — Server fährt in 10 Min runter" — User werden gewarnt
  • Vorher prüfen: Wer ist noch eingeloggt? who
  • Wichtige Dienste sauber stoppen (systemctl stop ...)
  • Mit sudo shutdown -c kannst du einen geplanten Shutdown abbrechen
2.6

Vorab fürs Lab: Logs lesen mit journalctl

Kurz
▶ Vorab: Was ist journalctl?

Wenn ein Service nicht startet oder sich seltsam verhält, willst du wissen warum. Auf modernen Linux-Systemen schreibt systemd alle Service-Meldungen in das journal — eine zentrale, binäre Log-Datenbank unter /var/log/journal/.

Gelesen wird das journal nicht mit cat oder less (es ist binär), sondern mit journalctl. Die wichtigsten Varianten:

BefehlWirkung
journalctlalle Log-Meldungen seit Systemstart (q zum Beenden)
journalctl -u sshdnur Meldungen des sshd-Services
journalctl -u sshd -n 20nur die letzten 20 Zeilen
journalctl -u sshd -flive mitschreiben (follow), bis Strg+C
journalctl -p errnur Fehlermeldungen (priority error)

Im Lab gleich brauchst du nur journalctl -u sshd -n 20. Mehr ist für heute nicht nötig — das ist eher Stoff für ein Logging-Modul später.

🧪

Lab 3.2 — Targets & Services beherrschen

Lab · 45 min
📧
Auftrag von Markus (Mail-Fortsetzung)

Hallo Tim,

nächste Aufgabe: systemctl beherrschen. Das ist wirklich das Werkzeug, das du nächste Woche jeden Tag benutzen wirst. Du sollst:

  1. Eine Unit-Datei lesen und verstehen (sshd.service)
  2. Den SSH-Service live steuern — ein Wartungsfenster simulieren
  3. Aus deiner Minimal-Installation einen Desktop machen (graphical.target isolieren) — ohne Reboot

Das letzte ist der „Aha!"-Moment des Tages. Aus einem Server-Terminal wird per Befehl eine grafische Oberfläche.

— Markus

Aufbau: Drei Phasen, ca. 45 min insgesamt — mit aufklappbaren Hints und Lösung pro Phase.

📸
VOR dem Lab: Snapshot!

Mach jetzt einen Snapshot vor-targets. Falls etwas mit dem Target-Wechsel schief geht (z. B. Anmeldung im rescue.target verweigert), bist du in Sekunden wieder da.

Voraussetzung — GUI-Installation läuft im Hintergrund

Falls noch nicht gestartet (Trainer hat das normalerweise zu Beginn des Tages gemacht), starte JETZT in einem zweiten Terminal (oder Ctrl+Alt+F3 für Konsole, dann zurück mit Ctrl+Alt+F1):

sudo dnf groupinstall "Server with GUI" -y

Das dauert 5–15 Min und läuft im Hintergrund. Du kannst Teil A und Teil B des Labs in der Zwischenzeit machen.

Phase 1 — Eine Unit-Datei lesen & verstehen (10 min)
🎯
Deine Aufgabe

„Tim, schau dir mal sshd.service genau an. Wenn du das verstanden hast, verstehst du systemd zur Hälfte." — Markus

Öffne die Unit-Datei des SSH-Servers und erklär in eigenen Worten, was die Sektionen [Unit], [Service] und [Install] tun. Am Ende sollst du beantworten können: „Wenn ich systemctl enable sshd mache — woher weiß systemd, dass das beim Boot starten soll?"

💡 Hint 1 — Wo finde ich Unit-Dateien?

Paket-Units liegen unter /usr/lib/systemd/system/, eigene Anpassungen unter /etc/systemd/system/. Die sshd-Unit kommt vom Paket — also im ersten Pfad.

💡 Hint 2 — Welcher Befehl liest die Datei?

cat /usr/lib/systemd/system/sshd.service — eine ganz normale Textdatei, die du mit cat oder less lesen kannst.

💡 Hint 3 — Welche Zeile macht beim Boot-Start die Magie?

Schau in die [Install]-Sektion. Die Zeile WantedBy=multi-user.target sagt: beim enable wird der Dienst dem multi-user.target zugeordnet und startet, sobald dieses erreicht wird.

bash
cat /usr/lib/systemd/system/sshd.service

# [Unit]    → Description=OpenSSH server daemon  (was ist das?)
# [Service] → ExecStart=/usr/sbin/sshd -D ...    (wie wird gestartet?)
# [Install] → WantedBy=multi-user.target         (wann aktiviert?)

Erklärung: [Unit] beschreibt, was die Unit ist. [Service] sagt, wie der Dienst gestartet/neu geladen/beendet wird. [Install] legt fest, wann er aktiviert wird: WantedBy=multi-user.target ist genau die Zeile, die beim systemctl enable sshd dafür sorgt, dass ein Symlink im multi-user.target.wants/-Verzeichnis angelegt wird — und der Dienst dadurch beim Boot mitstartet.

Phase 2 — sshd live steuern (15 min)
🎯
Deine Aufgabe

„Tim, ich brauch ein Wartungsfenster auf dem Test-Server. Stopp den SSH-Dienst für 5 Minuten und prüf danach, dass er sauber wieder läuft. Schau dir auch kurz die Logs an, ob beim Stoppen alles glatt lief." — Markus

Steuere den SSH-Dienst mit systemctl: Status prüfen (vorher), stoppen, Status erneut prüfen, wieder starten — und am Ende einen Blick in die Logs. Finde selbst heraus, welche Befehle du brauchst.

💡 Hint 1 — Welche systemctl-Befehle brauche ich überhaupt?

Vier reichen: systemctl status sshd, systemctl stop sshd, systemctl start sshd und systemctl restart sshd. Status braucht kein sudo, die anderen drei schon.

💡 Hint 2 — Wie sehe ich auf einen Blick, ob ein Service läuft?

Statt den langen Status zu lesen: systemctl is-active sshd (gibt active / inactive) und systemctl is-enabled sshd (startet er beim Boot?).

💡 Hint 3 — Wo sehe ich die Logs?

Mit dem journalctl-Befehl von oben: journalctl -u sshd -n 20 zeigt die letzten 20 Zeilen des sshd-Services — inklusive der Stop/Start-Meldungen.

bash
# Status vorher
systemctl status sshd          # Active: active (running)

# Wartungsfenster: stoppen
sudo systemctl stop sshd
systemctl is-active sshd       # inactive

# ... 5 Minuten Wartung ... dann wieder starten
sudo systemctl start sshd
systemctl is-active sshd       # active
systemctl is-enabled sshd      # enabled

# Sauber wieder oben? Logs der letzten Minuten ansehen
journalctl -u sshd -n 20

Aha-Moment: Nach einem start (oder restart) aktualisiert sich der „Active: active (running) since …"-Zeitstempel im Status — so siehst du sofort, dass der Dienst frisch hochgefahren ist. Die ganze Service-Kontrolle ist einheitlich mit systemctl, egal ob SSH, Webserver oder Firewall.

Phase 3 — Target wechseln: aus Minimal mach Graphical (20 min)
🎯

Der Aha-Moment des Tages. Du verwandelst deine schwarze Minimal-Installation in einen grafischen Desktop — per Befehl, ohne Reboot. Dann zurück.

🎯
Deine Aufgabe

„Tim, manche Kollegen brauchen kurzfristig eine GUI für ein Tool. Du sollst zeigen, dass das mit systemd in 5 Sekunden geht — ohne den Server runterzufahren." — Markus

Wechsle live (ohne Reboot) ins graphical.target, schau dich im Desktop kurz um, und komm wieder zurück ins multi-user.target. Setz am Ende das Default sauber wieder auf Minimal zurück.

💡 Hint 1 — Ist die GUI-Installation schon fertig?

Die GUI (Server with GUI) sollte seit Tagesbeginn im Hintergrund installiert worden sein. Ob dnf noch läuft, prüfst du ohne Prozess-Tools so: ls /run/dnf.pid 2>/dev/null — existiert die Datei, läuft dnf noch; kommt nichts zurück, ist es fertig. (Alternativ: in das Terminal schauen, in dem du dnf groupinstall gestartet hast.) Falls noch gar nicht installiert: sudo dnf groupinstall "Server with GUI" -y und 5–15 Min warten.

💡 Hint 2 — Wie wechsle ich live, ohne Reboot?

sudo systemctl isolate graphical.target wechselt das System sofort in den angegebenen Zustand — kein Reboot nötig. Zurück geht's mit sudo systemctl isolate multi-user.target.

💡 Hint 3 — Unterschied set-default vs. isolate?

isolate wirkt jetzt sofort (aktuelle Sitzung), set-default bestimmt den Zustand beim nächsten Boot. Beides nutzen: isolate zum Live-Testen, set-default um den Boot-Zustand dauerhaft festzulegen.

bash
# 1) Ist die GUI-Installation fertig? (ohne Prozess-Tools)
ls /run/dnf.pid 2>/dev/null && echo "dnf läuft noch" || echo "fertig"
# Falls noch nicht installiert:
sudo dnf groupinstall "Server with GUI" -y   # 5-15 Min

# 2) LIVE in den grafischen Modus wechseln (ohne Reboot!)
sudo systemctl isolate graphical.target
# → Bildschirm wird schwarz, dann grafischer Login. Aha!

# 3) Im Desktop: Terminal öffnen, aktuelles Target prüfen
systemctl get-default

# 4) Zurück in den Server-Modus
sudo systemctl isolate multi-user.target

# 5) WICHTIG: Default sauber auf Minimal zurücksetzen,
#    sonst startet die VM künftig immer mit GUI (frisst RAM)
sudo systemctl set-default multi-user.target

Aha-Moment: Du hast aus einer „Server-Box" einen „Desktop" gemacht — und wieder zurück, ohne Reboot. isolate wechselt nur den aktuellen Zustand, set-default bestimmt den nächsten Boot. Deshalb am Ende set-default multi-user.target — damit der Server nach dem nächsten Neustart wieder schlank im Minimal-Modus hochkommt.

🌟 Bonus für schnelle Teilnehmer
  1. Zweiten Service erkunden: Schau dir den Status von firewalld an. Was zeigt der Status? Ist der Service aktiv (active) und enabled (startet er beim Boot)? Nicht starten oder stoppen — Firewall-Konfiguration kommt in einem späteren Modul. Heute nur lesen.
  2. Boot-Performance: Welche Services brauchen am längsten beim Boot? Befehl: systemd-analyze blame. Hängt das vom Target ab? (Tipp: nach Wechsel zu graphical werden mehr Services geladen.)
  3. Geplantes Herunterfahren: Plane einen Shutdown in 5 Minuten mit einer Nachricht, dann breche ihn ab. Tipp: shutdown +5 "Wartung..." und direkt danach shutdown -c zum Abbrechen. Achtung: Wenn du das Abbrechen vergisst, fährt deine VM in 5 Minuten herunter — also direkt nacheinander eingeben.
  4. Failed Services: Gibt es Services, die nicht starten wollen? systemctl list-units --state=failed. Hoffentlich keiner — aber das ist die erste Stelle, an der man bei Boot-Problemen schaut.
bash
# 20) Firewalld — nur Status lesen, NICHT starten/stoppen
systemctl status firewalld
# Zeigt: active (running) oder inactive (dead), enabled/disabled.
# Firewall-Konfiguration kommt in einem späteren Modul.

# 21) Boot-Performance
systemd-analyze blame
# Liste sortiert nach Startdauer

# 22) Geplanter Shutdown + Abbruch
sudo shutdown +5 "Wartung läuft an"
# → Broadcast-Nachricht an alle eingeloggten User
sudo shutdown -c
# → "Shutdown scheduled ... has been cancelled"

# 23) Failed Services
systemctl list-units --state=failed
# Hoffentlich: "0 loaded units listed"
🎉
Lab 3.2 geschafft?

Mega! Du hast jetzt systemctl in der Hand — das wichtigste Werkzeug eines Linux-Admins. Du kannst Services steuern, Targets wechseln, sogar einen Desktop „herbeizaubern" — alles ohne Reboot. Das ist Senior-Admin-Niveau für so viel Eigenwissen.

2.7

Typische Anfänger-Fehler

Vorsicht
Fehler 1 — start ohne enable

„Dienst läuft, alles OK!" → Reboot → Dienst läuft nicht mehr. Grund: start ist nur für jetzt. Für „bei Boot mitstarten" brauchst du enable. Beste Praxis: enable --now.

Fehler 2 — Target falsch eingegeben

systemctl isolate multi-user → Fehler. Korrekt: systemctl isolate multi-user.target. Die Endung .target nicht vergessen.

Fehler 3 — set-default mit Reboot verwechseln

„Ich habe set-default graphical gemacht und nichts passiert!" — Richtig, set-default wirkt erst beim nächsten Boot oder mit zusätzlichem isolate.

Fehler 4 — sudo vergessen

Alle Service-Änderungen brauchen sudo: start, stop, enable, disable, isolate, set-default. Nur status, is-active, list-units gehen ohne sudo.

🎯

Kontrollfragen zum Kapitel

Selbst-Check
  1. Wofür wird Runlevel 0 verwendet?
  2. Welches systemd-Target entspricht Runlevel 5?
  3. Welche Sektion einer .service-Unit-Datei steuert, ob ein Dienst beim Boot startet — und welche Zeile darin?
  4. Was ist der Unterschied zwischen systemctl isolate und systemctl set-default?
  5. Was ist der Unterschied zwischen start und enable?
  6. Welche zwei Befehle (Auswahl: shutdown, reboot, poweroff, telinit, systemctl) können das System ausschalten?
  1. Runlevel 0 = System herunterfahren (Shutdown).
  2. Runlevel 5 = graphical.target
  3. Die [Install]-Sektion, konkret die Zeile WantedBy=multi-user.target. Beim systemctl enable wird daraus ein Symlink im multi-user.target.wants/-Verzeichnis angelegt.
  4. isolate wechselt das Target sofort in der laufenden Sitzung (kein Reboot). set-default legt fest, welches Target beim nächsten Boot angefahren wird — jetzt passiert nichts.
  5. start startet den Dienst sofort (aber nicht beim nächsten Boot). enable macht ihn boot-persistent (startet aber nicht jetzt). Kombi: enable --now.
  6. shutdown und systemctl poweroff. (auch poweroff und telinit 0 wären richtig)