Modul 1: System-Fundament & Architektur
Systemstart & Init-System
Der Boot-Prozess von GRUB über den Kernel bis hin zu systemd
Einführung
Der Moment zwischen dem Drücken des Einschaltknopfes am Server und dem Erscheinen des Login-Prompts wirkt auf viele Einsteiger wie schwarze Magie. Zeilenweise rauscht kryptischer Text über den Bildschirm, bis das System schließlich betriebsbereit ist. Solange alles funktioniert, ignorieren wir diesen Prozess gerne. Doch wenn der Server nach einem Update plötzlich nicht mehr hochfährt, entscheidet das Wissen über den Boot-Vorgang darüber, ob du den Fehler in wenigen Minuten behebst oder das System verzweifelt neu aufsetzt.
In diesem Beitrag zerlegen wir den Linux-Systemstart in seine logischen Phasen: Vom Bootloader GRUB über den Linux-Kernel bis hin zum mächtigen Init-System systemd, das heute das Herzschlag-Zentrum fast jeder modernen Distribution ist.
Phase 1: UEFI und der Bootloader (GRUB 2)
Sobald der Server Strom bekommt, erwacht die Hardware-Firmware (heute meist UEFI, früher BIOS). Sie initialisiert grundlegende Komponenten wie den Arbeitsspeicher und sucht auf den Festplatten nach einer speziellen, kleinen Partition: der EFI System Partition (ESP). Dort findet sie den Bootloader.
Unter Ubuntu (und fast allen anderen Linux-Distributionen) kommt hier GRUB 2 (GRand Unified Bootloader) zum Einsatz. GRUB hat eine einzige, aber essenzielle Aufgabe: Er lädt den eigentlichen Linux-Kernel in den Arbeitsspeicher und übergibt ihm die Kontrolle.
GRUB konfigurieren
Die Konfiguration von GRUB nimmst du niemals direkt in der komplexen Datei /boot/grub/grub.cfg vor. Stattdessen bearbeitest du die übersichtliche Textdatei /etc/default/grub.
# Die GRUB-Konfiguration mit einem Editor öffnen
sudo nano /etc/default/grub
Zwei Variablen sind hier für den Alltag besonders wichtig:
GRUB_TIMEOUT=5: Bestimmt, wie viele Sekunden das GRUB-Menü (zur Auswahl älterer Kernel) beim Start angezeigt wird. Ein Wert von0bootet sofort.GRUB_CMDLINE_LINUX_DEFAULT="": Hier kannst du dem Kernel Parameter mitgeben (z. B.nomodeset, falls die Grafikkarte beim Booten Probleme macht, oderquiet splashfür einen Boot-Vorgang ohne viel Textausgabe).
# Nach JEDER Änderung an der Konfiguration zwingend ausführen!
sudo update-grub
Phase 2: Der Kernel und die Initramfs
GRUB hat den Linux-Kernel (die Datei heißt meist vmlinuz-...) geladen. Der Kernel ist das absolute Kernstück des Betriebssystems. Er kontrolliert die CPU, den Arbeitsspeicher und die Hardware.
Hier gibt es jedoch ein klassisches Henne-Ei-Problem: Der Kernel muss das root-Dateisystem (/) der Festplatte einhängen (mounten), um Programme zu starten. Doch was ist, wenn der Treiber, um genau diese Festplatte (z. B. einen NVMe-RAID-Controller oder ein LVM-Volume) überhaupt lesen zu können, auf eben dieser Festplatte liegt?
Die Lösung heißt Initramfs (Initial RAM Filesystem). GRUB lädt nicht nur den Kernel, sondern auch ein kleines, komprimiertes Archiv in den RAM. Dieses Archiv enthält alle überlebenswichtigen Treiber. Der Kernel entpackt dieses Archiv, lädt die Treiber, bindet die echte Festplatte ein und wirft die Initramfs danach wieder aus dem Speicher.
Phase 3: systemd übernimmt das Steuer
Sobald die echte Festplatte erreichbar ist, startet der Kernel den allerersten Prozess des Systems. Dieser Prozess bekommt immer die Prozess-ID 1 (PID 1). Früher war das SysVinit, heute ist es fast überall systemd.
Ab diesem Moment orchestriert systemd den restlichen Start: Es konfiguriert das Netzwerk, hängt weitere Festplatten ein, startet den SSH-Server, den Webserver und eventuelle Datenbanken. Und das macht es extrem schnell, da es Dienste, die nicht voneinander abhängen, massiv parallel startet.
Units und Targets verstehen
Alles, was systemd verwaltet, wird als "Unit" bezeichnet. Es gibt verschiedene Typen, die wichtigsten sind:
| Unit-Typ | Endung | Funktion |
|---|---|---|
| Service | .service |
Ein klassisches Hintergrundprogramm (Daemon), z. B. nginx.service oder ssh.service. |
| Target | .target |
Eine Gruppe von Units. Vergleichbar mit den alten "Runlevels". Das multi-user.target entspricht z. B. dem Zustand "Server läuft voll, ohne grafische Oberfläche". |
| Timer | .timer |
Der moderne Ersatz für Cronjobs. Startet andere Units zu festgelegten Zeiten. |
Dienste verwalten mit systemctl
Als Administrator wirst du ständig mit dem Werkzeug systemctl arbeiten, um deine Dienste zu steuern:
# Den Status eines Dienstes abfragen (läuft er? gab es Fehler?)
sudo systemctl status nginx
# Einen Dienst manuell starten oder stoppen
sudo systemctl start nginx
sudo systemctl stop nginx
# Den Autostart für den nächsten System-Reboot aktivieren
sudo systemctl enable nginx
# Den Autostart wieder deaktivieren
sudo systemctl disable nginx
Verwechsle
startundenablenicht!startstartet das Programm genau jetzt.enablesorgt lediglich dafür, dass es beim nächsten Server-Neustart automatisch hochfährt.
Troubleshooting: Fehler beim Booten finden
Wenn ein Dienst beim Booten fehlschlägt, sammelt die Komponente systemd-journald alle Log-Einträge zentral ein. Mit dem Befehl journalctl kannst du diese Daten präzise durchsuchen.
# Zeigt alle Logs des aktuellen Boot-Vorgangs an
journalctl -b
# Filtert den aktuellen Boot-Vorgang nach Fehlern (Priority "err")
journalctl -b -p err
# Zeigt nur die Logs eines bestimmten Dienstes an
journalctl -u nginx.service
Der Linux-Boot-Prozess ist logisch und streng hierarchisch aufgebaut: Die Firmware ruft den Bootloader (GRUB) auf, dieser lädt den Kernel samt Basis-Treibern (Initramfs) in den RAM. Der Kernel wiederum reicht das Zepter an systemd weiter, welches alle Dienste orchestriert und den Server betriebsbereit macht. Wer dieses Prinzip verstanden hat, weiß bei Startproblemen genau, an welcher Stelle er mit der Fehlersuche ansetzen muss.
Ausblick: Damit schließen wir das erste Modul ab. Im nächsten Beitrag starten wir mit Modul 2 und navigieren tief durch das Linux-Dateisystem. Wir schauen uns den "Filesystem Hierarchy Standard" (FHS) an und klären ein für alle Mal, was eigentlich der Unterschied zwischen /bin, /opt und /var ist.