Bootzeiten optimieren mit systemd: So analysiert man langsame Systeme

Bootzeiten optimieren mit systemd-analyze: So analysiert man langsame Systeme
Vermischtes

Lange Startzeiten bei Linux-Systemen sind ein bekanntes Ärgernis im Alltag vieler Nutzer. Besonders bei Servern, die eine hohe Verfügbarkeit benötigen, oder auf Desktop-Systemen, die täglich mehrfach hochgefahren werden, wirkt sich jede gesparte Sekunde merklich aus. Mit der Einführung von systemd haben moderne Linux-Distributionen ein mächtiges Werkzeug erhalten. Dieses verwaltet nicht nur Dienste, sondern ermöglicht auch detaillierte Analysen der Bootzeiten.

Das Besondere an systemd liegt in seiner parallelen Arbeitsweise beim Systemstart. Anders als ältere Init-Systeme startet systemd mehrere Dienste gleichzeitig, wenn deren Abhängigkeiten erfüllt sind. Diese Parallelisierung bringt erhebliche Geschwindigkeitsvorteile, macht aber auch die Analyse komplexer. Glücklicherweise bietet systemd mit dem Kommandozeilenwerkzeug systemd-analyze eine umfangreiche Sammlung von Befehlen, mit denen sich jeder Schritt des Bootvorgangs genau untersuchen lässt.

Die Grundlagen von systemd-analyze verstehen

Das Werkzeug systemd-analyze ist fest in systemd integriert und ermöglicht die Leistungsanalyse des Startvorgangs. Es erfasst präzise Zeitstempel für jeden Dienst, jede Abhängigkeit und jeden Übergang zwischen den verschiedenen Boot-Phasen. Ohne weitere Parameter aufgerufen zeigt der Befehl „systemd-analyze“ eine Übersicht der gesamten Bootzeit und unterteilt diese in Firmware-, Bootloader-, Kernel- und Userspace-Zeiten. Dadurch erkennt man, welche Phase des Bootvorgangs die meiste Zeit verbraucht.

Der grundlegende Befehl „systemd-analyze time“ liefert eine erste Einschätzung der Systemleistung. Er gibt Auskunft darüber, wie viele Sekunden zwischen dem Start des BIOS und dem Erreichen des Userspace vergangen sind. Bei UEFI-Systemen werden zusätzlich die Zeiten für Firmware und Bootloader angezeigt. Diese Informationen bilden die Basis für alle weiteren Optimierungen, weil sie zeigen, ob primär die Hardware-Initialisierung oder die Software-Dienste für Verzögerungen verantwortlich sind.

Services identifizieren, die den Start verzögern

Mit dem Unterbefehl „blame“ zeigt systemd-analyze eine Liste aller gestarteten Dienste sortiert nach ihrer Initialisierungszeit an. Der Befehl „systemd-analyze blame“ listet alle Units in absteigender Reihenfolge auf, beginnend mit jenen, die am längsten zum Starten benötigt haben. Diese sortierte Darstellung macht es leicht, die größten Zeitfresser auf einen Blick zu erkennen. Typische Kandidaten sind Datenbankdienste wie MariaDB oder PostgreSQL, Netzwerkdienste wie NetworkManager-wait-online.service oder auch Desktop-Komponenten bei grafischen Oberflächen.

blame·Zeitwerte richtig lesen
Parallel – unkritisch
7.2s mariadb.service
Startet parallel zu anderen Diensten. Lange Laufzeit, aber kein Blocker — die Gesamtbootzeit bleibt unberührt.
Sequenziell – kritisch
9.8s NM-wait-online.service
Blockiert alle abhängigen Units. Kein anderer Dienst startet weiter — direkte Verlängerung der Gesamtbootzeit.
Hohe Werte in blame sind nur relevant, wenn der Service in der critical-chain auftaucht.

Die angezeigten Zeitwerte sollten allerdings mit Vorsicht interpretiert werden. Ein Dienst mit langer Initialisierungszeit blockiert nicht zwangsläufig den gesamten Bootvorgang, wenn andere Dienste parallel laufen können. Häufig problematisch sind Services wie NetworkManager-wait-online.service, der tatsächlich wartet, bis eine Netzwerkverbindung hergestellt ist, bevor weitere Dienste starten können. Solche Dienste verlängern die Bootzeiten und sind echte Bremsen im Startprozess, weil sie aktiv andere Units blockieren und keine parallele Ausführung zulassen.

Critical Chain analysieren und Abhängigkeiten verstehen

