Kernel Initialisierung

Aus Xinux Wiki
Version vom 17. Oktober 2026, 13:10 Uhr von Thomas.will (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Schaubild

  1. GRUB2 wird in den Speicher geladen.
  2. Anhand seiner Konfiguration (/boot/grub/grub.cfg) wählt GRUB2 den Kernel aus.
  3. Der Kernel wird in den Speicher geladen.
  4. Die Ramdisk (initramfs) wird in den Speicher geladen.
  5. Der Kernel initialisiert sich und startet /init aus der initramfs. Diese lädt die nötigen Module und mountet das root-Dateisystem.
  6. Danach wird systemd gestartet. (Der Übergang zum Userspace)
  7. systemd wird in den RAM geladen.
  8. systemd startet weitere Programme.
  9. Diese werden in den Speicher geladen.
kernel-laden

Kerneldatei in den Speicher laden

  • Nachdem der zu ladende Kernel ausgewählt und evtl. weitere Bootparameter eingegeben wurden, lädt der Bootloader den Kernel in den Hauptspeicher.
  • Hier sind bei Linux grundsätzlich zwei Varianten zu unterscheiden.
  • Zum einen kann der Kernel unkomprimiert vorliegen.
  • Der Einstiegspunkt für die Ausführung ist dann mit dem Beginn des Kernelcodes identisch.
  • Zum anderen kann der Kernel komprimiert sein.
  • In diesem Fall wurde dem Kernel beim Übersetzen ein kleines Programmstück vorangestellt.
  • Dies ist für das Entpacken des Kernels und das Finden des richtigen Einstiegspunktes zuständig.
  • Eine unkomprimierte Kerneldatei erkennt man nach dem Übersetzen an ihrem Namen vmlinux.
  • Eine komprimierte Kerneldatei heißt vmlinuz, zImage oder bzImage.
  • Auf PCs (x86) ist das heute immer ein bzImage, das die Distributionen als /boot/vmlinuz-<Version> ablegen.
  • Gehen wir also nun davon aus, dass der Kernel geladen und der korrekte Einstiegspunkt gefunden wurde.

Selbst nachschauen

  • ls -l /boot
-rw-r--r-- 1 root root 78117255 Okt 15 19:26 initrd.img-6.12.95+deb13-amd64
-rw-r--r-- 1 root root 12122048 Jul  4 20:24 vmlinuz-6.12.95+deb13-amd64
  • file /boot/vmlinuz-$(uname -r)
/boot/vmlinuz-6.12.95+deb13-amd64: Linux kernel x86 boot executable, bzImage, ... ZST compressed ...
  • Der Kernel ist hier mit zstd komprimiert.

Die initramfs

  • Der Kernel hat nicht alle Treiber fest eingebaut. Bei Debian ist z.B. sogar ext4 ein Modul.
  • Um die root-Partition zu lesen, braucht er aber den Treiber für den Plattencontroller und für das Dateisystem.
  • Diese Module liegen auf der root-Partition, an die er ohne sie nicht herankommt.
  • Die Lösung ist die initramfs (initial RAM filesystem), oft noch Ramdisk oder initrd genannt.
  • Sie ist ein kleines, gepacktes Dateisystem mit den nötigen Modulen und Werkzeugen.
  • GRUB2 lädt sie zusammen mit dem Kernel in den Speicher.
  • Der Kernel entpackt sie in den RAM und startet das Programm /init daraus.
  • /init lädt die Module, findet die root-Partition (z.B. über die UUID) und mountet sie.
  • Danach wechselt es mit switch_root bzw. run-init auf die echte root-Partition und startet dort /sbin/init.
  • Debian baut die initramfs mit update-initramfs, Rocky mit dracut.

Inhalt ansehen

  • lsinitramfs /boot/initrd.img-$(uname -r) | less
  • lsinitramfs /boot/initrd.img-$(uname -r) | grep ext4.ko
usr/lib/modules/6.12.95+deb13-amd64/kernel/fs/ext4/ext4.ko.xz
  • Rocky: lsinitrd

Übergang vom Kernelspace zum Userspace

  • Das root-Dateisystem wird zunächst readonly gemountet (Bootparameter ro).
  • So kann es beim Start noch geprüft werden.
  • Später hängt systemd es laut /etc/fstab les- und schreibbar ein.
  • Als letztes wird das Programm gestartet, das im Bootparameter init steht.
  • Ohne diesen Parameter ist das /sbin/init, heute ein Link auf systemd.
  • Dies ist der Prozess mit der Nummer EINS und dieser startet nun alle Userspace-Programme.
  • readlink -f /sbin/init
/usr/lib/systemd/systemd
  • ps -o pid,comm -p 1
    PID COMMAND
      1 systemd
  • Wie lange welcher Abschnitt gedauert hat, zeigt systemd-analyze:
Startup finished in 10.848s (firmware) + 6.990s (loader) + 4.092s (kernel) + 10.861s (userspace) = 32.792s

Bootparameter übergeben

  • Der Linux-Kernel kann mit einer Vielzahl unterschiedlicher Parameter geladen werden.
  • Diese schalten meist bestimmte Funktionen ein oder aus.
  • Dies ist insbesondere im Fehlerfall von Interesse.
  • Startet das System z.B. wegen eines Grafiktreibers nur mit schwarzem Bildschirm, hilft der Parameter nomodeset.
  • Bestünde diese Möglichkeit nicht, so wäre es u.U. gar nicht mehr möglich, das betreffende System hochzufahren.
  • Die Übergabe solcher Parameter ist auf zweierlei Weise möglich:
  • Zum einen können Standardparameter, die man bei jedem Systemstart übergeben möchte, in einer Konfigurationsdatei festgehalten werden.
  • Zum anderen kann man beim Systemstart die Parameter einmalig im GRUB-Menü ändern.

Aktuelle Parameter anzeigen

  • cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-6.12.95+deb13-amd64 root=UUID=39e34c3f-a1b2-4f30-8c6e-13c067430a26 ro quiet

Einmalig im GRUB-Menü

  • Im GRUB-Menü den Eintrag markieren und e drücken.
  • In der Zeile, die mit linux beginnt, den Parameter ans Ende anhängen.
  • Mit Strg+X oder F10 starten.
  • Die Änderung gilt nur für diesen einen Start.

Dauerhaft

  • Debian: in /etc/default/grub die Zeile GRUB_CMDLINE_LINUX_DEFAULT ändern
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
  • Danach die GRUB-Konfiguration neu schreiben:
  • update-grub
  • Rocky: grubby --update-kernel=ALL --args="nomodeset"

Wichtige Bootparameter

Parameter Wirkung
root=UUID=... welche Partition das root-Dateisystem ist
ro / rw root zuerst nur lesbar / gleich schreibbar mounten
quiet weniger Meldungen beim Start
nomodeset Grafiktreiber erst später laden, hilft bei schwarzem Bildschirm
systemd.unit=rescue.target Rettungsmodus, root-Passwort nötig
init=/bin/bash statt systemd direkt eine Shell starten (Notfall, root-Passwort vergessen)
modprobe.blacklist=modulname ein Modul für diesen Start nicht laden

Links