Erstellen eines benutzerdefinierten Kernels

Linux-Neulinge stellen häufig die Frage: "Warum soll ich einen eigenen Kernel generieren?" Angesichts der Fortschritte, die beim Einsatz von Kernel-Modulen gemacht worden sind, kann die Antwort auf diese Frage nur sein: "Wenn Sie nicht genau wissen, warum Sie einen eigenen Kernel generieren sollen, brauchen Sie wahrscheinlich auch keinen eigenen Kernel." Wenn Sie also keinen speziellen Grund haben, einen benutzerdefinierten Kernel zu generieren (es sei denn, Sie gehören zu den neugierigen Menschen), können Sie getrost zu Abschnitt namens Sendmail weiterblättern.

Früher war es notwendig, den Kernel neu zu kompilieren, wenn Sie Ihrem System neue Hardware hinzufügen wollten. Anders ausgedrückt: der Kernel war statisch. Durch Verbesserungen an den Kerneln von Linux 2.0.x war es möglich, viele der Hardware-Treiber zu Komponenten zu modularisieren, die nur bei Bedarf eingefügt werden konnten. Es traten jedoch erhebliche Probleme auf, wenn mehrere Kernel im System vorhanden waren, die für unterschiedliche Versionen kompiliert worden waren (beispielsweise SMP- im Gegensatz zu UP-Kerneln). Weitere Fortschritte bei der Modularisierung des Linux 2.2.x-Kernel ermöglichen jetzt eine bessere Verträglichkeit bei der Verwendung mehrerer Kernel (das gilt jedoch nicht für den gemeinsamen Zugriff auf Module).

Informationen zur Handhabung von Kernel-Modulen finden Sie in Abschnitt namens Laden von Kernelmodulen in Kapitel 3. Die meisten Änderungen sind nur beim Neukompilieren eines angepassten Kernels sichtbar.

Erstellen eines modularen Kernels

Diese Anweisungen vermitteln Ihnen die nötigen Kenntnisse für die Nutzung der Leistungsfähigkeit und Flexibilität, die aus der Kernel-Modularisierung resultieren. Falls Sie keine Kernel-Modularisierung verwenden möchten, finden Sie in Abschnitt namens Erstellen eines monolithischen Kernels Erläuterungen zu den verschiedenen Gesichtspunkten der Erstellung und Installation eines monolithischen Kernels. Wir gehen davon aus, dass Sie die Pakete kernel-headers und kernel-source bereits installiert haben und dass das Verzeichnis /usr/src/linux das aktuelle Verzeichnis ist.

Stellen Sie unbedingt sicher, dass Sie über eine funktionierende Notfall-Bootdiskette verfügen, falls etwas schief geht. Wenn Sie während der Installation keine Bootdiskette erstellt haben, holen Sie dies jetzt mit dem Befehl mkbootdisk nach. Der Standardbefehl lautet ähnlich wie mkbootdisk --device /dev/fd0 2.2.x, wobei 2.2.x für die vollständige Version Ihres Kernels steht (z.B. 2.2.14-5.0). Wenn Sie fertig sind, überprüfen Sie die Bootdiskette, um sicherzugehen, dass Sie damit das System booten können.

Zu Beginn der Erstellung eines Kernels ist es wichtig, dass sich der Quellcodebaum in einem bekannten Zustand befindet. Es wird deshalb empfohlen, zuerst den Befehl make mrproper anzuwenden. Dieser Befehl entfernt alle Konfigurationsdateien einschließlich der Reste früherer Builds, deren Dateien möglicherweise im Quellcodebaum verstreut sind. Als Nächstes müssen Sie eine Konfigurationsdatei erstellen, die festlegt, welche Komponenten Ihr neuer Kernel enthalten soll. Folgende Methoden zur Kernelkonfiguration stehen zur Verfügung:

AnmerkungBitte beachten
 

Um kmod (Einzelheiten siehe Abschnitt namens Laden von Kernelmodulen in Kapitel 3) und Kernel-Module verwenden zu können, müssen Sie bei der Konfiguration bei kmod support und module version (CONFIG_MODVERSIONS) support mit Ja antworten.

Wenn Sie einen Kernel mit einer Konfigurationsdatei erstellen möchten, (/usr/src/linux/.config — diese Datei wird erstellt, sobald eine der oben genannten Methoden ausgeführt wurde), die Sie bereits mit einer der erwähnten Methoden erzeugt haben, können Sie die Befehle make mrproper und make config auslassen und stattdessen den Befehl make dep, gefolgt von make clean verwenden, um den Quellcodebaum für den Build vorzubereiten.

Der nächste Schritt zur Erstellung eines modularisierten Kernels ist das Bearbeiten der Datei /usr/src/linux/Makefile und das Kompilieren die Quellcodekomponenten zu einem lauffähigen Programm, mit dem Ihr Computer gebootet werden kann. Mit der hier beschriebenen Methode können Sie am problemlosesten wieder in den Ausgangszustand zurückkehren, falls etwas schief gehen sollte. Falls Sie sich für weitere Möglichkeiten interessieren, finden Sie nähere Informationen hierzu im Kernel-HOWTO oder in Ihrem Linux-System in der Datei Makefile unter /usr/src/linux.

