Druckversion | ||||||||||||||||||||||||||||||||||||||||||||||||||||
Aus der Fülle kommerzieller und freier Bootmanager hat sich im Linuxumfeld nur ein einziger Kandidat tatsächlich etabliert. Dabei handelt es sich um den mit Linux groß gewordenen Lilo (Linux Loader). Lange Zeit sah es aus, als könnte der mit ähnlichen Fähigkeiten ausgestattete und um eine gefällige Oberfläche bereicherte chos (Choose Operating System) eine ernsthafte Alternative für den Lilo darstellen. Jedoch ist seine Entwicklung ins Stocken geraten und aus so mancher Distribution ist er bereits wieder verschwunden... Und dennoch wildert mit dem Grub (Grand Unified Boot Loader) ein weiterer Kandidat im Revier des Lilo. Vor allem dessen unerreichter Funktionsumfang ermächtigt ihn, die Herrschaft über das Bootgebahren zu übernehmen. Ein Bootloader, oft auch als Bootmanager bezeichnet, selbst ist ein kleines Programm, das beim Hochfahren des Rechners vom BIOS desselben aufgerufen wird. Die wesentliche Aufgabe des Bootloaders ist nun, die Datei mit dem Betriebssystem in den Hauptspeicher zu laden und diesem anschließend die Kontrolle über den Rechner zu übertragen. Dass die Linux-Bootmanager noch eine Reihe weiterer Möglichkeiten implementieren, werden Ihnen die folgenden Abschnitte vor Augen führen. Und da es doch hin und wieder erforderlich sein soll, Windows NT oder 2000 einzusetzen, werden auch dem Zusammenspiel der Systeme einige Worte gewidmet.
Abbildung 1: Begrüßung durch den Lilo Genau genommen handelt es sich bei Lilo um verschiedene Programme und Dateien. Das Kommando lilo ist dabei der so genannte Map-Installer, der alle für den Bootmanager benötigten Dateien an die entsprechenden Stellen im System platziert. lilo ist stets aufzurufen, sobald sich an irgend einer für den Bootmanager wichtigen Datei (/etc/lilo.conf, Kernel, /boot/map) etwas geändert hat. Der Bootmanager lilo selbst besteht aus zwei Stufen. Die erste wird in einem vom BIOS erreichbaren Sektor (Mbr, Bootsektor einer Partition, Diskette...) abgelegt. Ihre Aufgabe ist einzig das Laden der zweiten Stufe (meist /boot/boot.b) in den Hauptspeicher. Die zweite Stufe kennt nun anhand der Datei »/boot/map« die Lage der verschiedenen Kernel bzw. der zu ladenden Bootsektoren anderer Betriebssysteme. Zur Auswahl dieser bietet lilo ein einfaches Kommandozeileninterface an, das neben der Selektion des Betriebssystems auch die Übergabe von Optionen an dieses erlaubt. Alternativ präsentieren neuere Programmversionen eine grafische Oberfläche. Diese kann ggf. durch Eingabe von [Esc] verlassen werden, um Optionen an einen Kernel zu übergeben. Lilo lädt nun den Kernel in den Hauptspeicher, teilt diesem die Lage des Root-Verzeichnisses und eventuelle Optionen mit und übergibt abschließend die Kontrolle an den Kernel. Das Problem mit einem alten BIOSDas 1024-Zylinder-Problem wurde bereits im Abschnitt Vorbereitung der Installation besprochen. Knapp dargestellt, vermögen viele - selbst neuere! - BIOS-Implementierungen Festplatten größer 1024 Zylinder (bei heutigen Platten entspricht dies 8.4Gbyte) nicht zu adressieren. Dies erzwingt die Lage des Bootmanagers innerhalb dieser 1024 Zylinder. Für Lilo selbst kann dies einige Einschränkungen bedeuten:
Die neuesten lilo-Implementierungen (Versionen ab 2.0) vermögen Fremdsysteme und Kernel auch von Zylindern >1024 zu booten, allerdings bedarf es bestimmter BIOS-Versionen (post 1998, für die meisten älteren Mainboards bieten die Hersteller entsprechende Updates an). Die Datei /etc/lilo.confDie Datei /etc/lilo.conf ist die Konfigurationsdatei des Bootmanagers lilo. Beginnen wir mit den wichtigsten globalen Optionen, die für alle eingetragenen Images und Bootsektoren gelten. Den einzig zwingenden Eintrag leitet das Schlüsselwort boot ein und legt den Ort fest, wohin der Lilo installiert werden soll:
Im Beispiel ist der Mbr der ersten IDE-Festplatte Ziel der Installation. Während des Bootens zeigt der Lilo mit »lilo:«, sofern die Option prompt in die Konfiguration aufgenommen wurde, die Bereitschaft zur Entgegennahme einer Eingabe an. Wie lange er wartet, kann mit der Option timout=Zehntel Sekunden eingestellt werden. Nach Ablauf der Zeit startet Lilo automatisch das erste in der Konfiguration aufgeführte Image, außer eine Option default=Name benennt ein anderes Image als das Voreingestellte. Eine Option read-only bewirkt das schreibgeschützte Mounten des Root-Dateisystems und beschleunigt mitunter dessen Überprüfung. Einen weiterer Versuch zur Beschleunigung des Startvorganges erlaubt die Option compact, die Lilo anweist, benachbarte Sektoren »in weiser Voraussicht« in einem Ritt zu lesen. Die Installation des Lilo überschreibt den bisherigen Inhalt des Zielsektors. Wer sich seiner Sache nicht sicher ist, dem sei ein Backup des alten Inhalts empfohlen. Ein entsprechender Eintrag lautet:
Bevor lilo beim nächsten Aufruf den Bootsektor überschreibt, wird es den alten Inhalt in die Datei /boot/bootsector_save sichern. Um diese Datei später wieder als Bootsektor zu platzieren, kann die Option install=/boot/boot_sector_save in die "/etc/lilo.conf" aufgenommen werden. Lilo nimmt den Inhalt der angegebenen Datei und schreibt diesen in den Zielsektor, anstatt die Informationen aus /boot/boot.b zu beziehen. Lilo kann auch zu etwas Höflichkeit angehalten werden, indem er während des Starts eine Begrüßung auf den Bildschirm schreibt. Den Text schreibt man hierzu in eine ASCII-Datei und teilt die Lage dieser dem Bootmanager mit:
Damit lilo die Installation bei Zugriff auf Bereiche jenseits der 1024er Grenze nicht verweigert, ist eine Option lba32 aufzunehmen. Die Möglichkeiten der globalen Einstellungen sind hiermit noch lange nicht erschöpft, die wichtigsten sollten jedoch genannt worden sein. Die nun diskutierten Optionen betreffen die von Lilo zu verwaltenden Images und
gliedern sich nochmals in allgemeine Kerneloptionen und Linux
Kerneloptionen. Werden sie im Rahmen der globalen Optionen angegeben, so gelten sie
für alle Kernel, in denen sie zulässig sind. Jedes Betriebssystem muss einen eindeutigen Namen zugewiesen bekommen label = Name, im Falle des Linuxsystems sollte Lilo die Lage des Wurzelverzeichnisses root=Partitionsname mitgeteilt werden. Zwar enthält ein Kernel selbst die Information, wo sein Root-Dateisystem liegt (es wird ihm zur Kompilierzeit oder per »rdev« mitgeteilt), aber zumindest die Standardkernel beinhalten selten den richtigen Ort. Damit ergibt sich als minimaler Eintrag für einen Linuxkernel:
Bedient Lilo mehrere Images, erfolgt deren Auswahl am Lilo-Prompt durch Eingabe des vollständigen Label-Namens. Der Schreibaufwand lässt sich minimieren, indem zu einem Image ein Alias-Name definiert wird alias=Anderer_Name. Wählt man als Alias ein einzelnes Zeichen, muss sicher gestellt sein, dass kein anderer Name mit diesem Zeichen beginnt. Fügt man nun noch die Option single-key in den globalen Abschnitt ein, genügt das Drücken der einen Taste, um ein Betriebssystem zu laden:
Das obige Beispiel birgt eine Falle: DOS weigert sich, von einem anderen Laufwerk als dem Laufwerk C zu starten. Aber auch hierfür kennt Lilo einige Kniffe und gaukelt DOS eben das erwartete Laufwerk vor. Mit der Option map-drive lassen sich die Zuordnungen gezielt anpassen:
Aus Sicht von DOS ist Laufwerk D nun C und C ist D. An dieser Stelle sei nur erwähnt, dass sich mit der Option change ganze Partitionen vor einem System verbergen oder deren Eigenschaften sich ändern lassen. Eine hilfreiche Option ist sicherlich der Schutz des unbefugten Startens einzelner Systeme. Jedes Image kann mit password=Passwort durch ein Passwort geschützt werden. Lilo fordert zur Eingabe dessen auf, wenn es an den Start des Systems geht. Sollten Sie von dieser Möglichkeit Gebrauch machen, dann stellen Sie sicher, dass "/etc/lilo.conf" nur für Root lesbar ist, sonst wäre der Effekt derselbe, als würden Sie die Geheimnummer auf der Rückseite Ihrer Kreditkarte notieren. Etwas moderater wird die Passwortabfrage mit der zusätzlichen Option restricted. Hier wird dessen Eingabe nur notwendig, wenn der Benutzer Optionen an den Kernel übergeben möchte. Bei einem simplen Start entfällt die Abfrage. Für Linuxkernel ist häufig die Übergabe von Argumenten an den Kernel erwünscht. Dies kann der mit der Option append="Parameterliste" erfolgen. Typische Anwendung ist, dem Kernel die Parameter zu Hardware mitzuteilen, die nicht automatisch erkannt werden kann. Z.B. erkennt der Kernel keine zweite Ethernetkarte, jedoch kann er zur Suche aufgefordert werden:
Eine Diskussion aller Parameter findet der interessierte Leser im Boot-Prompt-HowTo. Wer vor einem großen Monitor sitzt, wird bald die voreingestellten Monsterzeichensätze verdammen und sich etwas mehr Information auf der Mattscheibe wünschen. Mit vga=ask wird im Falle eines Linuxkernels Lilo beim Start des betreffenden Images eine Liste aller verfügbaren VGA-Modi darstellen und den Nutzer auffordern, sich für einen zu entscheiden. Hat man letztlich einen brauchbaren Font gefunden, kann das ask auch durch die konkrete Bezeichnung des Modus ersetzt werden, so dass das System immer mit diesem startet. Eine vollständige Datei "/etc/lilo.conf", die zwei Linuxkernel und ein DOS-System unterstützt, könnte wie folgt aufgebaut sein:
KommandozeilenoptionenUnmittelbar nach dem Laden von Lilo, überprüft dieser, ob eine der Tasten [Shift], [Ctrl] oder [Alt] gedrückt ist. In diesem Fall erscheint das Promptzeichen (dieser erscheint ebenso, wenn die Option "prompt" in der Konfigurationsdatei gesetzt wurde) und Lilo wartet auf die Eingabe durch den Benutzer. Der Benutzer gibt nun den Namen des zu startenden Systems ein (eine Liste erhält er durch Eingabe von [?] oder [Tab]) und bestätigt die Eingabe mit [Enter]. Soweit nicht Neues. Zusätzlich zum Namen des Images können dem Kernel Optionen übergeben werden. Alles, was dem Imagenamen folgt, reicht Lilo an den Kernel als Argument weiter, die einzelnen Parameter sind durch Leerzeichen voneinander zu trennen. So weist nachfolgende Eingabezeile den Kernel an, im Single User Modus zu starten und als Rootdateisystem /dev/hdc1 zu mounten:
Die wichtigen Argumente sollen knapp erläutert werden: ro bzw. rw veranlassen den Kernel das Rootverzeichnis nur-lesend bzw. lesend-und-schreibend zu mounten. no378 schaltet den Coprozessor ab und no-hlt verhindert die Powermanagement-Funktionen, falls der Rechner mal nichts zu tun hat. debug lässt die Fülle der Kernelmeldungen in schwindelerregende Dimensionen anschwellen und vga=Modus modifiziert die Ausgabe (wie weiter oben schon erwähnt). Des Weiteren können nahezu zu allen Hardwaregeräten deren Einstellungen, wie IO-Adresse, Interrupts, ... an den Kernel durchgereicht werden. Die Auswahl ist so vielfältig, dass man eigens ein HowTo (BootPrompt) dem Thema widmete. Die Umgebungsvariablen für den init-Prozess lassen sich auch per Kommandozeile Umbiegen. Um z.B. eine andere Einstellung der PATH-Variablen zu erzwingen, setzt man "PATH=/opt/kde/sbin:/usr/sbin:/sbin/" als Argument ein. Lilo startet durchLilo selbst gibt Auskunft über das Fortschreiten des Bootvorganges. Anhand der Ausgabe "LILO" lassen sich die Vorgänge beobachten. Hängt der Start hier, hilft ein angegebener zweistelliger Code einem bei der Ursachenforschung oft auf die Sprünge. Eine verstümmelte Ausgabe hat folgende Ursachen: L Die erste Stufe des Lilo kann die zweite nicht finden, der angegebene Code beschreibt den Grund. LI Die zweite Stufe wurde geladen, kann aber nicht ausgeführt werden. Entweder besitzt der Lilo falsche Informationen über die Festplattengeometrie oder die Datei /boot/boot.b wurde manipuliert, ohne das Kommando "lilo" auszuführen. LIL Die zweite Stufe kann die "map"-Datei mit den Informationen über die Lage der Kernel nicht finden. Die Ursache ist wiederum in einer falschen Plattengeometrie zu suchen. LIL? Die Daten des Lilo wurden an eine falsche Speicheradresse geladen, vermutlich wurde "lilo" nach einer Kernelinstallation nicht neu gestartet. LIL- Die "map"-Datei ist fehlerhaft. Wahrscheinlich wurde irgendeine der Startdateien geändert, ohne "lilo" zu rufen. LILO Alles im Lot, der Ladevorgang ist erfolgreich verlaufen Die Fehlercodes des ersten Schrittes identifizieren folgenden Fehler: 0x00 Der "Internal error" deutet auf eine beschädigte Datei oder die Überschreitung der 1024-Zylinder-Grenze hin. 0x01 Das "Illegal command" erscheint, wenn der Zugriff auf eine Festplatte erfolgt, die nicht vom BIOS unterstützt wird. 0x02 "Address mark not found" deutet an, dass auf die Platte nicht zugegriffen werden kann (Hardwareproblem?). 0x03 "Write protected disk" erscheint bei einer Schreiboperation auf eine schreibgeschützte Diskette. 0x04 "Sector not found" lässt auf eine falsche Plattengeometrie schließen. Helfen könnte eventuell das Abschalten der "compact"-Option und/oder Hinzufügen von "linear". 0x06 "Change line active" sollte höchstens temporär auftauchen und nach wiederholten Booten verschwunden sein. 0x07 "Invalid initialization" schiebt dem BIOS die Schuld in die Schuhe, da dieses vermutlich den Festplattencontroller nicht initialisieren kann. 0x08 "DMA overrun" kann bestenfalls durch einen Neustart behoben werden. 0x09 "DMA attempt across 64k boundary" kann bestenfalls durch einen Neustart behoben werden. 0x0C "Invalid media" entweder klappt es nach einem Neustart oder das Bootmedium ist beschädigt. 0x10 "CRC error" deutet auf eine Fehler des Mediums hin. Sollten weitere Bootversuche ebenso scheitern, wie das erneute Installieren des Lilo, so kann versucht werden, die defekten Sektoren auszublenden. 0x11 "ECC correction successful" beschreibt einen erkannten und korrigierten Lesefehler. Lilo bricht dennoch den Ladevorgang ab. Ein Neustart sollte helfen. 0x20 "Controller error" ist ein Hardwarefehler und man sollte hoffen, dass er beim Neustart nicht wieder auftritt... 0x40 "Seek failure" ist ein Zugriffsfehler auf das Bootmedium. Ein erneuter Versuch bringt hoffentlich Abhilfe. 0x80 "Disk timeout" zeigt an, dass das Medium nicht bereit ist. Im Falle einer Diskette ist vermutlich das Laufwerk nicht verriegelt. 0xBB Zeigt sich "BIOS error" hartnäckig und erscheint auch nach weiteren Bootvorgängen, so sollten die Optionen "compact" und "linear" entfernt oder hinzugefügt werden.
Abbildung 2: Begrüßung durch den Chos Auch wenn lilo nach wie vor den Standard unter den Linux Bootloadern setzt, so hat sich der chos dank seiner attraktiven Oberfläche und der einfachen Administration aus dem Status eines Geheimtipps erhoben. Wozu dann immer noch Lilo? Weil der chos sich noch immer im Entwicklungsstadium befindet und noch nicht alle Möglichkeiten des Lilo unterstützt. Und... der Status des Projekts scheint derzeit unklar, da sich der Koordinator des Projekts aus diesem verabschiedet hat. Sei es wie es sei, selbst wenn noch keine "1" der Versionsnummer voran steht, arbeitet der chos zuverlässig und stellt eine echte Alternative zum Lilo dar. Der Bootmanager ist in der Lage den Linux-Kernel sowie die Bootsektoren anderer Betriebssysteme zu laden. Für Linux unterstützt er einen mit bzip2 gepackten Kernel, Ramdisks und die Übergabe von Parametern an den Kernel. Des Weiteren ist er so konzipiert, dass ein Programm ihm mitteilen kann, welches Betriebssystem beim nächsten Systemstart zu laden ist. Sollte er einmal seine Daten nicht finden (weil die Festplatte nicht mehr will...) so ist er in der Lage, einen speziellen Notfall-Bootsektor zu starten. Die Datei /etc/chos.confAnalog zum Aufbau der "/etc/lilo.conf" gruppieren sich die Einträge in allgemein gültige und in kernelspezifische Optionen. Wenden wir uns zunächst dem Eintrag zum Laden eines Betriebssystems zu, jeder Eintrag besitzt folgende Gestalt:
Image-Typ kann dabei einer von 3 Bezeichnern sein:
Name ist der Eintrag, der im späteren Bootmenü als Bezeichner erscheint. Alle Optionen, die den Betriebssystemeintrag betreffen, sind nun in geschweifte Klammern eingeschlossen: color=Farbe Setzt die Farbe des Menüeintrags, als Angaben gelten BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, brOWN, LIGHTGRAY. hotkey=Taste Durch diese Taste kann das System sofort gestartet werden position=Spalte,Zeile Positioniert den Menüeintrag loader=loader Nutzt den angegebenen Lader anstelle des "normalen" Bootloaders für dieses System image=Kernel Im Falle von Linux der vollständige Name des Kernel (z.B. /boot/vmlinuz), sonst der Bootsektor oder der Name der Datei mit dem Bootsektor password=yes|no|restricted|cmdline Mit yes fragt der chos und mit no fragt er nicht nach dem Passwort. Mit restricted oder cmdline fordert er zur Eingabe des Passwortes nur auf, falls man die Kommandozeile editieren möchte (Drücken der Leertaste im Menü) Nur für Linux-Images relevante Optionen: cmdline=Parameter Zur Übergabe von Parametern an den Kernel initrd=Datei [,Adresse] Lädt die Datei an eine optional angegebene Adresse in eine Ramdisk. Ohne Adresse wird die Datei an den Beginn des Hauptspeichers geladen. Einige Beispiel sollen den praktischen Einsatz der Optionen demonstrieren:
Fehlen uns noch die allgemeinen Optionen. Der Autor des Chos teilte diese in die drei Gruppen "Allgemein" "Aussehen" und "Dateien" ein. Betrachten wir zunächst die Optionen der "allgemeinen" Gruppe: delay=Sekunden Verzögerung, bis der erste Menüeintrag automatische gestartet wird autoboot=no | pressed | not_pressed Steht hier "no", so wird das erste Betriebssystem gestartet, ohne dass der Benutzer etwas daran ändern kann, bei "pressed" wird es geladen, sobald der Benutzer eine der Tasten [Ctrl], [Alt] oder [Shift] drückt und "not_pressed" bewirkt das sofortige Laden des ersten Systems, wenn der Benutzer zum Zeitpunkt der Aktivierung der Bootmenüs keine Taste (nicht alle Tasten bewirken die Auswahl) drückt. install=device Wohin soll der Bootloader "chos" geschrieben werden (Angabe des Devices)? emergency=Datei Die Notfalldatei, die zu starten "chos" versucht, wenn er seine eigenen Dateien nicht finden kann. password=Passwort Das Passwort, mit dem der Zugang zu den Einträgen reguliert werden kann. Wenn Sie ein solches verwenden, dann stellen Sie auch sicher, dass niemand außer Root die Datei /etc/chos.conf lesen darf. default=Nummer Dieser Eintrag ist in der Voreinstellung selektiert, die Zählung beginnt bei 1. mapdrive=bios_number, device Hiermit hilft der Bootloader einem BIOS auf die Sprünge, wenn dieses ein Gerät nicht erkennen kann, indem er das Mapping des Gerätes an die BIOS-Adresse vornimmt. Die Optik beeinflussen folgende Einträge: banner=Text Die Menüüberschrift infoline=on | off Mit "on" wird ein Copyrigth- und Hilfe-Hinweis ausgegeben color=Farbe Die voreingestellte Farbe, sie kann bei den einzelnen Image-Einträgen überschrieben werden selection=Farbe Die Balkenfarbe des selektierten Eintrags background=type,file Die Datei mit den Hintergrundbild. Der Typ der in der Datei enthaltenen Daten muss angegeben werden, "dump" steht für binäre Daten, "ascii" für reinen Text und "cpxxx" für die Zeichensatzkodierung xxx. menupos=Spalte,Zeile Position des Menüs relativ zum linken, oberen Bildrand (0,0) timerpos=Spalte,Zeile Position der Einblendung der verbliebenen Zeit bis zum automatischen Booten Die Optionen zur Datei sind: bindir=Verzeichnis Verzeichnis mit den Daten des chos bgfile=Datei Datei, wohin ein erzeugtes Hintergrundbild gespeichert werden soll mapfile=Datei Die Datei wird anstelle von chos.map verwendet Damit könnte eine vollständige Konfigurationsdatei des chos wie folgt aussehen:
Die Anfänge des GRUB reichen ähnlich weit in die Vergangenheit zurück wie die des Lilo, doch hat erst dessen Aufnahme in den Fundus der GNU-Software für eine gewisse Verbreitung gesorgt. Dabei wartet GRUB mit einer Reihe von Fähigkeiten auf, die kaum ein zweiter Bootmanager in nur annäherndem Umfang mit sich bringt. Hierzu zählen:
Die Liste der heraus ragenden Eigenschaften ließe sich noch ein Stück verlängern. Einiges wird der weitere Text berichten und manch andere Fähigkeit ist derzeit kaum dem Status der Planung entwachsen. InstallationAuch wenn GRUB schon für den produktiven Einsatz geeignet ist (sprich: er läuft stabil), so ist es bis zum ersten »kompletten« Release noch ein weiter Weg. So wird man derzeit auch kaum vorkompilierte Pakete finden, sondern kommt um eine Konfiguration und Installation der Quellpakete nicht umhin. Die üblichen Schritte sind:
Es ist sicher nicht verkehrt, zuvor die Dateien INSTALL und README im Quellverzeichnis zu betrachten. So lassen sich Merkmale von GRUB durch Optionen des »configure«-Skripts an- bzw. abschalten. Im Falle des Einsatzes von GRUB zum Booten über das Netz ist das Aktivieren des entsprechenden Netzwerktreibers zwingend notwendig (»./configure --help« verrät Ihnen mehr darüber). Treten bei obigem Vorgehen Fehler auf, sollten Sie den Abschnitt Software-Installation - Quellpakete im Kapitel Systemadministration durchlesen. Die Dateien des GRUB liegen nun unterhalb von /usr/local/share/grub/i386-pc (auf manchen Systemen auch unter /usr/share/grub/i386-pc). Folgt man den Richtlinien des File System Hierachie Standards, gehören die Daten eines Bootmanagers unter /boot, sodass folgende Schritte zu empfehlen sind (die weiteren Beispiele beziehen sich auf dieses Verzeichnis):
Das Programm grub liegt nun vermutlich unter /usr/local/sbin (oder /usr/sbin); zum weiteren Vorgehen ist dieses zu starten:
NamensgebungFür die weiteren Schritte zur Installation ist eine Betrachtung der Namenskonventionen notwendig, die GRUB für Festplatten und Floppies verwendet. Zunächst unterscheidet GRUB nicht zwischen IDE- und SCSI-Festplatten, beide tragen in ihrer Bezeichnung den Suffix »hd«. Abweichend von Linux nummeriert GRUB die Festplatten und Floppies mit Ziffern, wobei die Zählung bei 0 beginnt. Somit entspricht GRUB's »hd0« dem »hda« (bzw. sda) von Linux; »hd1« steht für »hdb« (sdb) usw. Entsprechend der Reihenfolge im BIOS reihen sich bei Systemen, die IDE- und SCSI-Platten vereinen, sämtliche IDE-Platten vor SCSI ein oder umgekehrt. Ein Diskettenlaufwerk benennt GRUB nach dem selben Schema wie Linux. Eher einer Umgewöhnung bedarf da schon das Ansprechen einzelner Partitionen. Auch hier startet GRUB die Zählung bei 0. Diese Nummer ist dem Plattennamen nachzustellen, wobei beide Angaben durch ein Komma zu trennen sind. Während Linux die erste Partition der ersten IDE-Festplatte mit »hda1« benennt, heißt diese im GRUB-Sprachgebrauch »hd0,0«. Abbildung 3: Benennung von Partitionen Der Gebrauch erklärt sich anhand eines Beispiels quasi von selbst. Zur Demonstration nutzen wir das in die Grub-Shell eingebaute Kommando cat, das den Inhalt einer Datei auf den Bildschirm ausgibt. Mit der Annahme, dass sich das Linux-Wurzelverzeichnis auf der ersten logischen Partition befindet (unter Linux /dev/hda5), führt folgende Eingabe zum Ziel:
Die runden Klammern sind integraler Bestandteil der Device-Benennung von GRUB! BootvorbereitungWohl jeder Bastler ist im Laufe seiner Experimente mit Linux einmal in die Falle getappt, dass er nach dem Bau eines neuen Kernels diesen zwar korrekt installierte, aber versäumte, anschließend den Bootmanager neu einzurichten. Sowohl lilo als auch chos bestraften die Vergesslichkeit mit einem verkorksten Bootvorgang... Wer kennt nicht Ausschriften der Art: "01010101010"? Grub's Technologie bei der Suche nach den Kerneln arbeitet jedoch nicht mehr mit den Blocklisten, so wie es lilo und chos handhabten, sondern nutzt die Mechanismen des jeweiligen Dateisystems, um die Datei(en) aufzuspüren. Der reine Bezug auf den Dateinamen macht Grub resistent gegen Änderungen am Kernel, die zumeist mit einer Lageveränderung im Dateisystem (auf Blockebene) behaftet sind. Und dieses Verfahren ermöglicht ebenso, dass ein System bootbar ist, welches Grub nicht vorab bekannt ist. Doch zunächst muss Grub an den rechten Fleck verschoben werden, um beim nächsten Booten des Rechners zu starten. Der sichere Weg führt über eine Bootdiskette, auf welche stage1 und stage2 zu kopieren sind:
Wenn Sie das nächste mal per Diskette booten, befinden Sie sich anschließend in der Grub-Shell wieder. Nicht zuletzt wegen der Fehleranfälligkeit des Mediums Diskette eignet sich der Systemstart von derselben nur als Notmaßnahme oder in der Testphase. Wer den Grub ernsthaft für die Bootmaschinerie in Betracht zieht, wird ihn auch auf die Festplatte bannen wollen, wozu der Start der Grub-Shell von Nöten ist:
Mit dem root-Befehl teilen Sie Grub mit, auf welcher Partition seine Daten liegen (im Beispiel /dev/hda6 nach Linux-Gerätebezeichnung). Wenn Sie sich der Lage nicht sicher sind, dann lassen Sie Grub diese feststellen, indem Sie in der Grubshell find </Pfad/stage1> eingeben:
Anstatt im Verzeichnis /boot/grub/ liegen die Daten des Bootmanagers auf Ihrem System eventuell unterhalb von /grub. Und zwar genau dann, wenn /boot auf einer eigenen Partition liegt.
Mit dem setup-Aufruf wird letztlich Grub installiert. Zwingend anzugeben ist der Ort der Installation, im Beispiel der Mbr der ersten Festplatte (hd0). Die Angabe der Lage von stage2 ist eigentlich überflüssig, da sie laut Grub's eigener Statusmeldungen exakt mit dem übereinstimmt, was Grub ermittelte. Allerdings scheiterte bei den von mir getesteten Versionen stets das Schreiben von stage2, sobald ich auf diese Angabe verzichtete. Neben stage1 und stage2 platziert Grub - falls er im Mbr installiert wird - automatisch den Treiber für das Dateisystem in eine definierte Position der Festplatte. Durch den anfänglichen root-Aufruf erkannte Grub den Typ des Dateisystems, auf dem seine Daten liegen (ext2 im Beispiel). Genau für diesen Typ schreibt Grub einen minimalen Treiber e2fs_stage1_5 in den freien Bereich hinter dem Mbr und vor Beginn der ersten Partition (die erste Partition beginnt auf dem zweiten Zylinder, sodass vom ersten Zylinder ein Sektor durch den Mbr reserviert ist und die nächsten 62 Sektoren frei sind). Die Verwendung dieses Treibers erlaubt es Grub, die Datei stage2 selbst dann noch zu finden, wenn diese verschoben wurde. Booten mit der Grub-ShellNach obigen Vorbreitungen endet ein folgender Bootvorgang mit einem Prompt in der Grub-Shell. Jedes installierte System auf dem Rechner, das Grub direkt unterstützt, kann nun geladen werden. Für nicht unterstützte Systeme, wie die Windows-Familie, kann per »chainloading« deren Bootloader gerufen werden. Angenommen, ein Linuxkernel »vmlinuz« befindet sich auf /dev/hda6 ebenso wie dessen Root-Dateisystem, so lässt sich diese über folgende Befehlssequenz starten:
Der kernel-Befehl leitet die Angabe des Kernels ein. Dieser ist mit dem vollständigen Pfad (bzw. der Partition) zu spezifizieren. Anstatt dem im Beispiel gewählten expliziten Bezug auf eine Partition ((hd0,5)/boot/vmlinuz) kann ein vorangehender root-Befehl festlegen, dass weitere Pfadangaben sich auf eine bestimmte Partition beziehen. Folgende Befehlsfolge ist somit äquivalent (auf die Ausgaben von Grub wurde verzichtet):
Möchten Sie einem Kernel Parameter mitteilen, so sind diese auf der Kernel-Zeile anzugeben. Alles dem Namen der Kerneldatei Folgende wird von Grub unverändert an den Kernel übergeben. Einzig erforderlich ist das Root-Device (es sei denn, dieses ist korrekt im Kernel eingetragen - was bei Standardkerneln selten der Fall ist...). Um ein System wie Windows2000 zu starten, benötigen Sie Kenntnis, in welcher Partition dieses installiert ist. Über den chainloader--Befehl laden Sie hierzu den Bootsektor dieser Partition. Da dieser im ersten Block auf der Partition liegt, wird Grub dies mit der Angabe des Offsets +1 kund getan:
Da obiges Verfahren explizit Blocknummern adressiert, wird es auch als Blocklistenadressierung bezeichnet. Sofern bekannt ist, in welchen Blöcken eine Datei gespeichert ist, vermag Grub hierüber jede Datei unabhängig vom Dateisystem zu lesen. Das Adressierungsschema lautet hierbei Offset+Länge, wobei bei fehlendem Offset (wie im Beispiel) implizit 0 angenommen wird. Eine Datei auf der 2.Partition einer ersten Festplatte, die ab Block 100 beginnt und 5 Blöcke umfasst, wäre mit "(hd0,1)100+5 anzugeben. Auch eine über mehrere Bereiche verteilte Datei ließe sich über die Angabe der Blocklisten laden ("(hd0,1)1,100+5,200+28"). Das Bootmenü - etwas BequemlichkeitDas Prinzip des Kernelstarts ist schnell verinnerlicht und dennoch wäre die wiederkehrende Eingabe der Befehlsfolgen ein Argument gegen den Einsatz des Grub. Zwar bietet Grub keinen grafisch ansprechend gestalteten Deckmantel, den neue Lilo-Versionen beherrschen, aber eine komfortable textbasierte Menüsteuerung. Zuständig für die Konfiguration ist die Datei menu.lst (Name ist beliebig), die zweckmäßig im selben Verzeichnis wie die weiteren Grub-Dateien liegt. Wir betrachten im weiteren Text ihre wichtigsten Einträge. Zuvorderst in der Konfigurationsdatei stehen die globalen Optionen. Ein Eintrag zum Start eines Systems beginnt mit dem Schlüsselwort title gefolgt von einem eindeutigen Bezeichner dieses Eintrags. Alle weiteren Befehle bis zur folgenden title-Zeile oder zum Dateiende betreffen den Start dieses Systems. Die grobe Struktur sieht somit wie folgt aus:
Wenn Sie bereits mit Grub gearbeitet haben, so ist Ihnen sicherlich die amerikanische Tastaturbelegung unangenehm aufgestoßen. Glück für denjenigen, der die Lage deren Tasten kennt. Die deutschen Sonderzeichen einmal außen vor gelassen, gestattet der setkey-Befehl der Grubshell die komplette Umgestaltung der Belegung. Sicher artet die Anpassung in reichlich Arbeit aus, aber für die Erstellung der Menüdatei ist diese einmalige Mühe sicher gerechtfertigt. Für jede Taste ist ein eigener setkey-Aufruf erforderlich:
Der erste Wert beschreibt die Belegung, die sich bei amerikanischem Layout hinter einer Taste verbirgt, die »neue Belegung« soll die zukünftige Wirkung sein. Um bspw. die Tasten [z] und [y] zu vertauschen, sind folgende Aufrufe erforderlich:
Versuchen Sie einen solchen Umtausch besser nicht innerhalb der Grubshell, schon mit dem ersten Aufruf im Beispiel stünde die Taste [z] nicht mehr zur Verfügung! Alphanumerische Tasten bezeichnen sich selbst, alle weiteren Sondertasten müssen durch folgende Bezeichner beschrieben werden (in Klammern jeweils die Taste): exclam (!), at (@), numbersign (#), dollar ($), percent (%), caret (^), ampersand (&), asterisk (*), parenleft ((), parenright ()), minus (-), underscore (_), equal (=), plus (+), bracketleft ([), braceleft ({), bracketright (]), braceright (}), semicolon (;), colon (:), quote (`), doublequote ("), backquote (`), tilde (~), backslash (\), bar (|), comma (,), less (<), period (.), greater (>), slash (/), question (?), space ( ). Zu den allgemeinen Befehlen für die Menükonfiguration zählen: timeout Sekunden Zeitspanne, nach der der erste bzw. der default-Eintrag automatisch gestartet wird default Nummer Default-Eintrag, ohne die Angabe wird der erste angenommen (Zählung beginnt bei 0) fallback Nummer Tritt beim Start des default-Eintrags ein Fehler auf, wird dieser Eintrag automatisch gestartet password Passwort [Menüdatei] Ohne Kenntnis des Passworts darf weder der Shellmodus gestartet noch der Menüeintrag eines gesperrten Eintrags (lock, siehe nachfolgend) modifiziert werden. Mit Angabe einer optionalen Menüdatei wird diese neu eingelesen (so könnten bspw. neue Einträge erst nach Eingabe des Passworts sichtbar werden) Im Unterschied zu den bislang genannten Befehlen können die nachfolgenden mehrfach in der Konfigurationsdatei genannt werden. Bis auf title stehen die weiteren Kommandos auch in der Grub-Shell zur Verfügung (Auswahl): color Normalfarbe[Hervorgehoben] Um etwas Farbe ins Menü zu bringen. Jede Farbe wird als Paar »Vordergrund/Hintergrund« angegeben. »Hervorgehoben« bestimmt das Aussehen des selektierten Eintrags. Entfällt die Angabe, wird die Komplementärfarbe zur »Normalfarbe« genommen. Zur Bezeichnung der Farben sollten Sie "help color" in der Grubshell konsultieren. help [Befehl] Gibt eine Kurzhilfe zum Befehl aus. Ohne Angabe des Befehls werden alle möglichen Kommandos aufgelistet initrd Zum Laden einer Ramdisk in den Speicher lock Sichert einen Eintrag durch ein Passwort; nur in Verbindung mit password sinnvoll makeactive Setzt das bootable Flag einer Partition map Zieldevice Quelldevice Mapping des Quelldevices auf das Zieldevice (sinnvoll, um bspw. einem DOS auf der zweiten Partition vorzugaukeln, es sei auf der ersten...) root Partition Gibt die Partition an, auf der sich das zu bootende System befindet. Grub versucht die Partition zu mounten, um die Partitionsgröße festzustellen rootnoverify Partition Gibt die Partition an, auf der sich das zu bootende System befindet. Grub versucht nicht die Partition zu mounten (sinnvoll, wenn die Partition außerhalb des addressierbaren Bereichs liegt 1024-Zylinder-Problem) title Name Leitet einen neuen Menüeintrag ein, der Name erscheint als Balkentext [un]hide Partition (Zurück)Setzen des »hidden«-Flags einer Partition. Somit kann eine Partition vor einem System »versteckt« werden (DOS, Windows) Mit den genannten Befehlen sollte die nachfolgende Beispielkonfiguration leicht nachzuvollziehen sein. Sie bietet 4 Menüeinträge. Zwei dienen dem Start von Systemen, eines der Installation des Grub in den Mbr der ersten Festplatte und der letzte Eintrag demonstriert die Verwendung von Farben:
Nach dem nächsten Booten begrüßt Sie folgendes Menü (die Farben erscheinen erst nach Auswahl des 4. Eintrags. Abbildung 4: Grub-Menü Die mittels »lock« gesperrten Einträge lassen sich erst nach Eingabe von [p] mit anschließendem Passwort wählen. Ebenso besteht dann die Möglichkeit mittels [e] einen Eintrag zu editieren und mittels [c] die Grubshell zu erreichen.
Geschmäcker unterscheiden sich bekanntlich und so wird auch der eine oder andere den Einsatz seines NT Bootmanagers (bzw. Windows2000) zum Starten anderer Betriebssysteme bevorzugen. Auch ist es in manchen Hardware-Konstellationen nahezu unmöglich, ein Windows-Betriebssystems durch einen »Fremdloader« zur Arbeit zu bewegen, womöglich gelingt es jedoch, Linux durch NT zu starten. Eigentlich ist es ganz einfach, dem NT Bootmanager das Linux unterzuschieben, auch wenn die notwendigen Kommandozeilenaufrufe einen Hauch von Kryptografie verbreiten. Ein Linux ohne einen »richtigen« Bootloader zu starten, wird wohl misslingen, aber der Start eines linuxfähigen Bootmanagers vom NT-Tool aus, lässt sich stets erzwingen. Mit der letzten Aussage ist das prinzipielle Vorgehen bereits scharf umrissen:
Anmerkung: Anstatt der Diskette kann im Falle eines FAT-Dateisystems auch direkt von Linux aus auf dieses geschrieben werden. Riskieren Sie aber nicht den schreibenden Zugriff auf ein NTFS-Dateisystem, die unzureichende Implementierung des Treibers (weil Microsoft die Spezifikation nicht veröffentlicht) kann zur Beschädigung der gesamten Windowsinstallation führen! Die Installation eines Linux-Bootloaders wurde in den beiden vorangegangenen Abschnitten besprochen. Wir nehmen für die weiteren Ausführungen an, dass sich das Linux-Rootverzeichnis auf der 3. Partition der ersten IDE-Festplatte befindet. Unter Linux lautet der Name dieser also /dev/hda3. Um eine Datei mit dem Bootsektor zu erzeugen, kann das Kommando lilo ein zweites Mal mit der Option -s und der Zieldatei aufgerufen werden:
Alternativ kann ein Low-Level-Kopierprogramm verwendet werden, das in der Lage ist, auf der Basis von Sektoren und Byteangaben Daten zu vervielfältigen. Unter Linux ist dd das gebräuchliche Kommando:
Erläuterung: Die Quelle »infile« wird mit if=/dev/hda3 spezifiziert. Wohin die Daten kopiert werden sollen, besagt of=/tmp/bootsec.lin (outfile), also in eine Datei mit dem Namen »bootsec.lin« im Verzeichnis /tmp. Als Nächstes muss dd die Größe eines Sektors wissen und da ein jeder Bootsektor 512 Bytes lang ist, teilen wir dies dem Kommando mit bs=512 mit. Letztlich fordert dd die Angabe der Anzahl zu kopierender Sektoren. Wir begnügen uns mit einem count=1. Das Kopieren der Datei auf Diskette kann auf zwei Wegen geschehen. Zum einen durch Mounten der Diskette und anschließendem Kopieren mit cp. Der schnellere Weg geht über die Verwendung der mtools, dessen komplette DOS-Dateikommando-Sammlung sich ähnlich zum Original bedienen lässt. Die uns interessierenden Aufrufe wären:
NT ist anschließend zu starten und die Datei »bootsec.lin« z.B. in dessen Stammlaufwerk C: zu kopieren. Jetzt ist nur noch eine entsprechende Zeile an die Datei »boot.ini« (Achtung: diese ist eine versteckte Datei!) anzufügen, um Linux im Bootmenü von NT erscheinen zu lassen:
Das Verfahren zur Integration von Linux in das Bootkonzept von Windows 2000 erfolgt analog.
Loadlin.exe ist ein DOS-Programm, das es ermöglicht, einen Linuxkernel direkt von einem DOS-System in den Hauptspeicher zu laden. Sein entscheidender Vorteil ist die einfache Administration; eine Beschädigung der Installation, wie sie durch unsachgemäße Konfiguration von bspw. Lilo denkbar ist, ist nahezu ausgeschlossen. Insbesondere der unerfahrene Windows-Umsteiger wird in »loadlin« den Weg des geringsten Widerstands vorfinden. Die Nachteile sind neben einer längeren Ladephase (erst DOS, dann Linux) vor allem in der wenig komfortablen Übergabe von Kernelparametern zu sehen. Bei der nachfolgend skizzierten Verwendung eines Bootmenüs ist eine interaktive Eingabe der Parameter nicht möglich. Ohne Menü artet der Aufruf schnell zu einer langen Eingabezeile aus... VoraussetzungenNeben einer installierten DOS- oder Win9x-Version, benötigen Sie zunächst das Programm loadlin.exe. Den gängigen Distributionen liegt dieses auf den Installationsmedien bei, oft unterhalb eines mit »DOS« oder »DOSUTILS« bezeichneten Verzeichnisses. Wohin Sie dieses installieren, bleibt Ihnen überlassen. Hauptsache, das DOS-System kann die Datei finden und starten. Im Beispiel gehen wir nachfolgend davon aus, dass »loadlin.exe« in einem Verzeichnis »C:\LINUX\« liegt. Des Weiteren müssen Sie den Linuxkernel in ein von DOS erreichbares Verzeichnis kopieren; günstig ist wiederum »C:\LINUX\«. Am schnellsten gelangen Sie zum Ziel, wenn Sie Linux booten (Startdiskette oder Rettungssystem) und den Kernel auf eine DOS-formatierte Diskette kopieren (mcopy). Im DOS-System spielen Sie die Datei von der Diskette in das Verzeichnis. Loadlin verwendenLoadlin.exe kann nur in einer DOS-Box laufen, daher ist im Falle von Win9x zunächt der DOS-Modus zu aktivieren. Der Aufruf besitzt folgendes Format:
Ohne Argumente gerufen, listet loadlin die vollständige Argumentliste auf. Als »Root-Dateisystem« ist die Linux-Notation zu verwenden, also »/dev/hda2« falls dieses in der 2. Partition der ersten IDE-Festplatte residiert. »Boot-Parameter« kann all jene Parameter umfassen, die ein Linuxkernel versteht. Um bspw. den Kernel read-only zu mounten und die VGA-Einstellung »normal« zu wählen, dient folgende Aufrufzeile:
Verwendet der Kernel eine Initiale Ramdisk, so ist diese ebenfalls von Linux nach DOS zu kopieren. Die Anweisung an »loadlin« zum Laden von Kernel und Ramdisk (nennt sich im Beispiel »diskimage«) lautet:
Ein StartmenüEs wäre schon recht umständlich, zum Zwecke des Linuxstarts erst ein Windowssystem vollständig laden zu müssen. Und den rechten Zeitpunkt, abzupassen, um Windows direkt in den DOS-Modus zu versetzen, kommt auch nicht gerade einer komfortablen Lösung gleich. Der Weg zum Ziel führt über Einträge in den Dateien »config.sys« und »autoexec.bat«.
Durch die Marke [menu] wird eine Menüdefinition eingeleitet. Mit [menuitem] erfolgt die Definition der einzelnen Einträge, wobei der erste Wert nach dem Komma den Namen der Marke enthält, an der die Verarbeitung fortgeführt werden soll, dass der Menüpunkt selektiert wurde. Der »Rest« der Zeile wird als Text im Menü angezeigt. [menudefault] markiert einen Eintrag als Voreinstellung; die folgende Zahl bestimmt die Wartezeit (in Sekunden), nach der bei fehlender Eingabe mit dem voreingestellten Menüpunkt fortgefahren wird. Bei Wahl der Marke [Linux] starten wir »loadlin«; bei [Win98] geht es mit dem »normalem« Inhalt der »config.sys« weiter.
In der Datei »autoexec.bat« wird in einem »goto«-Befehl Bezug auf den gewählten Eintrag genommen. Dieselben Namen der Marken erscheinen wieder, nur mit geänderter Syntax. Die Marke :Linux am Ende der Datei garantiert, dass kein weiterer Befehl abgearbeitet wird, während »loadlin« DOS bzw. Windows durch Linux ersetzt. |
||||||||||||||||||||||||||||||||||||||||||||||||||||
Korrekturen, Hinweise? |