Die kritische Kette zeigt, welche Units sequenziell aufeinander warten und damit den Bootvorgang direkt verlängern. Der Befehl „systemd-analyze critical-chain“ stellt diese Abhängigkeitskette als Baumstruktur dar, bei der jeder Eintrag zwei Zeitangaben enthält: Nach dem „@“-Symbol steht der Zeitpunkt, zu dem die Unit aktiv wurde, nach dem „+“-Symbol die Zeitspanne, die der Service selbst zum Starten benötigte. Diese Darstellung macht sofort deutlich, wo im Bootprozess die größten Verzögerungen auftreten und welche Dienste für Wartezeiten verantwortlich sind.

Critical Chain analysieren und Abhängigkeiten verstehen

Der wesentliche Unterschied zwischen „blame“ und „critical-chain“ liegt im Fokus der Bootzeiten Analyse. Während „blame“ alle Dienste nach ihrer absoluten Startdauer sortiert, konzentriert sich „critical-chain“ auf jene Abhängigkeitsketten, die tatsächlich sequenziell ablaufen müssen. Ein Dienst kann in der blame-Liste weit oben stehen, aber trotzdem irrelevant für die Gesamtbootzeit sein, wenn er parallel zu anderen zeitkritischen Prozessen läuft. Die kritische Kette hingegen zeigt nur die Units, bei denen eine Optimierung direkt die Bootzeiten verkürzt.

Grafische Darstellung des Boot-Prozesses nutzen

Für eine visuelle Analyse erstellt systemd-analyze mit dem Befehl „systemd-analyze plot > boot.svg“ eine Vektorgrafik des gesamten Startvorgangs. Diese SVG-Datei visualisiert jeden gestarteten Dienst als horizontalen Balken auf einer Zeitachse, wobei die Länge des Balkens der Initialisierungszeit entspricht. Die Grafik macht Parallelisierung und Engpässe auf einen Blick erkennbar und zeigt farblich hervorgehoben, welche Dienste auf der kritischen Kette liegen. Mit einem Browser oder Grafikprogramm lässt sich die Datei öffnen und beliebig zoomen, um Details einzelner Services zu untersuchen.

Eine weitere Visualisierungsmöglichkeit bietet der „dot“-Befehl, der die Abhängigkeiten zwischen Services als Graphen darstellt. Mit „systemd-analyze dot | dot -Tsvg > dependencies.svg“ entsteht ein Diagramm, das alle Unit-Beziehungen zeigt. Pfeile zwischen den Units verdeutlichen, welcher Service von welchem anderen abhängt. Diese Darstellung ist besonders hilfreich, wenn man verstehen möchte, warum bestimmte Dienste nicht früher starten können oder welche Abhängigkeiten möglicherweise überflüssig sind.

Services gezielt deaktivieren und maskieren

Nicht benötigte Dienste lassen sich mit systemctl entweder deaktivieren oder für den Bootvorgang maskieren. Der Befehl „systemctl disable servicename.service“ entfernt den symbolischen Link, der den automatischen Start beim Booten bewirkt. Der Service bleibt installiert und kann jederzeit manuell gestartet oder von anderen Diensten aktiviert werden. Diese Methode eignet sich für Services, die nur gelegentlich benötigt werden, aber nicht bei jedem Systemstart laufen müssen.

systemctl·disable vs. mask — was macht was?
disable
systemctl disable bluetooth
  • Kein Autostart beim Boot
  • Manuell startbar
  • Andere Units können ihn noch anfordern
  • Symlink aus wants/ entfernt
mask
systemctl mask snapd
  • Kein Start — auch nicht manuell
  • Andere Units können ihn nicht anfordern
  • !Drastisch — nur wenn sicher ungenutzt
  • Symlink auf /dev/null
rückgängig
systemctl enable bluetooth
systemctl unmask snapd
  • enable stellt Autostart wieder her
  • unmask entfernt den /dev/null-Link
  • Alles jederzeit reversibel
Faustregel: gelegentlich gebrauchtdisable  |  nie gebraucht, 100% sichermask

Das Maskieren mit „systemctl mask servicename.service“ geht einen Schritt weiter und verhindert jegliches Starten des Dienstes, selbst wenn andere Units ihn explizit anfordern. Beim Maskieren erstellt systemd einen symbolischen Link von der Unit-Datei nach /dev/null, was den Service faktisch unbrauchbar macht. Diese drastische Maßnahme sollte nur bei Services angewendet werden, die definitiv nicht benötigt werden. Beispiele für häufig deaktivierbare Dienste auf Desktop-Systemen sind Bluetooth-Services bei Rechnern ohne Bluetooth-Hardware oder Cloud-Sync-Dienste wie snapd bei Nutzern, die keine Snap-Pakete verwenden.

Praktische Optimierungsmaßnahmen umsetzen

