Linux NetMag #4
Titel: Kernel selbstgemacht
URL: http://www.linuxnetmag.de/de/issue4/m4kernel1.html

Info Kernel kompilieren ist für alte Linux-Hasen ganz normal. Um auch die letzten Ressourcen aus seinem System zu hohlen, wird ständig der neueste Kernel installiert.
Für Anfänger ist es zumeist ein Schock, daß man das eigenen Betriebssystem aus dem Quellcode heraus erzeugen soll. Denn wer mußte jemals schon mal sein Windows kompilieren?


Autor: Jens Benecke

Die Kurzfassung
Als root nach `/usr/src/linux' wechseln und make menuconfig eingeben. Alles weitere ist selbsterklärend.

Anmerkung: Falls irgendwo X11 läuft, ist auch make xconfig möglich -- dann kann man sich den Kernel zusammenklicken. Gegebenenfalls muß man vorher noch mit xhost +localhost dem root-Benutzer erlauben, auf deine X-Session zuzugreifen, falls Du nicht als root X gestartet hast (und das ist unbedingt zu vermeiden, es öffnet nämlich einige Sicherheitslücken).

Stattdessen kann man auch einfach die `.Xauthority' des Users, der X gestartet hat (d.h. dem die X Sitzung "gehört") in das Verzeichnis des Users kopieren, der darauf zugreifen kann -- hier root.

Das erste Mal könnte es etwas länger dauern, bis man etwas auf dem Bildschirm sieht -- das Konfigurationsprogramm für den Kernel wird nämlich auch als Quellcode geliefert und muß zuerst kompiliert werden.

längere Fassung

Grundregel für den Kernel: Alles, was nicht unbedingt zum Booten benötigt wird, gehört nicht in den Kernel, sondern wird als Modul kompiliert. Eine Ausnahme sollte nur dann gemacht werden, wenn man irgendwas "dediziertes" (wie einen stand-alone Firewall, einen Router, o.ä.) bauen will, auf dem keine Anwendersoftware und kaum Hardware läuft.

Aber es gibt für alles Ausnahmen. Wenn etwas als Modul nicht funktioniert, kann es durchaus sein, daß der Programmierer geschlampt hat und es fest einkompiliert problemlos geht oder umgekehrt.

Bitte lesen Sie auf jeden Fall die Hilfe zu jedem Punkt, den man an- oder abwählt!
Der Kernel kommt normalerweise mit einer vernünftigen Standard-Vorkonfiguration, die man zwar auf seine Bedürfnisse anpassen kann, aber mit dem Gedanken
"Das hört sich cool an, das probier ich"
fängt man sich sehr schnell Probleme ein. Außerdem gilt wie immer, Dokumentation lesen lohnt sich u.U. sehr, wenn man etwas für trockenen Humor übrig hat ...

Standardeinstellungen
Man sollte unbedingt folgende Einstellungen aktivieren (das gilt auch für Rechner ohne Netzwerk)

Als Modul sollten kompiliert werden (falls benötigt):

Der Grund dafür ist einfach. Diese Technik spart Speicherplatz (die Module werden erst geladen, wenn sie auch wirklich gebraucht werden, und das automatisch. Nach einer einstellbaren Zeit werden die Module dann wieder rausgeworfen) und ist flexibler (man kann ihnen auch zu laufzeiten z.B. I/O Adressen und IRQs zuweisen, als wenn sie fest im Kernel sitzen. Dann müßte man bei IRQ-Änderungen den ganzen Kernel neu booten).

Man sollte grundsätzlich `Network support' auf "YES" stellen und mindestens ein `dummy' network device mit einbinden, denn viele Programme benutzen auch das Netzwerk, wenn keine Netzwerkkarte eigebaut ist (Linux ist halt ein Netzwerk-Betriebssystem), oder wenigstens die Protokolle, zur Prozeßkommunikation!
X-Window ist ein wichtiger Kandidat aus dieser Kategorie, der Druckerspooler (lpd) ebenfalls. Hat man ein echtes Netzwerk, braucht man kein `dummy' Device mehr; stören tut es aber nicht.

Ist man fertig mit Einstellen, geht man raus (`Exit'), speichert ab (`Yes') und tippt einmal make dep clean modules zImage modules_install (die Reihenfolge nach dep clean ist eigentlich egal), und arbeitet je nach Rechner zehn Minuten (P166, 32MB) bis zehn Stunden (386DX-33, 8MB) auf einer anderen Konsole kann man parallel getrost weiterarbeiten.

Installation des Kernels

Ist der Kompilierungsvorgang abgeschlossen, findet man unter /usr/src/linux/arch/i386/boot/ eine Datei namens zImage, die den neuen Kernel darstellt. Man kopiere diese ins `root' Directory (oder nach /boot, hauptsache irgendwo auf die root-Partition) und füge in die `/etc/lilo.conf' (vorausgesetzt, man benutzt LILO zum booten) folgendes ein:

        image = /boot/zImage            # zum Beispiel
        label = NeuerKernel             # max. 15 Buchstaben

Das setzt voraus, daß eine lauffähige `lilo.conf' schon existiert und alle anderen Settings die gleichen bleiben (`root, boot, prompt', etc).

Danach ein kurzes

        /sbin/lilo

aufrufen, und lilo sollte den neuen Kernel als weitere Bootoption aufnehmen.
Dann kann man beim nächsten Neustart beim `LILO:' Prompt NeuerKernel eingeben und dann wird der neue Kernel auch schon gebootet.
Soll das der Standard bleiben, d.h. läuft der "Neue" ein paar Tage problemlos, kann man in der `/etc/lilo.conf' die beiden Zeilen einfach vor die stellen, die den Standardkernel enthalten. einmal LILO aufrufen, und fertig.

Booten via `LOADLIN' ist auch nicht schwer. Irgendwo dürfte der Kernel liegen, den man früher gebootet hat. (Meistens auf einer DOS-Partition.) Dann einfach den neuen Kernel z.B. als `neuer.img' ins gleiche Verzeichnis kopieren und beim nächsten Booten die neue Kerneldatei dem `LOADLIN' als Parameter übergeben (oder nach Belieben in die Batchdatei schreiben).


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