|
|
LinuxNetMag #4
 Druckversion
|
|
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
-
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.
-
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.
-
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).
-
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)
-
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.
-
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-Devixe)
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!
-
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.
-
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 ...
-
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.
-
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.
-
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.
Ersteinmal die Konkurrenz:
Windows kennt 8 Runlevels, die allerdings weitgehend
festgelegt sind und nicht einstellbar:
- Normaler Bootvorgang
- Protokolliert (BOOTLOG.TXT)
- Abgesicherter Modus
- ...
- Alte MS-DOS Version
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
Platz für Kommentare & Fragen:
(selbst eintragen)
|