Kernel Initialisierung
Zur Navigation springen
Zur Suche springen
Schaubild
- GRUB2 wird in den Speicher geladen.
- Anhand seiner Konfiguration (/boot/grub/grub.cfg) wählt GRUB2 den Kernel aus.
- Der Kernel wird in den Speicher geladen.
- Die Ramdisk (initramfs) wird in den Speicher geladen.
- Der Kernel initialisiert sich und startet /init aus der initramfs. Diese lädt die nötigen Module und mountet das root-Dateisystem.
- Danach wird systemd gestartet. (Der Übergang zum Userspace)
- systemd wird in den RAM geladen.
- systemd startet weitere Programme.
- Diese werden in den Speicher geladen.
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 |
