Linux NetMag #4
Titel: Der Bootprozeß
URL: http://www.linuxnetmag.de/de/issue4/m4boot1.html

Info Was passiert eigentlich alles beim Booten?
DOS kennt nur `CONFIG.SYS' und `AUTOEXEC.BAT', bei Linux läuft das alles etwas vielseitiger ab.


Autor: Jens Benecke

Das Grundgerüst
  1. Natürlich wird zuerst das BIOS angezeigt, aber auch dies kann man ändern.
    Statt des Energy Stars kann auch das hübsche Pinguin-Logo angezeigt werden.
    Nähere Hinweise, wie man das BIOS-Logo austauscht, findet man hier.
  2. Der Kernel wird irgendwie in den Speicher gekloppt und ausgeführt. Das kann von einem beliebigen Programm geschehen, wie z.B. LOADLIN, welches einfach eine Datei nimmt (die idealerweise den Kernel enthält), und diese in den Speicher schreibt (und damit DOS überschreibt).
    Eine zweite Möglichkeit ist LILO, der Linux Loader, der einfach bei der Konfiguration nachguckt, auf welchen physikalischen Sektoren der Kernel auf der Festplatte liegt (als Datei), diese mit sich selbst in den MBR (Master Boot Record = Bootsektor) schreibt, und beim Booten dann genau diese Sektoren ausliest, ins RAM schreibt und ausführt.
  3. Der Kernel ist prinzipiell für die Erkennung und Einbindung der gesamten Hardware zuständig, diese Meldungen kann man beim Booten beobachten. Will man etwas länger lesen, so ist die Taste PAUSE, ScrollLock bzw. Rollen ganz nützlich. Natürlich funktioniert hier auch der scrollback-Buffer schon (Shift+PgUp bzw. Shift+PgDn).
  4. Die letzte Aufgabe des Kernels ist es, die Partition, die ihm via LILO- oder via LOADLIN-Parameter als root-Partition vorgegeben wurde, anzumelden (zu mounten) und den ersten Prozeß zu starten, der normalerweise INIT heißt (das Programm befindet sich unter /sbin/init).
    Jetzt ist der Kernel prinzipiell mit Laden fertig und die gesamte Hardware, die er eingebunden hat, steht zur Verfügung.
    Die Meldungen, die Kernel und Programm trennen, lauten folgendermaßen:
       VFS: mounted root (ext2fs) filesystem readonly.  (Noch Kernel)
       INIT: Version X.XX booting  (schon INIT)                    
    
  5. INIT guckt sich jetzt verschiedene Sachen an. Zuallererst wird die Datei /etc/inittab geladen, wo INIT unter anderem erfährt, welcher Runlevel zu starten ist. (id:X:initdefault: , wobei `X' der Runlevel ist.) Danach guckt INIT, welches Programm als nächstes starten soll, denn bisher ist weder ein Serverdienst gestartet wordem, noch eine Shell, noch das Netzwerk, und auch noch nicht einmal andere Partitionen sind gemountet. (dies steht in der Zeile si:I:wait:PROGRAMM).
    Meist ist PROGRAMM gleich /etc/rc.d/init.boot, oder /sbin/init.d/boot, und dies wird jetzt ausgeführt.
  6. Das BOOT-Skript macht normalerweise (denn ab hier ist alles konfigurierbar und läßt sich nach belieben an eigene Wünsche anpassen) folgendes:
    • Swap einschalten
    • root-Partition checken und read/write erneut mounten
    • andere Partitionen prüfen und mounten,
      und wenn eine Partition beschädigt ist, halt alles anhalten und nur noch root reinlassen
    • den Module-Manager starten (der für das automatische Laden von Modulen zuständig ist)
    • falls erwünscht, Grundlegende Netzwerkprogramme starten (z.B. loopback-Device)
    Wohlgemerkt: Jedes System kann hiervon geringfügig abweichen.
    Meist gibts in dem gleichen Verzeichnis auch eine Datei boot.local, die von boot zum Schluß ausgeführt wird und in die noch eigenen Befehle geschrieben werden können. Ansonsten ist es auch möglich, diese Befehle ins boot-Skript direkt anhängen -- aber vorsicht, hier sollte man nichts einfach ändern, wenn man nicht genau weiß, was man tut!
  7. INIT guckt jetzt, welcher Runlevel festgelegt wurde (in der /etc/inittab), und je nach Runlevel werden jetzt die Skripte gestartet: (/etc/inittab: lN:N:wait:SCRIPT, wobei N=Runlevel), die bei den meisten Systemen einfach alles starten, was in /etc/init.d/rcN.d/ oder ähnlich liegt (N=Runlevel).
    Hier werden also die ganzen Services, Deamons und Dienste gestartet, die dann später im Hintergrund laufen. Gleichzeitig wird für diese Prozesse etwas Buch geführt, z.B. Lock-Dateien angelegt, oder ähnliches.
  8. Wenn das fertig ist, startet INIT für alle Terminals, die ihm genannt wurden, ein getty, das ist ein Programm, was die Kontrolle über dieses Terminal bekommt und normalerweise erstmal /bin/login startet.
    Dies wird ebenfalls in der /etc/inittab festgelegt.
    "respawn" heißt hier, daß das Programm, sobald es sich beendet, sofort erneut gestartet wird, denn ansonsten könnte man sich auf jedem Terminal nur einmal einloggen ...
  9. Falls man ein grafisches Login eingestellt hat (bei der SuSE ist das Runlevel 3, bei RedHat Runlevel 5), wird auch gleich noch der `xdm' bzw. `kdm' gestartet und man bekommt ein grafisches Login-Fenster.
    Dies funktioniert übrigens auch, wie so manches, übers Netzwerk: So liefert beispielsweise ein startx --query anderer_rechner:0 ein Login-Fenster von einem anderen Rechner aus dem Netzwerk.
  10. Wenn man sich angemeldet hat, wird normalerweise das Script /etc/profile (für alle Benutzer identisch) und danach die Dateien ~/.profile, ~/.login und für die bash-Shell auch ~/.bashrc, ~/.bash_login und ~/.bash_profile --falls vorhanden-- ausgewertet bzw. ausgeführt. Diese Datei entspräche am ehesten einer AUTOEXEC.BAT unter DOS.
  11. Nach dem Login wird die Shell gestartet und man kann das System benutzen.
Das schöne an diesem Bootvorgang ist, daß sich der Systemstart-Vorgang auf alle möglichen Gegebenheiten anpassen läßt.

Definition Runlevel

Ersteinmal die Konkurrenz:
Windows kennt 8 Runlevels, die allerdings weitgehend festgelegt sind und nicht einstellbar:

Spätestens jetzt sollte jeder wissen, was mit dem Begriff Runlevel gemeint ist.

Linux hingegen kennt (zumindest theoretisch) beliebig viele, momentan implementationsbedingt auf folgende beschränkt:

0:
System halt. Alles wird runtergefahren, Kernel wird angehalten, Rechner wird ausgeschaltet (falls Du ein ATX Mainboard hast, dies eingestellt hast, und das BIOS es auch hinbekommt).
6:
System reboot. Alles wird runtergefahren, System neu gestaretet.
S:
Single User Mode. Ein Terminal, nur root darf rein, kein Netz.
1:
Multiuser ohne Netzwerk. (meistens...)

Ab hier ist alles distributionsspezifisch - siehe /etc/inittab

2:
Multiuser mit Netzwerk.
3:
Multiuser mit Netzwerk und grafischem Login.
4:
Benutzerdefiniert.
5:
Benutzerdefiniert (Redhat: Wie Runlevel 3.)
Was nun pro Runlevel gestartet/gestoppt wird, bestimmen die Skripte, die in /etc/rcN.d bzw. /sbin/init.d/rcN.d (wobei N=Runlevel) liegen.

Weitere Informationen findet man mittels

>> man 8 init. 


Dieser Text ist ein Auszug aus der Linux USER FAQ, und wurde uns freundlicherweise zur Verfügung gestellt von Jens Benecke, der Mitautor dieser FAQ ist.

Links
   Homepage des Autors (Jens Benecke): http://www.pinguin.conetix.de
   Linux USER FAQ (Deutsche Version): http://www.pinguin.conetix.de/linux-faq/index.html