Next Previous Contents

19. Kernel kompilieren

Das Kompilieren des Kernels ist eine recht einfache Angelegenheit, allerdings ist die Konfiguration des Kernels etwas zeitraubend. Wechseln Sie in das Verzeichnis /usr/src/. Hierin befindet sich oft ein vorinstallierter Kernel, den wir nicht überschreiben möchten. Daher wird das Verzeichnis oder der Link linux in linux2.2.9 o.ä. umbenannt (www:[src]# mv linux linux2.2.9). Falls sich dort noch kein Kernel befindet, dann müssen Sie zuerst einen installieren. Tippen Sie cdrom ein. Nun wird das CDROM Laufwerk, von welchem Sie die Software installiert haben, in das Verzeichnis /mnt/cdrom eingeblendet. Wechseln Sie in das Verzeichnis /mnt/cdrom/RedHat/RPMS. Mit rpm -i kernel-source-2.2.9-17.i386.rpm o.ä. (Tab-Taste, Komplettierungsmodus der Shell nicht vergessen....) installieren Sie dann den neuen Kernel. Wechseln Sie mit cd - in Ihr vorhergehendes Verzeichnis (/usr/src). Sie sehen (ls -la), daß nun ein Verzeichnis linux-2.2.9 mit einem Link linux auf dieses Verzeichnis angelegt worden ist. Wechseln Sie in das Verzeichnis linux. Nun müssen Sie den Kernel konfigurieren. Falls Sie sich in der KDE Benutzeroberfläche befinden, tippen Sie make xconfig ein. Falls Sie sich in einer Telnet-Shell über das Netzwerk (remote) eingeloggt haben, dann tippen Sie nun make menuconfig ein. Es könnt in Ausnahmefällen sein, daß hier Command not found erscheint. In diesem Falle müssen Sie, ähnlich wie zuvor, das Paket make-3.77-6.i386.rpm (o.ä.) nachinstallieren.

Nun müssen Sie sich durch alle Menü's durchhangeln. Falls Sie nicht wissen, wofür die eine oder andere Option ist, klicken Sie das Help Menü an. Für Fragen nach speziellen Firewall und Netzwerk-Optionen empfehle ich das Firewall-Handbuch unter http://www.little-idiot.de/firewall/. Dort sind alle Parameter genauestens beschrieben. Vielleicht sollten Sie auch noch einige Faustregeln beachten:

Nun können Sie den Kernel kompilieren:

make dep; make bzImage; make modules; make modules_install

Vielleicht noch etwas Erklärung zu den Kommandos: make dep prüft innerhalb des Quellcodes von LINUX, welche Code-Teile entsprechend der Treiberauswahl umgeändert werden müssen. Hier werden Kompiler-Optionen für die betroffenen Module gesetzt. Danach erst kann der Kernel kompiliert werden. Da der Kernel inzwischen recht groß ist, wird er komprimiert und mit einem Selbst-Extraktor versehen, ähnlich PKSFX von PKWARE. Das verwendete Kompressionsformat ist bzip2, früher wurde nur gzip verwendet. bzip2 komprimiert nochmals 20-30% besser, als andere Kompressoren. Danach werden alle Module kompiliert und anschließend in die zugehörigen Verzeichnisse auf der Festplatte geschrieben. Das Verzeichnis, in welchem sich alle nachladbaren Module befinden, ist /usr/lib/modules/2.2.13/.... Mit den Kommando's: lsmod, insmod, modprobe, rmmod können Sie im laufenden Betrieb Module nachladen, entfernen, u.s.w. Das ist natürlich recht praktisch, da man sogar einzelne, fehlerhafte Treiber austauschen kann, ohne daß LINUX neu gebootet werden muß. Dieses Konzept wurde von IBM AIX übernommen.

Nun geht es darum, den Kernel zuerst zu testen. Es exisitert ein Verzeichnis /boot auf der Festplatte, in welchem sich die Kernel, die System.map Dateien für die Kernel und ein paar kleinere Dateien befinden. Uns interessieren nur die System.map-2.2.x Dateien und der LINUX Kernel. Nach dem Kompilation befindet sich der neue Kernel noch im Verzeichnis /usr/src/linux/arch/i386/boot/ und nennt sich noch bzImage. Kopieren Sie nun diesen Kernel in Verzeichnis /boot:

www:[linux]# mv /usr/src/linux/arch/i386/boot/bzImage /boot/linux.neu

Wir haben die Datei bzImage beim Verschieben gleichzeitig noch umbenannt.

Nun möchten wir, daß der Bootmanager LILO (LInux LOader) auch den zweiten Kernel beim Booten als Alternative anbietet, da es ja sein könnte, daß der neue Kernel nicht funktioniert. Die Konfigurationsdatei hierzu ist /etc/lilo.conf:

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
image=/boot/vmlinuz-2.2.9-17
        label=linux
        root=/dev/hda1
        read-only

image=/boot/linux.neu
        label=linux2
        root=/dev/hda1
        read-only
Wie man sehen kann, kann man alle Einträge des originalen Kernels einfach hinten anhängen. Der erste Kernel wird dann automatisch gebootet, der zweite Kernel erscheint beim Booten zur Auswahl, wenn man die TAB-Taste beim Erscheinen von LILO: drückt. Hierzu hat man dann 50 zehntel Sekunden Zeit.

Nun ist es so, daß LILO ein kleines Progrämmchen von 1500 Byte ist, welches in den Master Boot Record (MBR) genau hinein paßt. Es ist ein Meisterstück an Assembler-Programmierung, daher ist es so kurz. Beim Booten interessiert LILO weder Festplatte, noch Partitionierung o.ä., sondern nur die absolute Position des Kernels auf der Festplatte. Diese Infomation hat LILO bis zum jetzigen Zeitpunkt noch nicht. Es muß also ein Programm geben, welches diese absolute Position ermittelt und diese in den MBR zu LILO hinzuschreibt. Das machen wir mit dem Programm lilo. Tippen Sie einfach lilo in der Shell als Root ein - fertig. LILO ist nun darüber informiert, wo es die Kernel finden kann:

www:[RPMS]# lilo
Added linux *
Added linux2
www:[RPMS]#                     

Der * besagt, daß vorrangig, d.h. wenn man nicht TAB drückt, der erste Kernel gebootet wird. Drückt man beim Booten die TAB - Taste, dann muß man linux2 und ENTER eintippen, damit LINUX mit dem 2. Kernel bootet.

Nun müssen wir uns noch um die Datei System.map-2.2.13 (o.ä.) kümmern. Diese Datei enthält die absoluten Einsprungadressen der Kernel-Routinen. Wird z.B. eine Datei geöffnet, dann muß ein Unterprogramm im Kernel aufgerufen werden. Dieses Unterprogramm steht an einer bestimmten Stelle im Kernel. Wo - das steht in dieser Tabelle. Sie ist also absolut unentbehrlich. Sie steht nach der Kompilation in dem Verzeichnis /usr/src/linux/ und heißt einfach nur System.map. Wir müssen diese in das Verzeichnis /boot/ hinein kopieren und umbenennen. Es wird die Kernel Versionsnummer angehängt. In unsererm Falle müssen wir diese dann so kopieren:

www:[linux]# mv /usr/src/linux/System.map /boot/System.map-2.2.13
www:[linux]#  

Testen Sie einfach mal neuere Kernel, die Sie sich von dem WWW-Server: http://www.kernel.org geladen haben.

19.1 Patchen des Kernels

Einen Kernel sollte man dann updaten (patchen), wenn es wichtige Fehler zu korrigieren gilt. In demselben Verzeichnis, in dem sich auch die neuen Kernel befinden, gibt es auch die Patches. Diese müssen unbedingt in der richtigen Reihenfolge aufgespielt werden. Besitzen Sie z.B. die Kernel-Version 2.2.9-17, dann ist ein Patchen nicht möglich. Patches beziehen sich immer auf die "reinen" Kernel, und nicht auf halb korrigierte Versionen. In diesem Falle müssen Sie dann ins saure Gras beißen, und den aktuellsten Kernel mit inzwischen ca. 14 MByte aus dem Internet laden. Diese Kernel sind nicht im RPM Format, sondern im Format .tar.gz oder .tar.bz2. Kopieren Sie den Kernel oder Patch in das Verzeichnis /usr/src/ hinein. Mit dem Kommando tar -xzvf linux-2.2.14.tar.bz2 entpacken Sie nun den Kernel in sein Verzeichnis. Im allgemeinen wird der Link linux auf das Verzeichnis des neuen Kernels gesetzt, falls nicht, dann geben Sie ln -s linux-2.2.14 linux ein. Sie können dann den Kernel wie schon beschrieben, kompilieren. Ein Patch liegt als komprimierter ASCII File vor, falls Sie sich nicht sicher sind, mit file Dateiname können Sie das Format in Erfahrung bringen. Mit gunzip patch-x.x.x.gz entpacken Sie die Patch-Datei und mit patch -p0 < patch-x.x.x wenden Sie die Korrekturen auf Ihren Kernel an. Halten Sie dabei immer die Reihenfolge genau ein. Besitzen Sie einen Kernel 2.2.14, dann müssen Sie mit dem Patch patch-2.2.15 angefangen bis zum aktuellsten Patch alle der Reihenfolge nach aufspielen.

19.2 Bootdisk erstellen

Eine Bootdisk kommt in zwei Fällen zum Einsatz. Der eine Fall tritt dann auf, wenn das LINUX Basissystem sich in einer Partition befindet, die entweder oberhalb von 1024 Zylindern beginnt, oder die über die 1024 Zylinder hinausragt. Im ersten Fall ist es nicht mehr mögich, den Kernel zu booten, in zweiten Fall kann es nach einem Kernel-Update zu dem Problem führen, daß der vorige Kernel sich zwar noch unterhalb der 1024 Zylinder befand, der neue jedoch oberhalb abgelegt wurde. In diesem Falle läßt sich das System nur noch über Floppy booten.

Vielleicht erst einmal etwas Theorie zum Bootvorgang von LINUX. Im Kapitel Kernel kompilieren ist genauer beschrieben, wie Sie einen neuen Kernel erstellen, und den Bootmanager LILO so konfigurieren, daß Sie zwischen mehreren Kerneln auswählen können. Für den Fall, daß z.B. der neue Kernel nicht korrekt funktioniert, kann mit dem alten Kernel noch gebootet werden.

Erstellen Sie eine Bootdisk wie folgt. Legen Sie eine fehlerfreie, frisch formatierte Diskette ein, und geben Sie ein: dd if=/boot/vmlinuz-2.2.x of=/dev/fd0. Fertig. Nach der Umstellung Ihres BIOS auf A:C: können Sie nun über Diskette booten.

19.3 Der Bootvorgang von LINUX

Hier möchten wir nun einmal die verschiedenen Bootvorgänge von LINUX vorstellen, zunächst den Bootvorgang über Diskette:

Eine LINUX Bootdisk besteht aus nichts weiter, als dem Kernel selber. Dieser ist komprimiert und mit einem Selbstextraktor versehen. Bootet der Kernel nun über Diskette, wird das Image (bzImage) in das RAM geladen, und der Entpacker wird gestartet. Der eigentliche Kernel wird im RAM installiert, und das Image wieder aus dem RAM entfernt. Da ein LINUX Kernel schon die wichtigsten Festplattentreiber kennt, durchsucht er den Master Boot Record nach den Partitionsdaten der Festplatte. Sobald er eine aktive Partition gefunden hat, welche die Kennung 82 (LINUX ext2 FS) trägt, bootet er diese Partition, indem er das Filesystem einbindet, also mountet. Danach sucht der Kernel in der ersten FAT (File Allocation Table, UNIX hat mehrere) nach der Datei /etc/inittab. Dort in der Liste stehen dann alle Skripte und Programme, die entsprechend dem Runlevel gestartet werden müssen. Die Zeile id:3:initdefault: startet alle Skripte, in deren 2. Spalte, also nach dem ersten Doppelpunkt, die Zahl 3 enthalten ist. Dieses wird als Runlevel 3 bezeichnet.

Während der Kernel immer aktiv bleibt, kann man unter UNIX die Konfiguration, sprich die Runlevel zu jeder Zeit als Systemadminitrator mit z.B. init 2 oder einer anderen Zahl verändern. Das Kommando init 0 fährt das System herunter, sodaß man den Server ausschalten kann. Alternativ reicht auch STRG-ALT-ENTF. Die Zeile ca::ctrlaltdel:/sbin/shutdown -t3 -r now in ter Datei /etc/inittab ist hierfür verantwortlich. Möchte Sie z.B. daß niemand im Vorbeigehen das System neu booten können soll, dann fügen Sie ein # zu Beginn der Zeile ein.

Im Gegensatz zum Bootvorgang über Floppy ist es beim Booten über Festplatte nicht möglich, daß der rohe Kernel einfach auf die Festplatte geschrieben wird, da zu Beginn auf der Festplatte sich Partitionierungsdaten befinden, die auf einer Floppy natürlich fehlen (aber auch das geht unter LINUX).

Der LILO (LInux LOader) ist ein kleines Stück Assembler - Programm von ca. 1500 Byte, welches genau in einen freien Raum des MBR (Master Boot Record) des Festplatte paßt. LILO ermöglicht es, zwischen mehreren Kerneln und Beriebssystemen zu wählen. Bei der Konfiguration von LILO wurde LILO an einer definierten Stelle im MBR mitgeteilt, an welcher Stelle auf der Festplatte sich die Kernel befinden. Also z.B. Zylinder 8, Kopf 15, Sektor 54. Die Formatierung einer Festplatte ist hierbei völlig ohne Belang, sofern die Kernel unter 1024 Zylinder liegen. Mit dieser Information kann LILO beliebige Betriebssysteme booten.

Danach folgt das übliche Entpacken des Kernels und die Suche nach der Datei /etc/inittab.

Booten über CDROM erfolgt genau nach demselben Schema, nur das das BIOS hierfür umgestellt werden muß. LILO befindet sich dann einfach nur im MBR der CDROM.


Next Previous Contents