Linux LILO mini-HOWTO <author>Cameron Spitzer (<tt/cls@truffula.sj.ca.us/), Alessandro Rubini (<tt/rubini@linux.it/) und Horst Knobloch (<tt/hknobloch@odn.de/) <date>v2.1-2, 9. Januar 1998 <abstract> Diese Dokument beschreibt einige typische LILO-Installationen. Es soll eine zusätzliche Hilfe zum LILO User's Guide sein. Ich glaube, die Beispiele sind informativ, auch bei Konstellationen, die nicht gleich der von mir benutzten sind. Ich hoffe, daß sie helfen, Probleme zu vermeiden. </abstract> <!-- Table of contents --> <toc> <!-- Begin the document --> <sect>Einleitung <p> Trotz der umfassenden Dokumentation, die den LILO Sourcen beiliegt und in <tt>/usr/doc/lilo</tt>-version zu finden ist, bereitet es den meisten Linux Benutzern Probleme ein eigenes <tt>/etc/lilo.conf</tt> File zu erstellen. Dieses Dokument ist gedacht, diese Benutzer zu unterstützen, indem es nur die notwendigsten Informationen erläutert und fünf Beispiel-Installationen zeigt: <itemize> <item>Das erste Beispiel ist die klassische Installation »Linux und anderes Betriebssystem«. <item>Das nächste zeigt wie man Lilo auf einer Festplatte installiert, welche mit <tt>/dev/hdc</tt> angesprochen wird, aber dann als <tt>/dev/hda</tt> booten soll. Dies wird normalerweise benötigt, wenn man Linux von einem laufenden System auf eine neue Platte installiert. <item>Das dritte Beispiel zeigt, wie man Linux bootet, wenn die Root-Partition nicht vom BIOS erreichbar ist. <item>Das nächste Beispiel ist gedacht um den Zugriff auf große Platten zu demonstrieren, auf die weder das BIOS noch DOS einfach zugreifen kann. (Diese Beispiel ist etwas veraltet.) <item>Das letzte Beispiel zeigt, wie man eine beschädigte Platte restauriert (der Schaden wurde durch die Installation eines anderen Betriebssystems verursacht). </itemize> <p> Die letzten drei Beispiele sind von Cameron Spitzer (<tt/cls@truffula.sj.ca.us/), welcher das Originaldokument schrieb. Da ich als der gegenwärtige Kümmerer nichts anderes als Linux benutzte, kann ich diese Beispiele weder prüfen noch anpassen. <sect1>Copyright <p> Dieses Dokument ist urheberrechtlich geschützt. Das Copyright für die englische <em><htmlurl name="LILO mini-HOWTO" url="http://metalab.unc.edu/LDP/HOWTO/mini/LILO.html"></em>, auf der dieses Dokument basiert, liegt bei Cameron Spitzer und Alessandro Rubini. Das Copyright für die deutsche Version liegt bei Horst Knobloch. Das Dokument darf gemäß der GNU <em><htmlurl url="DE-GPL.html" name="General Public License"></em> verbreitet werden. Insbesondere bedeutet dieses, daß der Text sowohl über elektronische wie auch physikalische Medien ohne die Zahlung von Lizenzgebühren verbreitet werden darf, solange dieser Copyright Hinweis nicht entfernt wird. Eine kommerzielle Verbreitung ist erlaubt und ausdrücklich erwünscht. Bei einer Publikation in Papierform ist das Deutsche Linux HOWTO Projekt hierüber zu zu informieren. <sect>Hintergrund Information und Standard Installation <p> Wenn Lilo das System bootet, kann er nur die Daten-Sektoren laden, die über das BIOS erreichbar sind. Jeder Pfadname in <tt>/etc/lilo.conf</tt> wird zum Installationszeitpunkt ausgewertet, d.h. beim Aufruf von <tt/lilo/. Dies ist auch der Zeitpunkt, bei dem das Programm die Zuordnungs-Tabelle (map) erstellt. Diese Tabelle gibt an, welche Sektoren von den Dateien benutzt werden. Daraus folgt als Konsequenz, daß die Dateien in einer Partition liegen müssen, welche über das BIOS ansprechbar ist. Außerdem muß jedesmal der Lader neu-installiert werden (d.h. Aufruf von <tt/lilo/), sobald man die Files ändert. Nach jeder Kernel-Kompilierung und erfolgreicher Installation ist auch Lilo neu zu installieren. <sect1>Wohin Lilo installieren? <p> Die <tt/boot =/ Anweisung in <tt>/etc/lilo.conf</tt> sagt dem Lilo, wohin er den Haupt-Boot-Lader zu installieren hat. Im allgemeinen kann man den Master-Boot-Record (z.B. <tt>/dev/hda</tt>) oder die Root-Partition der Linux Installation angeben (z.B. <tt>/dev/hda1</tt> oder <tt>/dev/hda2</tt>). <p> Wenn ein anderes Betriebssystem auf der Platte installiert ist, sollte man Lilo besser in der Root-Partition unterbringen. In diesem Fall ist diese Partition als »bootable« (bootbar) zu markieren. Das erreicht man mit dem »a« Kommando von <tt>fdisk</tt> oder mit dem »b« Kommando von <tt>cfdisk</tt>. Es ist einfacher Lilo und Linux (bei Bedarf) zu entfernen, wenn Lilo nicht im <em>Master Boot Record</em> (MBR) installiert wird. <sect1>Wie IDE-Platten konfigurieren? <p> Da ich nur Linux benutze, benötige ich die LBA- oder LARGE-Einstellung im BIOS nicht. Diese Einstellungen sind fürchterliche Krücken um Design-Schwächen der PCs zu umgehen. Diese fordern, daß der Kernel in den ersten 1024 Zylindern liegen muß; das ist kein Problem, so lange man seine Platte partitioniert und die Root-Partition klein hält. (Dies sollte man sowieso immer beachten) <p> Wenn auf der Platte aber schon ein anderes Betriebssystem installiert ist, kann es unter Umständen unmöglich sein, die BIOS-Einstellungen zu modifizieren, da sonst das alte System nicht mehr lauffähig wäre. Alle neueren Lilo-Distributionen sind jedoch fähig, mit den Einstellungen für LBA- und LARGE-Disk umzugehen. <p> Die Festplatten, die auschließlich unter Linux benutzt werden und von denen auch nicht gebootet wird, können aus dem BIOS ausgetragen werden. Dadurch bootet das System schneller und Linux erkennt diese Platten später trotzdem automatisch und ohne Zeitverlust. Ich schließe z.B. öfter zusätzlich Festplatten an meinen Rechner an, ohne die BIOS-Einstellung zu verändern. <sect1>Wie beim Booten eingreifen? <p> Wenn der Lilo-Prompt erscheint, ist es durch Drücken der <Tab> Taste möglich eine Auswahlliste anzuzeigen. Sollte Lilo dafür nicht konfiguriert sein, so hilft das Drücken und Halten der <Alt> oder <Shift> Taste bevor »LILO« angezeigt wird. <p> Wenn man einen Kernel zum Booten auswählt, kann man nach dem ausgewählten Kernelnamen noch zusätzliche Kommandozeilen-Parameter angeben. Der Kernel akzeptiert umfangreiche Kommandozeilen-Parameter; dies ist aber nicht der richtige Ort, um sie alle aufzulisten. Einige sind aber meiner Meinung nach interessant: <descrip> <tag><tt/root=/</tag> diese Partition soll als root gemountet werden, sie kann unterschiedlich sein zu dem Eintrag in <tt/lilo.conf/. Zum Beispiel, habe ich eine kleine Parition mit einem Minimal-Linux, die es mir ermöglicht das System zu booten, sollte durch einen Fehler meine Root-Partition zerstört werden. <tag><tt/init=/</tag> Version 1.3.43 und neuere Linux-Kernel akzeptieren das Ausführen von anderen Programmen als <tt>/sbin/init</tt>. Wenn beim Booten kritische Probleme auftreten, ist es durch <tt>init=/bin/sh</tt> möglich ein spartanisches System zu starten. Nach Erscheinen des Shell-Prompts ist es in den meisten Fällen nötig, erstmal die Partitionen zu mounten: <tscreen>/sbin/mount -w -n -o remount /; mount -a</tscreen> Vor dem Ausschalten des Computers nicht vergessen, <tscreen>/sbin/umount -a</tscreen> aufzurufen. <tag>eine Nummer</tag> eine Nummer in der Kernel-Kommandozeile veranlaßt <em>init</em> den gewünschten <em>Run-Level</em> einzunehmen. Der Default ist normalerweise 3. Bitte genaueres in der Dokumentation zu <em>init</em>, <tt>/etc/inittab</tt> und <tt>/etc/rc.d</tt> nachlesen. </descrip> <sect1>Wie Lilo entfernen? <p> Wenn Lilo einen Boot-Sektor überschreibt, sichert er ihn in <tt>/boot/boot.</tt><em/xxyy/. Dabei ist <em/xxyy/ die Major- und Minor-Device-Nummer in Hexadezimal. <tscreen>ls -l /dev/<em/device/</tscreen> zeigt einem die Major- und Minor-Nummern an. Zum Beispiel, der erste Sektor von <tt>/dev/hda</tt> (Major 3, Minor 0) wird in <tt>/boot/boot.0300</tt> gespeichert; installiert man Lilo auf <tt>/dev/fd0</tt> wird ein <tt>/boot/boot.0200</tt> angelegt; die Installation von Lilo auf <tt>/dev/sdb3</tt> (Major 8, Minor 19) sichert eine Kopie in <tt>/boot/boot.0819</tt>. <bf>Achtung:</bf> Sollte ein solches File schon existieren, wird von Lilo keine Kopie generiert. Darüber muß man sich bei der Installation von Lilo, z.B. nach einer Kernel-Kompilierung, aber nicht sorgen. <p> Sollte man in die Verlegenheit geraten, Lilo entfernen zu müssen, z.B. bei der De-Installation von Linux, braucht nur der ursprüngliche Boot-Sektor wieder hergestellt werden. Ist Lilo in <tt>/dev/hda</tt> installiert, genügt es, <tscreen>dd if=/boot/boot.0300 of=/dev/hda bs=446 count=1</tscreen> aufzurufen. Ich benutze einfach: <tscreen>cat /boot/boot.0300 > /dev/hda</tscreen> Dies ist aber nicht ganz sicher, da auch die ursprüngliche Partitionstabelle mitrestauriert wird; diese könnte aber in der Zwischenzeit geändert worden sein. Diese Kommando ist aber viel einfacher zu handhaben als ein <tt>fdisk /mbr</tt> in einer DOS shell, denn es erlaubt einem, sauber Linux von der Platte zu entfernen, ohne ein anderes Betriebssystem zu benötigen. Nachdem Entfernen von Lilo sollte man nicht vergessen, mit dem Linux <em>fdisk</em> alle Linux-Partitionen zu löschen, da es mit dem DOS <em>fdisk</em> nicht möglich ist diese zu löschen. <p> Ist Lilo auf der Root-Partition installiert, z.B. auf <tt>/dev/hda2</tt>, so ist keinerlei Aktion notwendig, um Lilo zu de-installieren. Nur das Linux <em>fdisk</em> aufrufen und alle Linux-Partitionen aus der Paritionstabelle entfernen. Nicht vergessen, die DOS-Partition als Boot-Partition zu markieren. <sect>Die einfache Konfiguration <p> Die meisten Lilo Installationen benutzen eine Konfigurationsdatei wie die folgende: <tscreen><verb> boot = /dev/hda # oder die Root-Partition, z.B. /dev/hda2 delay = 0 # oder eine Verzögerung in Zehntel-Sekunden vga = 0 # optional, "vga=1" angeben um 80x50 zu erhalten image = /boot/vmlinux # das zImage File (= Kernel) root = /dev/hda1 # die Root-Partition label = Linux # oder ein anderer, mehr ausgefallener Name read-only # mounte Root-Partition nur-lesbar other = /dev/hda4 # die DOS-Partition, so vorhanden table = /dev/hda # die aktuelle Partitionstabelle label = dos # oder ein anderer Name </verb></tscreen> <p> Es sind mehrere <tt/image/ und <tt/other/ Abschnitte möglich. Es ist nicht unüblich, mehrere Kernel-Images in <tt>lilo.conf</tt> zu konfigurieren; zumindest wenn man mit der Kernel-Entwicklung schritthalten will. <sect>Installieren auf <tt/hdc/ und Booten von <tt/hda/ <p> Lilo erlaubt es, den Kernel von einer Platte zu mappen und dann das BIOS anzuweisen, ihn von einer anderen Platte zu booten. Z.B. ist es für mich normal, Linux auf einer Platte zu installieren, welche sich unter <tt/hdc/ (Master Disk des 2. Kontrollers) befindet, um sie später als Boot-Platte am 1. IDE-Kontroller eines anderen Nur-Linux-Rechners zu benutzen. Ich kopiere dazu die Installations-Diskette auf eine kleine Partition, die ich dann in einer Virtual-Konsole mit <em>chroot</em> zur Root-Partition mache. Damit kann ich <tt/hdc/ einrichten und während der Installation das System für etwas anderes benutzen. <p> Die Datei <tt>lilo.conf</tt>,die ich dafür benutze, sieht wie folgt aus: <tscreen><verb> # Dieses File muß von einem Sys. benutzt werden, welches von # /dev/hdc läuft boot = /dev/hdc # überschreibe MBR von hdc disk = /dev/hdc # definiere wie hdc dann aussieht: bios = 0x80 # das BIOS wird sie dann als erste Platte erkennen delay = 0 vga = 0 image = /boot/vmlinux # Pfad des Kernels auf der Root-Partition /dev/hdc1 root = /dev/hda1 # hdc1 wird beim Booten hda1 label = Linux read-only </verb></tscreen> <p> Dieses Konfigurationsdatei muß von Lilo verarbeitet werden, welcher <bf>von /dev/hdc1</bf> gestartet wurde. Die Lilo Zuordnungstabelle (map), die in den Boot-Sektor <tt>/dev/hdc</tt> geschrieben wird, muß die Dateien <tt/vmlinux/ und <tt>/boot/boot.b </tt> des Boot-Zeitpunkts referenzieren, d.h. jene von <tt/hdc/. <p> Ich nenne diese Konfigurationsdatei <tt>/mnt/etc/lilo.conf.hdc</tt>. Damit installiere ich Lilo durch den Aufruf <tscreen>cd /mnt; chroot . sbin/lilo -C /etc/lilo.conf.hdc</tscreen> während <tt>/dev/hdc1</tt> unter <tt>/mnt</tt> gemountet ist. <sect>BIOS erkennt Root-Partition nicht <p> Ich habe zwei IDE- und eine SCSI-Platte. Dabei wird die SCSI-Platte nicht vom BIOS erkannt. Der Linux-Lader (LILO) benutzt BIOS-Aufrufe und kann deshalb nur Platten erkennen, die auch das BIOS erkennt. Das dumme AMI BIOS bootet leider nur von »A:« oder »C:«. Mein Root-Dateisystem ist aber auf einer Partition des SCSI-Laufwerks. <p> Die Lösung ist, den Kernel, die Map-Datei, und den <em/Chain-Loader/ in eine Linux-Partition auf der ersten IDE-Platte zu installieren. Es sei darauf hingewiesen, daß es nicht notwendig ist, den Kernel auf der Root-Partition zu haben. <p> Die zweite Partition meiner ersten IDE-Platte (<tt>/dev/hda2</tt>, die Linux-Partition zum Booten) ist unter <tt>/u2</tt> gemountet. Hier kommt die <tt>/etc/lilo.conf</tt>, welche ich dafür benutze: <tscreen><verb> # Installiere LILO in den »Master Boot Record« # auf der erste IDE-Platte boot = /dev/hda # /sbin/lilo (der Installierer) kopiert LILOs Boot Record # vom folgenden File in den MBR install = /u2/etc/lilo/boot.b # Ich schrieb mir ein ausführliches Boot-Menü. LILO findet es unter message = /u2/etc/lilo/message # Der Installierer generiert das folgende File, welches dem # Boot-Lader sagt wo die Blöcke des Kernels sind. map = /u2/etc/lilo/map compact prompt # Warte 10 Sekunden, boote dann den 1.2.1 Kernel als Standard timeout = 100 # Der Kernel wird dort installiert wo ihn das BIOS sehen kann, durch: # cp -p /usr/src/linux/arch/i386/boot/zImage /u2/z1.2.1 image = /u2/z1.2.1 label = 1.2.1 # LILO sagt dem Kernel, dass die erste SCSI-Partition als Root # gemountet werden soll. Das BIOS braucht diese Partition nicht # zu erkennen. root = /dev/sda1 # Diese Partition wird geprüft und nochmal gemountet durch /etc/rc.d/rc.S read-only # Ich behalte einen alten Slackware Kernel für den Fall, daß ich einen # Kernel generierte habe, welcher nicht funktioniert. (Ich brauchte ihn # tatsächlich schon einmal) image = /u2/z1.0.9 label = 1.0.9 root = /dev/sda1 read-only # Meine DR-DOS 6 Partition other = /dev/hda1 loader=/u2/etc/lilo/chain.b label = dos alias = m </verb></tscreen> <sect>BIOS Probleme mit großen Platten <p> Das System in meinem Büro hat eine 1GB IDE-Platte. Das BIOS erkennt nur die ersten 504MB dieser IDE-Platte (1MB bedeutet 2**10 bytes, nicht 10**6 bytes). Deswegen habe ich MS-DOS auf einer 350MB Partition <tt>/dev/hda1</tt> und meine Linux Root-Partition auf einer 120MB Partition <tt>/dev/hda2</tt>. <p> MS-DOS war nicht in der Lage, sich auf der neuen Platte selbst zu installieren. Novell DOS 7 hatte die gleichen Probleme. Glücklicherweise vergaß »Options by IBM« die »OnTrack« Diskette dem Packet mit der Platte beizulegen. Die Platte sollte mit dem »OnTrack Disk Manager« Programm ausgeliefert werden, die für ein Nur-DOS-System, soviel ich weiß, auch benutzt werden muß. <p> Ich erstellte aber eine Partitionstabelle mit fdisk von Linux. MS-DOS 6.2 verweigerte aber die Installation auf <tt>/dev/hda1</tt>. Die Fehlermeldung lautete ungefähr so: »Diese Version von MS-DOS ist für Neu-Installationen. Ihr Computer hat aber schon ein MS-DOS installiert, deshalb benötigen Sie eine Upgrade-Version von Ihrem Händler.« Dabei war die Platte aber brandneu. <p> So ein Blödsinn! Ich startete also das Linux fdisk erneut und löschte Partition 1 aus der Tabelle. Das stellte MS-DOS 6.2 zufrieden. Es kreierte anschließend die exakt gleiche Partition 1, welche ich gerade gelöschte hatte und konnte sich darauf installieren. MS-DOS 6.2 schrieb zwar seinen <em/Master Boot Record/ auf die Platte, aber konnte trotzdem nicht starten. <p> Glücklicherweise hatte ich noch einen Slackware Kernel auf einer Diskette, welche von dem Slackware Installationsprogramm <tt/setup/ erstellt wurde. Mit diesem Kernel bootete ich dann Linux und überschrieb den defekten MBR von MS-DOS mit LILO. Das funktionierte endlich. Hier ist die <tt>/etc/lilo.conf</tt> Datei, die ich benutzte: <tscreen><verb> boot = /dev/hda map = /lilo-map delay = 100 ramdisk = 0 # schaltet ramdisk im Slackware Kernel aus timeout = 100 prompt disk = /dev/hda # BIOS sieht nur die ersten 500 MB. bios = 0x80 # gibt an, daß die erste IDE-Platte benutzt wird sectors = 63 # die Geometriedaten aus der HD Dokumentation heads = 16 cylinders = 2100 image = /vmlinuz append = "hd=2100,16,63" root = /dev/hda2 label = linux read-only vga = extended other = /dev/hda1 label = msdos table = /dev/hda loader = /boot/chain.b </verb></tscreen> <p> Danach installierte ich diese Partitionen und überprüfte, daß die Partition mit dem zImage, boot.b, map, chain.b und den message Files, ein MSDOS-Dateisystem benutzen konnte, wenn dieses nicht mit »Stacker« oder »Doublespace« behandelt war. So konnte ich dann DOS von der 500MB Partition <tt>/dev/hda1</tt> booten. <p> Ich habe auch gelernt, daß »OnTrack« eine um ein paar Bytes versetzte Partitionstabelle geschrieben hätte. Es ist zwar möglich den Linux IDE Treiber zu ändern, damit er diese erkennt, aber die Installation wäre unmöglich mit dem kompilierten Slackware Kernel. Schließlich erhielt ich doch noch die »OnTrack« Diskette. Ich rief OnTracks Technischen Support an, welcher mir erzählte, daß Linux fehlerhaft sei, da es nicht das BIOS benutzt. Ich habe ihre Diskette dann verschenkt. <sect>Booten von einer Notfall-Diskette <p> Als nächstes installierte ich Windows95 auf meinem Büro-Rechner. Es zerstörte meinen LILO-MBR, aber ließ meine Linux-Partitionen unverändert. Da es lange dauert einen Kernel von der Diskette zu booten, installierte ich mir LILO auf einer Diskette, um damit den Kernel von IDE zu booten. Ich erstellte die LILO-Diskette wie folgt: <tscreen><verb> fdformat /dev/fd0H1440 # formatiere eine neue Diskette mkfs -t minix /dev/fd0 1440 # erstelle ein minix Dateisystem mount /dev/fd0 /mnt # mounte Disk unter Standard Mount-Verzeichnis cp -p /boot/chain.b /mnt # Kopiere den chain loader lilo -C /etc/lilo.flop # installiere LILO und map auf Diskette umount /mnt </verb></tscreen> <p> <em/Bitte beachten:/ die Diskette <bf>muß gemountet sein, wenn der Installierer gestartet wird</bf>, damit Lilo sein map-File richtig schreiben kann. <P> Diese Datei nannte ich <tt>/etc/lilo.flop</tt> und sie stimmt mit der letzten fast überein: <tscreen><verb> # Erstelle Diskette, die den Kernel von HD bootet boot = /dev/fd0 map = /mnt/lilo-map delay = 100 ramdisk = 0 timeout = 100 prompt disk = /dev/hda # 1 GB IDE, BIOS sieht nur die ersten 500MB bios=0x80 sectors = 63 heads = 16 cylinders = 2100 image = /vmlinuz append = "hd=2100,16,63" root = /dev/hda2 label = linux read-only vga = extended other = /dev/hda1 label = msdos table = /dev/hda loader = /mnt/chain.b </verb></tscreen> <p> Schließlich brauchte ich noch MS-DOS 6.2 auf meinem Büro-Rechner; allerdings wollte ich nicht die erste Platte anrühren. Ich kaufte mir einen SCSI-Controller und eine SCSI-Platte, erstellte darauf mit dem Linux mkdosfs ein MS-DOS Dateisystem, das Windows-95 als »D:« sieht. Natürlich bootet MSDOS nicht von »D:«, das ist aber mit LILO kein Problem. Ich fügte folgendes zu der <tt>lilo.conf</tt> aus Beispiel 2: <tscreen><verb> other = /dev/sda1 label = d6.2 table = /dev/sda loader = /boot/any_d.b </verb></tscreen> Mit dieser Ergänzung läuft MS-DOS 6.2. MS-DOS glaubt, es befindet sich auf »C:« und Windows-95 ist auf »D:«. </article>