Hi Steffen,
On Mon, Apr 16, 2007 at 13:28:27 +0200, Steffen Kowalski wrote:
aber kann es sein, dass er das INIT der Initrd meint? Denn wenn es
Du meinst das bin /sbin/init? Ich denke darum geht es. Gibt's da noch etwas anderes - kernel intern?
Kernelintern gibt es da nichts, aber es gibt unterschiedliche Methoden, wie man eine initiale Ramdisk anfassen kann und von dort aus aufs eigentliche Rootfilesystem wechselt:
1 "Old style" initrd mit terminierendem linuxrc:
Die initiale Ramdisk ist ein gzip-komprimiertes ext2-Image. Darin erwartet der Kernel eine ausfuehrbare Datei /linuxrc. Der linuxrc-Prozess laeuft sozusagen als pre-init, laedt z.B. wichtige Kernelmodule und darf sich auch wieder beenden. Danach mountet der Kernel selbst das eigentliche Rootfilesystem, was ihm vom Bootloader ueber root=... mitgeteilt wurde und startet dort /sbin/init mit PID 1. Alternativ kann linuxrc das Rootfilesystem finden und ueber /proc/sys/kernel/real-root-dev dem Kernel mitteilen, was er spaeter zu mounten hat. Nach dem Booten steht die initiale Ramdisk optional als normale Ramdisk, gemountet auf /initrd zur Verfuegung.
2 "Old style" initrd mit linuxrc als init:
Die initiale Ramdisk ist ein gzip-komprimiertes ext2-Image. Per Bootloader bekommt der Kernel die Argumente root=/dev/ram0 init=/linuxrc. In diesem Fall behandelt der Kernel die Ramdisk bereits als echtes Rootfilesystem und /linuxrc als echtes init, das sich nicht beenden darf. Hier hat linuxrc die Aufgabe, das spaetere Rootfilesystem selbst zu mounten, den Wechsel darauf selbst vorzunehmen und sich abschliessend -- unter Beibehaltung der PID 1 -- mit dem dortigen /sbin/init zu ueberlagern (exec). Je nach Art des Rootfilesystemwechsels kann wie im Fall 1 die initiale Ramdisk nach dem Booten als Ramdisk weiterbenutzt werden.
3 Initramfs (als Teil vom "early userspace"):
Die initiale Ramdisk ist ein gzip-komprimiertes cpio-Archiv. Darin erwartet der Kernel eine ausfuehrbare Datei /init (nicht /sbin/init). Diese wird wie im Fall 2 als echtes init angesehen und hat die gleichen Aufgaben wie linuxrc im Fall 2. Waehrend des Rootfilesystemwechsels sollte der ramfs-Inhalt komplett geloescht werden, damit der zugehoerige Speicher freigegeben wird[1]. Im Gegensatz zu "normalen" /dev/ram*-Ramdisks belegt ein ramfs immer nur soviel Speicher, wie Dateien im ramfs liegen.
Ich glaube meine Linuxkenntnisse sind zu schlecht. Was genau startet der kernel eigentlich zuerst, init oder eine shell?
Er startet init. Wenn er eine Shell anstelle von /sbin/init starten soll, gibt man per Bootloader etwa init=/bin/bash an. Ohne entsprechende Sonderbehandlung in /linuxrc (Fall 2) bzw. /init (Fall 3) funktioniert "init=/bin/bash" also nur im Fall 1 oder ganz ohne initiale Ramdisk.
[1] Siehe Applet "switch_root" im Source von busybox.
Gruss, Chris