Eine systematische Optimierung beginnt mit der Identifikation überflüssiger Dienste durch die bereits beschriebenen Analyse-Tools. Besonders vielversprechend ist die Umstellung von blocking Services auf Socket-Aktivierung. Hier startet der ein Dienst erst dann, wenn man tatsächlich eine Verbindung anfragt. Docker beispielsweise lässt sich so konfigurieren, dass docker.socket aktiv ist, docker.service aber erst bei Bedarf startet. Diese Strategie verkürzt die kritische Kette erheblich, weil der eigentliche Dienst nicht mehr im Bootprozess wartet.






root@linux
~ $
systemd-analyze optimize
Schritt-für-Schritt Optimierungs-Guide
🎯
Ziel: Bootzeit systematisch reduzieren — von der Analyse bis zur dauerhaften Optimierung. Jeden Schritt ausführen, Ergebnis messen, erst dann weiter.
01
Ist-Zustand messen
analyse
ℹ️
Vor jeder Änderung den aktuellen Wert notieren – nur so lässt sich der Fortschritt objektiv bewerten.
bash – Gesamtzeit abfragen
systemd-analyze time

Beispielausgabe
Startup finished in 1.243s (firmware) + 2.109s (loader)
          + 3.412s (kernel) + 18.7s (userspace) = 25.465s
graphical.target reached after 18.4s in userspace

💡
Kernel < 5 s und Firmware < 3 s sind normal. Stechen diese Werte heraus, liegt das Problem in der Hardware-Initialisierung oder BIOS-Einstellungen — nicht in systemd.
02
Zeitfresser identifizieren
blame
bash – Top-Kandidaten anzeigen
systemd-analyze blame | head -n 20

Typische Ausgabe
  9.814s  NetworkManager-wait-online.service
  7.203s  plymouth-quit-wait.service
  5.441s  apt-daily-upgrade.service
  3.892s  mariadb.service
  2.201s  snapd.service
  1.587s  dev-sda1.device

Service Ursache Maßnahme Wirkung
NetworkManager-wait-online Wartet auf aktive Netzwerkverbindung disable oder mask ● hoch
plymouth-quit-wait Bootscreen-Übergang Plymouth entfernen ● hoch
apt-daily-upgrade Unattended Upgrades beim Boot Timer auf Abends verlegen ● mittel
snapd Snap-Daemon (oft ungenutzt) mask + purge ● hoch
mariadb / postgresql Datenbank-Init dauert länger Socket-Aktivierung ● mittel
bluetooth Hardware oft nicht vorhanden mask ● gering
03
NetworkManager-wait-online deaktivieren
quick win
⚠️
Nur deaktivieren, wenn keine Dienste beim Boot zwingend eine aktive Netzwerkverbindung voraussetzen (z. B. NFS-Mounts, VPN-Start, Datenbank-Replikation).
bash
# Service deaktivieren (sicher, jederzeit reaktivierbar)
sudo systemctl disable NetworkManager-wait-online.service

# Alternativ: Maskieren verhindert auch indirekten Start
sudo systemctl mask NetworkManager-wait-online.service

# Status prüfen
systemctl status NetworkManager-wait-online.service


Dieses eine Kommando spart auf vielen Desktop-Systemen 8–12 Sekunden Bootzeit. Rückgängig: systemctl unmask && systemctl enable
04
Socket-Aktivierung für Docker & Dienste
fortgeschritten
ℹ️
Statt den Daemon beim Boot zu starten, aktiviert systemd ihn erst beim ersten eingehenden Request. Der Socket lauscht sofort — der eigentliche Dienst bleibt bis dahin inaktiv.
bash – Docker auf Socket-Aktivierung umstellen
# docker.service deaktivieren, docker.socket aktivieren
sudo systemctl disable docker.service
sudo systemctl enable  docker.socket
sudo systemctl start   docker.socket

# Prüfen: startet automatisch beim nächsten "docker ps"
systemctl is-active docker.socket   # → active
systemctl is-active docker.service  # → inactive

bash – Gleiches Prinzip für MariaDB
sudo systemctl disable mariadb.service
sudo systemctl enable  mariadb.socket

