Kernel Initialisierung: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Keine Bearbeitungszusammenfassung |
|||
| Zeile 1: | Zeile 1: | ||
=Schaubild= | =Schaubild= | ||
# | #GRUB2 wird in den Speicher geladen. | ||
#Anhand Konfiguration | #Anhand seiner Konfiguration (/boot/grub/grub.cfg) wählt GRUB2 den Kernel aus. | ||
#Der Kernel in den Speicher geladen. | #Der Kernel wird in den Speicher geladen. | ||
#Die Ramdisk 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 | #systemd wird in den RAM geladen. | ||
# | #systemd startet weitere Programme. | ||
#Diese werden in den Speicher geladen. | #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 | *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. | ||
* | *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 | *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 = | ||
* | *Das root-Dateisystem wird zunächst '''readonly''' gemountet (Bootparameter ro). | ||
* Als letztes wird das Programm, das | *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. | ||
* | *Diese schalten meist bestimmte Funktionen ein oder aus. | ||
*Dies ist insbesondere im Fehlerfall von Interesse | *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. | |||
*Bestünde diese Möglichkeit nicht, so wäre es u.U. | *Die Übergabe solcher Parameter ist auf zweierlei Weise möglich: | ||
*Die Übergabe solcher Parameter | *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 | |||
==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
- 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 |