Falls Sie einen SCSI-Adapter verwenden und den SCSI-Treiber modularisiert haben, erstellen Sie ein neues initrd-Image (siehe Abschnitt namens Erstellen eines initrd-Images. Beachten Sie aber, dass es kaum praktische Gründe gibt, in einem benutzerdefinierten Kernel den SCSI-Treiber zu modularisieren). Erzeugen Sie kein initrd-Image, es sei denn, Sie haben einen spezifischen Grund dafür. Verzichten Sie ansonsten darauf, und fügen Sie ein solches Image auch niemals zu lilo.conf hinzu.

Es empfiehlt sich, den ursprünglichen Kernel aufzubewahren. So können Sie zum Booten jederzeit auf einen zusätzlichen, funktionierenden Kernel zurückgreifen, falls der neu erstellte Kernel Fehler enthalten sollte. Zum Hinzufügen des Kernels zu LILO benennen Sie den ursprünglichen Kernel in /boot um, kopieren den neuen Kernel nach /boot, fügen einige Zeilen in /etc/lilo.conf ein und führen /sbin/lilo aus. Hier ein Beispiel für eine mögliche standardmäßige Datei /etc/lilo.conf, wie sie im Lieferumfang von Red Hat Linux enthalten ist:

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
message=/boot/message
linear
default=linux

image=/boot/vmlinuz-2.2.16-12
        label=linux
        initrd=/boot/initrd-2.2.16-12.img
        read-only
        root=/dev/hda8
	
other=/dev/hda1 
        label=dos

Als Nächstes müssen Sie /etc/lilo.conf aktualisieren. Wenn Sie ein neues initrd -Image erstellt haben, müssen Sie LILO zuvor die Anweisung geben, das neue Image zu verwenden. Im folgenden Beispiel zu /etc/lilo.conf wurden in der Mitte der Datei vier Zeilen eingefügt, die bewirken, dass ein anderer Kernel beim Booten verwendet wird. Dazu wurde /boot/vmlinuz in /boot/vmlinuz.old umbenannt und das Label auf old gesetzt. Außerdem wurde eine initrd-Zeile für den neuen Kernel eingefügt:

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
message=/boot/message
linear
default=linux

image=/boot/vmlinuz-2.2.16-12
        label=linux
        initrd=/boot/initrd-2.2.16-12.img
        read-only
        root=/dev/hda8
     
image=/boot/vmlinuz-2.2.16-12.sjs 
        label=test
        initrd=/boot/initrd-2.2.16-12sjs.img
        read-only
        root=/dev/hda8

other=/dev/hda1
        label=dos
	

Wenn das System jetzt gestartet wird und Sie am Prompt LILO boot: die Tabulatortaste drücken, werden Ihnen die verfügbaren Auswahlmöglichkeiten angezeigt:

LILO boot:
linux  test  dos
        

Drücken Sie die Eingabetaste, um mit dem alten Kernel (linux) zu booten. Wenn Sie keine Taste drücken, lädt LILO den alten Kernel nach einer Zeitverzögerung automatisch. Wenn Sie mit dem neuen Kernel (test) booten wollen, geben Sie test ein und drücken die Eingabetaste.

Es folgt eine Zusammenfassung der Schritte:

Sie können den neuen Kernel testen, indem Sie Ihren Computer neu starten und die Meldungen am Bildschirm verfolgen. Dabei wird angezeigt, ob die Hardware richtig erkannt wird.

Erstellen eines initrd-Images

Beim Booten wird ein initrd-Image für das Laden der SCSI-Module benötigt. Wenn Sie kein initrd -Image benötigen, erstellen Sie keines, und bearbeiten Sie auch nicht die Datei lilo.conf, um dieses Image einzufügen.

Das Shell-Skript /sbin/mkinitrd kann das richtige initrd-Image für Ihren Computer erstellen, wenn die folgenden Bedingungen erfüllt sind:

Um das neue initrd-Image zu erstellen, führen Sie /sbin/mkinitrd mit den folgenden Parametern aus:

/sbin/mkinitrd /boot/newinitrd-image 2.2.15-2.5.0sjs
	

Dabei ist /boot/newinitrd-image die Datei für Ihr neues Image, und 2.2.15 ist der Kernel, dessen Module (aus /lib/modules) im initrd-Image verwendet werden sollen. (Die Versionsnummer dieses Kernels stimmt nicht notwendigerweise mit der Versionsnummer des aktuell verwendeten Kernels überein.)

Erstellen eines monolithischen Kernels

Um einen monolithischen Kernel zu erstellen, führen Sie - von ein paar Ausnahmen abgesehen - dieselben Schritte aus wie beim Erstellen eines modularen Kernels.