Hans-Christian Ebke Übersetzt von FreeBSDs Bootvorgang Übersicht booten Bootstrap Das Starten des Computers und das Laden des Betriebssystems wird im Allgemeinen als Bootstrap Vorgang bezeichnet, oder einfach als Booten. FreeBSDs Bootvorgang ermöglicht große Flexibilität, was das Anpassen dessen anbelangt, was passiert, wenn das System gestartet wird. Es kann zwischen verschiedenen Betriebssystemen, die auf demselben Computer installiert sind oder verschiedenen Versionen desselben Betriebssystems oder installierten Kernels gewählt werden. Dieses Kapitel zeigt die zur Verfügung stehenden Konfigurationsmöglichkeiten und wie man den Bootvorgang anpasst. Dies schließt alles ein, bis der Kernel gestartet worden ist, der dann alle Geräte gefunden hat und &man.init.8; gestartet hat. Falls Sie sich nicht ganz sicher sind, wann dies passiert: Es passiert, wenn die Farbe des Textes während des Bootvorgangs von weiß zu Hellgrau wechselt. Dieses Kapitel informiert über folgende Punkte: Die Komponenten des FreeBSD Bootstraps und deren Interaktion. Die Optionen, mit denen Sie den FreeBSD Bootvorgang steuern können. Wie Geräte mit &man.device.hints.5; konfiguriert werden. nur x86 Dieses Kapitel erklärt den Bootvorgang von FreeBSD auf Intel X86 Plattformen. Das Problem des Bootens Wenn der Computer eingeschaltet wird und das Betriebssystem gestartet werden soll, entsteht ein interessantes Dilemma, denn der Computer weiß per Definition nicht, wie er irgendetwas tut, bis das Betriebssystem gestartet wurde. Das schließt das Starten von Programmen, die sich auf der Festplatte befinden, ein. Wenn nun der Computer kein Programm von der Festplatte starten kann, sich das Betriebssystem aber dummerweise genau dort befindet, wie wird es dann gestartet? Dieses Problem ähnelt einer Geschichte des Barons von Münchhausen. Dort war eine Person in einen Sumpf gefallen und hat sich selbst an den Riemen seiner Stiefel (engl. bootstrap) herausgezogen. In den jungen Jahren des Computerzeitalters wurde mit dem Begriff Bootstrap dann die Technik das Betriebssystem zu laden bezeichnet und wurde hinterher mit booten abgekürzt. Auf x86 Plattformen ist das BIOS (Basic Input/Output System) dafür verantwortlich, das Betriebssystem zu laden. Dazu liest das BIOS den Master Bootsektor (MBR; Master Boot Record) aus, der sich an einer bestimmten Stelle auf der Festplatte/Diskette befinden muss. Das BIOS kann den MBR selbstständig laden und ausführen und geht davon aus, dass der die restlichen Dinge, die für das Laden des Betriebssystems notwendig sind, selber erledigen kann. BIOS Basic Input/Output System Falls nur ein Betriebssystem installiert ist, ist der Standard MBR ausreichend. Dieser MBR sucht nach dem ersten bootbaren Slice auf dem Laufwerk und führt ihn aus, um das restliche Betriebssystem zu laden. Falls mehrere Betriebssysteme installiert sind, sollte man einen anderen MBR installieren, der eine Liste der verfügbaren Betriebssysteme anzeigt und einen wählen lässt, welches man booten möchte. FreeBSD liegt ein solcher MBR bei und andere Hersteller bieten Alternativen an. Das restliche FreeBSD Bootstrap System ist in drei Phasen unterteilt. Die erste Phase wird vom MBR durchgeführt, der gerade genug Funktionalität besitzt um den Computer in einen bestimmten Status zu verhelfen und die zweite Phase zu starten. Die zweite Phase führt ein wenig mehr Operationen durch und startet schließlich die dritte Phase, die das Laden des Betriebssystems abschließt. Der ganze Prozess wird in drei Phasen durchgeführt, weil der PC Standard die Größe der Programme, die in Phase eins und zwei ausgeführt werden, limitiert. Durch das Verketten der durchzuführenden Aufgaben wird es FreeBSD möglich, ein sehr flexibles Ladeprogramm zu besitzen. Kernel init Als nächstes wird der Kernel gestartet, der zunächst nach Geräten sucht und sie für den Gebrauch initialisiert. Nach dem Booten des Kernels übergibt dieser die Kontrolle an den Benutzer Prozess &man.init.8;, der erst sicherstellt, dass alle Laufwerke benutzbar sind und die Ressourcen Konfiguration auf Benutzer Ebene startet. Diese wiederum mountet Dateisysteme, macht die Netzwerkkarten für die Kommunikation mit dem Netzwerk bereit und startet generell alle Prozesse, die auf einem FreeBSD System normalerweise beim Hochfahren gestartet werden. Der MBR, und die Boot-Phasen Eins, Zwei und Drei Der MBR, <filename>/boot/boot0</filename> Master Boot Record (MBR) Eine Kopie des Master Boot Records (MBR) von FreeBSD befindet sich in /boot/boot0. Der richtige MBR wird in einem nicht benutzbaren Teil des Laufwerks gespeichert. boot0 ist ein ziemlich simples Programm, und zwar aus dem einfachen Grund, dass der MBR nur 512 Bytes groß sein darf. Falls Sie den FreeBSD MBR installiert haben und sich mehrere Betriebssysteme auf Ihrer Festplatte befinden, werden Sie beim Starten des Computers eine Anzeige sehen, ähnlich der Folgenden: <filename>boot0</filename> Screenshot F1 DOS F2 FreeBSD F3 Linux F4 ?? F5 Drive 1 Default: F2 Diverse Betriebssysteme, insbesondere &windows; 95 und Nachfolger, überschreiben den MBR ungefragt mit ihrem eigenen. Falls einem dies passiert sein sollte, kann man mit folgendem Kommando den momentanen MBR durch den FreeBSD MBR ersetzen: &prompt.root; fdisk -B -b /boot/boot0 Gerät Wobei Gerät das Gerät ist, von dem gebootet wird, also z.B. ad0 für die erste IDE Festplatte, ad2 für die erste IDE Festplatte am zweiten IDE Controller, da0 für die erste SCSI Festplatte, usw. Wenn Sie auf demselben Rechner FreeBSD und Linux benutzen möchten, können Sie den FreeBSD Boot-Manager oder LILO benutzen. Wollen Sie den MBR von LILO benutzen, wählen Sie bei der FreeBSD Installation im Boot Manager Menü aus. Damit Sie das FreeBSD System aus LILO booten können, tragen Sie in /etc/lilo.conf die folgenden Zeilen Zeilen ein: other=/dev/diskXY table=/dev/diskX loader=/boot/chain.b label=FreeBSD Ersetzen Sie dabei diskXY mit hdXY, wenn Sie ein IDE-Laufwerk benutzen, oder mit sdXY, wenn Sie ein SCSI-Laufwerk benutzen. Mit XY geben Sie die Slice des FreeBSD Systems, zum Beispiel /dev/hdb1, an. Wenn sich beide Betriebssysteme auf derselben Platte befinden, können Sie auch weglassen. Mit geben Sie das Gerät an, auf dem die Partitionstabelle liegt, /dev/hdb bezeichnet zum Beispiel das zweite IDE-Laufwerk. Die Änderungen können Sie nun mit /sbin/lilo -v aktivieren. Achten Sie dabei auf die Bildschirmausgabe, die den Erfolg der Operation anzeigt. Phase Eins, <filename>/boot/boot1</filename> und Phase Zwei, <filename>/boot/boot2</filename> Im Prinzip sind die erste und die zweite Phase Teile desselben Programms, im selben Bereich auf der Festplatte. Aufgrund von Speicherplatz-Beschränkungen wurden sie aufgeteilt, aber man installiert sie eigentlich generell zusammen. Sie befinden sich beide im Bootsektor des Boot-Slices, wo boot0 und jedes andere Programm im MBR das Programm erwartet, das den weiteren Bootvorgang durchführt. Die Dateien im Verzeichnis /boot sind nur Kopien der eigentlichen Dateien, die sich außerhalb FreeBSDs Dateisystems befinden. boot1 ist ebenfalls ein sehr simples Programm, da es auch nur 512 Bytes groß sein darf, und es besitzt gerade genug Funktionalität um FreeBSDs disklabel, das Informationen über den Slice enthält, auszulesen um boot2 zu finden und auszuführen. boot2 ist schon ein wenig umfangreicher und besitzt genügend Funktionalität um Dateien in FreeBSDs Dateisystem zu finden. Außerdem hat es eine einfache Schnittstelle, die es ermöglicht, den zu ladenden Kernel oder Loader auszuwählen. Da der Loader einen weitaus größeren Funktionsumfang hat und eine schöne und einfach zu bedienende Boot-Konfigurations-Schnittstelle zur Verfügung stellt, wird er gewöhnlich von boot2 anstatt des Kernels gestartet. Früher war es jedoch dazu da den Kernel direkt zu starten. <filename>boot2</filename> Screenshot >> FreeBSD/i386 BOOT Default: 0:ad(0,a)/kernel boot: Um das installierte boot1 und boot2 zu ersetzen, benutzt man &man.disklabel.8;: &prompt.root; disklabel -B Slice Wobei Slice das Laufwerk und die Slice darstellt, von dem gebootet wird, beispielsweise ad0s1 für die erste Slice auf der ersten IDE Festplatte. Dangerously Dedicated Mode Wenn man nur den Festplatten-Namen, also z.B. ad0, in &man.disklabel.8; benutzt wird eine "dangerously dedicated disk" erstellt, ohne Slices. Das ist ein Zustand, den man meistens nicht hervorrufen möchte. Aus diesem Grund sollte man ein &man.disklabel.8; Kommando noch einmal prüfen, bevor man Return betätigt. Phase drei, <filename>/boot/loader</filename> boot-loader Der boot-loader ist der letzte von drei Schritten im Bootstrap Prozess und kann im Dateisystem normalerweise unter /boot/loader gefunden werden. Der Loader soll eine benutzerfreundliche Konfigurations-Schnittstelle sein mit einem einfach zu bedienenden eingebauten Befehlssatz, ergänzt durch einen umfangreichen Interpreter mit einem komplexeren Befehlssatz. Loader Ablauf Der Loader sucht während seiner Initialisierung nach Konsolen und Laufwerken, findet heraus, von welchem Laufwerk er gerade bootet und setzt dementsprechend bestimmte Variablen. Dann wird ein Interpreter gestartet, der Befehle interaktiv oder von einem Skript empfangen kann. loader loader Konfiguration Danach liest der Loader die Datei /boot/loader.rc aus, welche ihn standardmäßig anweist /boot/defaults/loader.conf zu lesen, wo sinnvolle Standardeinstellungen für diverse Variablen festgelegt werden und wiederum /boot/loader.conf für lokale Änderungen an diesen Variablen ausgelesen wird. Anschließend arbeitet dann loader.rc entsprechend dieser Variablen und lädt die ausgewählten Module und den gewünschten Kernel. In der Voreinstellung wartet der Loader 10 Sekunden lang auf eine Tastatureingabe und bootet den Kernel, falls keine Taste betätigt wurde. Falls doch eine Taste betätigt wurde wird dem Benutzer eine Eingabeaufforderung angezeigt. Sie nimmt einen einfach zu bedienenden Befehlssatz entgegen, der es dem Benutzer erlaubt, Änderungen an Variablen vorzunehmen, Module zu laden, alle Module zu entladen oder schließlich zu booten bzw. neu zu booten. Die eingebauten Befehle des Loaders Hier werden nur die gebräuchlichsten Befehle bearbeitet. Für eine erschöpfende Diskussion aller verfügbaren Befehle konsultieren Sie bitte &man.loader.8;. autoboot Sekunden Es wird mit dem Booten des Kernels fortgefahren, falls keine Taste in der gegebenen Zeitspanne betätigt wurde. In der gegebenen Zeitspanne, Vorgabe sind 10 Sekunden, wird ein Countdown angezeigt. boot -options Kernelname Bewirkt das sofortige Booten des Kernels mit den gegebenen Optionen, falls welche angegeben wurden, und mit den angegebenen Kernel, falls denn einer angegeben wurde. boot-conf Bewirkt die automatische Konfiguration der Module, abhängig von den entsprechenden Variablen. Dieser Vorgang ist identisch zu dem Vorgang, den der Bootloader ausführt und daher nur sinnvoll, wenn zuvor unload benutzt wurde und Variablen (gewöhnlich kernel) verändert wurden. help Thema Zeigt die Hilfe an, die zuvor aus der Datei /boot/loader.help gelesen wird. Falls index als Thema angegeben wird, wird die Liste der zur Verfügung stehenden Hilfe-Themen angezeigt. include Dateiname Verarbeitet die angegebene Datei. Das Einlesen und Interpretieren geschieht Zeile für Zeile und wird im Falle eines Fehlers umgehend unterbrochen. load Typ Dateiname Lädt den Kernel, das Kernel-Modul, oder die Datei des angegebenen Typs. Optionen, die auf den Dateinamen folgen, werden der Datei übergeben. ls Pfad Listet die Dateien im angegebenen Pfad auf, oder das root-Verzeichnis(/), falls kein Pfad angegeben wurde. Die Option bewirkt, dass die Dateigrössen ebenfalls angezeigt werden. lsdev Listet alle Geräte auf, für die Module geladen werden können. Die Option bewirkt eine detailreichere Ausgabe. lsmod Listet alle geladenen Module auf. Die Option bewirkt eine detailreichere Ausgabe. more Dateiname Zeigt den Dateinhalt der angegebenen Datei an, wobei eine Pause alle LINES Zeilen gemacht wird. reboot Bewirkt einen umgehenden Neustart des Systems. set Variable set Variable=Wert Setzt die Umgebungsvariablen des Loaders. unload Entlädt sämtliche geladenen Module. Beispiele für die Loader Bedienung Hier ein paar praktische Beispiele für die Bedienung des Loaders. Single-User Modus Um den gewöhnlichen Kernel im Single-User Modus zu starten: boot -s Um alle gewöhnlichen Kernelmodule zu entladen und dann nur den alten (oder jeden beliebigen anderen) Kernel zu laden: kernel.old unload load kernel.old Es kann kernel.GENERIC verwendet werden, um den allgemeinen, Kernel zu bezeichnen, der vorinstalliert wird. kernel.old bezeichnet den Kernel, der vor dem aktuellen installiert war (falls man einen neuen Kernel compiliert und installiert hat, zum Beispiel). Der folgende Befehl lädt die gewöhnlichen Module mit einem anderen Kernel: unload set kernel="kernel.old" boot-conf Folgendes lädt ein Kernelkonfigurations-Skript (ein automatisiertes Skript, dass dasselbe tut, was der Benutzer normalerweise von Hand an der Eingabeaufforderung durchführen würde): load -t userconfig_script /boot/kernel.conf Kernel Interaktion während des Bootprozesses Kernel boot interaction Wenn der Kernel einmal geladen ist, entweder durch den Loader (die Standardmethode) oder durch boot2 (den Loader umgehend), verhält sich gemäß seiner Boot-Flags, falls es welche gibt. Kernel bootflags Kernel Boot-Flags Es folgt eine Auflistung der gebräuchlichsten Boot-Flags: Bewirkt, dass der Benutzer während der Kernel-Initialisierung gefragt wird, welches Gerät als Root-Dateisystem gemounted werden soll. Es wird von CD-ROM gebootet. UserConfig, das Boot-Zeit Konfigurationsprogramm, wird gestartet. Bewirkt den Start des Single-User Modus. Zeigt mehr Informationen während des Starten des Kernels an. Andere Boot-Flags sind in der Hilfeseite &man.boot.8; erläutert. Tom Rhodes Beigetragen von device.hints Konfiguration von Geräten Diese Funktion steht erst ab FreeBSD 5.0 zur Verfügung. Der Boot-Loader liest während des Systemstarts die Datei &man.device.hints.5;, die Variablen, auch device hints genannt, zur Konfiguration von Geräten enthält. Die Variablen können auch mit Kommandos in der Phase 3 des Boot-Loaders bearbeitet werden. Neue Variablen werden mit set gesetzt, unset löscht schon definierte Variablen und show zeigt Variablen an. Variablen aus /boot/device.hints können zu diesem Zeitpunkt überschrieben werden. Die hier durchgeführten Änderungen sind nicht permanent und beim nächsten Systemstart nicht mehr gültig. Nach dem Systemstart können alle Variablen mit &man.kenv.1; angezeigt werden. Pro Zeile enthält /boot/device.hints eine Variable. Kommentare werden, wie üblich, durch # eingeleitet. Die verwendete Syntax lautet: hint.driver.unit.keyword="value" Der Boot-Loader verwendet die nachstehende Syntax: set hint.driver.unit.keyword=value Der Gerätetreiber wird mit driver, die Nummer des Geräts mit unit angegeben. keyword ist eine Option aus der folgenden Liste: : Gibt den Bus, auf dem sich das Gerät befindet, an. : Die Startadresse des I/O-Bereichs. : Gibt die zu verwendende Unterbrechungsanforderung (IRQ) an. : Die Nummer des DMA Kanals. : Die physikalische Speicheradresse des Geräts. : Setzt verschiedene gerätespezifische Optionen. : Deaktiviert das Gerät, wenn der Wert auf 1 gesetzt wird. Ein Gerätetreiber kann mehr Optionen, als die hier beschriebenen, besitzen oder benötigen. Schlagen Sie die Optionen bitte in der Online-Hilfe des Treibers nach. Weitere Informationen erhalten Sie in &man.device.hints.5;, &man.kenv.1;, &man.loader.conf.5; und &man.loader.8;. init Init: Initialisierung der Prozess-Kontrolle Nachdem der Kernel den Bootprozess abgeschlossen hat, übergibt er die Kontrolle an den Benutzer-Prozess &man.init.8;. Dieses Programm befindet sich in /sbin/init, oder dem Pfad, der durch die Variable init_path im Loader spezifiziert wird. Der automatische Reboot-Vorgang Der automatische Reboot-Vorgang stellt sicher, dass alle Dateisysteme des Systems konsistent sind. Falls dies nicht der Fall ist und die Inkonsistenz nicht durch &man.fsck.8; behebbar ist, schaltet &man.init.8; das System in den Single-User Modus, damit der Systemadministrator sich des Problems annehmen kann. Der Single-User Modus Single-User Modus Konsole Das Schalten in diesen Modus kann erreicht werden durch den automatischen Reboot-Vorgang, durch das Booten mit der Option oder das Setzen der boot_single Variable in Loader. Weiterhin kann der Single-User Modus aus dem Mehrbenutzer Modus heraus durch den Befehl &man.shutdown.8; ohne die reboot () oder halt () Option erreicht werden. Falls die System-Konsole (console) in /etc/ttys auf insecure (dt.: unsicher) gesetzt ist, fordert das System allerdings zur Eingabe des Passworts von root auf, bevor es den Single-User Modus aktiviert. Auf insecure gesetzte Konsole in <filename>/etc/ttys</filename> # name getty type status comments # # If console is marked "insecure", then init will ask for the root password # when going to single-user mode. console none unknown off insecure Eine Konsole sollte auf insecure gesetzt sein, wenn die physikalische Sicherheit der Konsole nicht gegeben ist und sichergestellt werden soll, dass nur Personen, die das Passwort von root kennen, den Single-User Modus benutzen können. Es bedeutet nicht, dass die Konsole "unsicher" laufen wird. Daher sollte man insecure wählen, wenn man auf Sicherheit bedacht ist, nicht secure. Mehrbenutzer Modus Mehrbenutzer Modus Stellt &man.init.8; fest, dass das Dateisystem in Ordnung ist, oder der Benutzer den Single-User Modus beendet, schaltet das System in den Mehrbenutzer Modus, in dem dann die Ressourcen Konfiguration des Systems gestartet wird. rc-Dateien Ressourcen Konfiguration, rc-Dateien Das Ressourcen Konfigurationssystem (engl. resource configuration, rc) liest seine Standardkonfiguration von /etc/defaults/rc.conf und System-spezifische Details von /etc/rc.conf. Dann mountet es die Dateisysteme gemäß /etc/fstab, startet die Netzwerkdienste, diverse System Daemons und führt schließlich die Start-Skripten der lokal installierten Anwendungen aus. Die &man.rc.8; Handbuch Seite ist eine gute Quelle für Informationen über das Ressourcen Konfigurationssystem und ebenso über die Skripte an sich. Der Shutdown Vorgang shutdown Im Falle eines regulären Herunterfahrens durch &man.shutdown.8; führt &man.init.8; /etc/rc.shutdown aus, sendet dann sämtlichen Prozessen ein TERM Signal und schließlich ein KILL Signal an alle Prozesse, die sich nicht schnell genug beendet haben. FreeBSD Systeme, die Energieverwaltungsfunktionen unterstützen, können Sie mit dem Kommando shutdown -p now ausschalten. Zum Neustart des Systems benutzen Sie shutdown -r now. Das Kommando &man.shutdown.8; kann nur von root oder Mitgliedern der Gruppe operator benutzt werden. Sie können auch die Kommandos &man.halt.8; und &man.reboot.8; verwenden. Weitere Informationen finden Sie in den Hilfeseiten der drei Kommandos. Mit FreeBSD 5.0 müssen Sie die &man.acpi.4;-Unterstützung im Kernel aktivieren oder das Modul geladen haben, damit Sie die Energieverwaltungsfunktionen benutzen können. Mit FreeBSD 4.0 benötigen Sie die &man.apm.4;-Unterstützung.