# Alle verfügbaren Socket-Units prüfen
ls /lib/systemd/system/*.socket

⚠️
Nicht alle Dienste bringen eine .socket-Unit mit. Vorher prüfen: ls /lib/systemd/system/*.socket
05
apt-daily-Timer auf den Abend verschieben
timer override
bash – Drop-in per systemctl edit öffnen
# Öffnet automatisch den Drop-in-Editor
# Das Original bleibt dabei vollständig unberührt
sudo systemctl edit apt-daily-upgrade.timer

Drop-in Inhalt → override.conf
[Timer]
OnCalendar=
OnCalendar=*-*-* 22:00:00
RandomizedDelaySec=30min
Persistent=true

bash – Änderung aktivieren & prüfen
sudo systemctl daemon-reload
sudo systemctl restart apt-daily-upgrade.timer

# Neuen Zeitplan kontrollieren
systemctl list-timers apt-daily-upgrade.timer


Das erste leere OnCalendar= löscht den Systemstandard — erst dann gilt der neue Wert. Drop-ins werden bei Paketupdates nicht überschrieben.
06
Journal-Größe begrenzen & Snapd entfernen
cleanup
bash – Journal-Limit setzen
# Limit in journald.conf eintragen
sudo sed -i 's/#SystemMaxUse=/SystemMaxUse=200M/' \
  /etc/systemd/journald.conf

sudo systemctl restart systemd-journald

# Altes Log sofort bereinigen
sudo journalctl --vacuum-size=200M

bash – Snapd vollständig entfernen (Ubuntu / Debian)
# Installierte Snaps auflisten
snap list

# Jeden Snap einzeln entfernen, z.B.:
sudo snap remove firefox

# Dienst stoppen, maskieren und Paket entfernen
sudo systemctl stop     snapd.service
sudo systemctl disable  snapd.service
sudo systemctl mask     snapd.service
sudo apt purge          snapd
sudo apt-mark hold      snapd  # verhindert Neuinstallation

🚨
Auf Ubuntu wird Firefox standardmäßig als Snap ausgeliefert. Vor dem Entfernen die native deb-Version über das Mozilla-PPA installieren — sonst kein Browser mehr.
07
Ergebnis messen & vergleichen
verify
bash – Neu starten und messen
# System neu starten
sudo reboot

# Gesamtzeit nach dem Boot abfragen
systemd-analyze time

# Critical Chain prüfen – zeigt verbleibende Engpässe
systemd-analyze critical-chain

# SVG für Vorher-Nachher-Vergleich erzeugen
systemd-analyze plot > boot_nach_optimierung.svg

🏁
Mit diesen Maßnahmen sind auf einem typischen Ubuntu-Desktop Einsparungen von 12–20 Sekunden realistisch. Server-Systeme profitieren besonders stark durch Socket-Aktivierung und den Wegfall von GUI-Diensten.

Faustregel: Erst messen → dann deaktivieren → wieder messen.  Niemals Dienste entfernen, deren Funktion unklar ist.

Nach jeder Optimierung sollte eine erneute Messung mit „systemd-analyze time“ erfolgen, um die Verbesserung zu quantifizieren. Weitere Potenziale liegen in der Bereinigung der Journal-Logs mit reduzierten Größenlimits in /etc/systemd/journald.conf oder der Deaktivierung von Plymouth auf Systemen, die ohnehin in unter zwei Sekunden starten. Für fortgeschrittene Optimierungen kann man Kernel-Parameter wie „quiet“ setzen oder initramfs-Hooks minimieren.

// Hinweis────────────────────────systemd-optimize.sh

Bei allen Maßnahmen gilt jedoch: Nie blind deaktivieren, sondern stets die Funktion eines Dienstes verstehen, bevor man ihn abschaltet. Einige dieser Dienste laufen normalerweise auch nach dem Bootprozess weiter, durch das Deaktivieren oder Verzögern dieser Dienste stehen auch Gamern weitere Optionen und Möglichkeiten zur Verfügung, um zum Beispiel beim Spielen mehr System-Leistung zu haben.
best practice · systemd administration

Fazit zur Optimierung der Bootzeiten mit systemd

Fazit zur Optimierung der Bootzeiten mit systemd Die Analyse und Optimierung von Bootzeiten mit systemd erfordert ein systematisches Vorgehen, wobei die mitgelieferten Werkzeuge diesen Prozess erheblich erleichtern. Die Befehle systemd-analyze time, blame, critical-chain und plot liefern unterschiedliche Perspektiven auf denselben Bootvorgang und ergänzen sich perfekt für eine umfassende Diagnose. Wer diese Tools kombiniert einsetzt, findet schnell die wirklichen Engpässe und optimiert gezielt, statt Services blind zu deaktivieren.

Die Parallelisierung von systemd macht die Analyse zwar komplexer als bei älteren Init-Systemen. Es ermöglicht aber auch deutlich größere Geschwindigkeitsgewinne, wenn Abhängigkeiten intelligent gestaltet werden. Mit etwas Geduld und den richtigen Analysemethoden sparen Anwender selbst bei bereits gut konfigurierten Systemen oft noch einige Sekunden ein, die im täglichen Betrieb einen merklichen Unterschied machen.