Kernel Initialisierung: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
=Schaubild=
=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.
{{#drawio:kernel-laden}}
{{#drawio:kernel-laden}}
=Kerneldatei in den Speicher laden=
=Kerneldatei in den Speicher laden=
*Nachdem der zu ladende Kernel ausgewählt und evtl. weitere Bootparameter eingegeben wurden, lädt das Ladeprogramm den Kernel in den Hauptspeicher.  
*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.
*Hier sind bei Linux grundsätzlich zwei Varianten zu unterscheiden.
*Zum einen kann der Kernel unkomprimiert vorliegen.
*Zum einen kann der Kernel unkomprimiert vorliegen.
*Der Einstiegspunkt für die Ausführung ist dann mit dem Beginn des Kernelcodes identisch.
*Der Einstiegspunkt für die Ausführung ist dann mit dem Beginn des Kernelcodes identisch.
*Zum anderen kann der Kernel komprimiert sein.  
*Zum anderen kann der Kernel komprimiert sein.
*In diesem Fall wurde dem Kernel beim Übersetzen ein kleines Programmstück vorangestellt
*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.
*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 unkomprimierte Kerneldatei erkennt man nach dem Übersetzen an ihrem Namen vmlinux.
*Eine komprimierte Kerneldatei heißt vmlinuz, zImage oder bzImage.
*Eine komprimierte Kerneldatei heißt vmlinuz, zImage oder bzImage.
*Diese Dateien können später freilich umbenannt werden.
*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.
*Gehen wir also nun davon aus, dass der Kernel geladen und der korrekte Einstiegspunkt gefunden wurde.
 
==Selbst nachschauen==
*ls -l /boot
<pre>
-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
</pre>
*file /boot/vmlinuz-$(uname -r)
<pre>
/boot/vmlinuz-6.12.95+deb13-amd64: Linux kernel x86 boot executable, bzImage, ... ZST compressed ...
</pre>
*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
<pre>
usr/lib/modules/6.12.95+deb13-amd64/kernel/fs/ext4/ext4.ko.xz
</pre>
*Rocky: lsinitrd


= Übergang vom Kernelspace zum Userspace =
= Übergang vom Kernelspace zum Userspace =
* Als vorletzte Aktion mountet der Kernel das Dateisystem, welches in der Kernelvariable ''root'' übergeben wurde, readonly.
*Das root-Dateisystem wird zunächst '''readonly''' gemountet (Bootparameter ro).
* Als letztes wird das Programm, das in der Kernelvariable als ''init'' steht ausgeführt.  
*So kann es beim Start noch geprüft werden.
* Dies ist der Prozess mit der Nummer EINS und dieser startet nun alle Userspace Programme.
*Später hängt systemd es laut /etc/fstab les- und schreibbar ein.
* [[Prozesse Eltern und Kinder]]
*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
<pre>
/usr/lib/systemd/systemd
</pre>
*ps -o pid,comm -p 1
<pre>
    PID COMMAND
      1 systemd
</pre>
*Wie lange welcher Abschnitt gedauert hat, zeigt systemd-analyze:
<pre>
Startup finished in 10.848s (firmware) + 6.990s (loader) + 4.092s (kernel) + 10.861s (userspace) = 32.792s
</pre>
*[[Prozesse Eltern und Kinder]]


=Bootparameter übergeben=
=Bootparameter übergeben=
*Der Linux-Kernel kann mit einer Vielzahl unterschiedlicher Parameter geladen werden
*Der Linux-Kernel kann mit einer Vielzahl unterschiedlicher Parameter geladen werden.
*Dies beieinflusst zumeist das Vorhandensein oder Nichtvorhandensein bestimmter Leistungseigenschaften
*Diese schalten meist bestimmte Funktionen ein oder aus.
*Dies ist insbesondere im Fehlerfall von Interesse:
*Dies ist insbesondere im Fehlerfall von Interesse.
*Kommt es etwa zu Problemen  beim Betrieb einer Festplatte im DMA-Modus
*Startet das System z.B. wegen eines Grafiktreibers nur mit schwarzem Bildschirm, hilft der Parameter nomodeset.
*So kann dem Kernel ein Parameter übergeben werden, der verhindert, dass die Festplatte im DMA-Modus angesteuert wird.  
*Bestünde diese Möglichkeit nicht, so wäre es u.U. gar nicht mehr möglich, das betreffende System hochzufahren.
*Bestünde diese Möglichkeit nicht, so wäre es u.U. garnicht mehr möglich, das betreffende System hochzufahren.
*Die Übergabe solcher Parameter ist auf zweierlei Weise möglich:
*Die Übergabe solcher Parameter wird von den meisten Ladeprogrammen auf zweierlei Weise ermöglicht.
*Zum einen können Standardparameter, die man bei jedem Systemstart übergeben möchte, in einer Konfigurationsdatei festgehalten werden.
*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.
*Zum Anderen kann man beim Systemstart die Parameter über eine Eingabezeile variieren.
 
==Aktuelle Parameter anzeigen==
*cat /proc/cmdline
<pre>
BOOT_IMAGE=/boot/vmlinuz-6.12.95+deb13-amd64 root=UUID=39e34c3f-a1b2-4f30-8c6e-13c067430a26 ro quiet
</pre>
 
==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
<pre>
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
</pre>
*Danach die GRUB-Konfiguration neu schreiben:
*update-grub
*Rocky: grubby --update-kernel=ALL --args="nomodeset"
 
==Wichtige Bootparameter==
{| class="wikitable"
! 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=
=Links=
*[https://help.ubuntu.com/community/BootOptions#Common%20Boot%20Options Liste wichtiger Bootoptionen (EN)]
*[https://help.ubuntu.com/community/BootOptions#Common%20Boot%20Options Liste wichtiger Bootoptionen (EN)]
*[https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html Alle Kernelparameter (EN)]

Aktuelle Version vom 17. Oktober 2026, 13:10 Uhr

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