Linux-Arbeitskreis Hamburg

Eigener Kernel

Das Erzeugen eines eigenen Kernel kann aus den verscheidensten Gründen notwendig werden. Entweder braucht man einen aktuelleren Kernel, als er der Distribution beiliegt, oder man benötigt spezielle Erweiterungen. Netraverse liefert für nahezu alle Distributionen angepasste Kernel für Win4Lin. Wenn man aber zusätzlich mit Mosix arbeiten möchte oder einen besonderen Patch braucht (z.B. den initrd-Patch), dann fürht kein Weg am eigenen Kernel vorbei.

1. Kernel-Quellen besorgen

Für die Kernel-Quellen ist http://www.kernel.org/ die Quelle der Wahl, zumindest wenn man Original-Quellen haben möchte. Viele Distributionen kommen mit erweiterten (gepatchten) Kerneln, hier muss man dann auf den Websiten der Distribution nachschauen.

Im ersten Schritt lädt man sich also z.B. den Kernel 2.4.20 vom FTP-Server.

Hinweis: Die folgenden Beschreibungen gehen von der Kernel-Version 2.4.20 aus. Für andere Versionen sind die Pfade entsprechend anzupassen.

2. Auspacken der Archivdatei

Die heruntergeladenen Datei linux-2.4.20.tar.gz speichert man in einem beliebigen Verzeichnis (es muss nur genügend Platz vorhanden sein), z.B. /tmp und entpackt sie dort:

cd  /tmp
tar xvfz  linux-2.4.20.tar.gz

Dabei entsteht das Verzeichnis /tmp/linux-2.4.20 in das man dann für die weiteren Schritte hineinwechselt.

cd linux-2.4.20

Damit die Quellen auch von allen Tools richtig gefunden werden muss man noch einen Links anlegen:

ln -s  /tmp/linux-2.4.20  /usr/src/linux

3. Patchen der Kernelquellen

Die meisten Veränderungen bzw. Patches bestehen aus einfachen Textdateien, die den Unterschied zu den Originalquellen beschreiben und über ein Programm namens patch angewendet werden.

Von Netraverse benötigt man für Win4Lin die passenden Dateien Kernel-Win4Lin3-2.4.20.patch und mki-adapter.patch. Diese beiden Dateien kopiert man sich ebenfalls in das Verzeichnis /tmp/linux-2.4.20 und aktiviert sie dann folgendermaßen:

patch -p1 < Kernel-Win4Lin3-2.4.20.patch  > patch.log 2>&1

bzw.

patch -p1 < mki-adapter.patch  > patch.log 2>&1

Das Programm patch führt jeweils die in der Datei beschriebenen Änderungen durch. Eventuelle Fehler werden gemäß dieser Beschreibung in die Datei patch.log geschreiben, die man also jeweils auf mögliche Fehlermeldungen hin untersuchen muss.

4. Konfigurieren des Kernel

Bevor man den eigenen Kernel nun kompilieren kann, muss man ihn erst einmal konfigurieren. Die Konfiguration ist recht umfangreich und nicht immer selbsterklärend. Von daher macht es Sinn von einer berits angepassten Konfiguration auszugehen. SuSE legt die Konfigurationsdatei für den installierten Kernel im Verzeichnis /boot ab, von wo man sie sich ins aktuelle Verzeichnis kopieren kann:

cp  /boot/vmlinuz.config  /tmp/linux-2.4.20/.config

Um diese Datei an die eventuell nicht ganz passenden Kernelquellen anzugleichen startet man nun einmal

make menuconfig

und beendet es gleich wieder über den Menüpunkt Exit. Die Datei .config wird dann neu geschrieben und es sind nur die Optionen vorhanden, die zu den Kernelquellen passen.

Um verschiedene Kernel-Versionen aus den gleichen Quellen erzeugen zu können ist es sinnvoll im Makefile eine Unterversionsnummer einzutragen. Man editiert als die Datei Makefile:

VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 20
EXTRAVERSION = -UWE

Der Text sollte mit einem Minuszeichen anfangen und bei Bedarf noch zusätzlich mit einer fortlaufenden Nummer versehen werden.

Nach diesen Schritten kann dann die eigentlich Kernelkonfiguratione erfolgen, die man mittels

make menuconfig

startet. Die Bedeutung der einzelnen Konfigurationmöglichkeiten kann hier nicht beschrieben werden.

Auf alle Fälle muss nach den Win4Lin-Erweiterungen irgendwo in der Menüstruktur ein zusätzlicher Punkt auftauchen, mit dem die Windows-Dienste für den Kernel aktiviert werden.


Nach Abschluss der Konfiguration verläßt man das Konfigurationsprogramm mit Exit und läßt die Konfigurationsdatei neu schreiben.

5. Kompilieren des Kernel

Das Kompilieren ist ein einfacher, aber recht zeitaufwendiger Vorgang. Bei älteren Rechnern kann der gesamte Vorgang eventuell mehrere Stunden dauern. Man ruft einfach der Reihe nach die folgenden Befehle auf (aus dem Verzeichnis /tmp/linux-2.4.20 heraus):

make dep
make clean
make bzImage
make modules
make modules_install

Nach diesen Schritten stehen der Kernel und die zugehörigen Module zur Verfügung. Die Module schon im richtigen Verzeichnis /lib/modules/2.4.20-UWE und der Kernel noch in /tmp/linux-2.4.20/arch/i386/boot/bzImage

6. Installieren des Kernel

Zum Installieren des Neuen Kernel muss dieser erst einmal in das Verzeichnis /boot kopiert werden, möglichst mit einem eindeutigen Namen:

cp /tmp/linux-2.4.20/arch/i386/boot/bzImage  /boot/vmlinuz.uwe

Zusätzlich wird nach die Datei System.map, die die Kernelsymbole beinhaltet im Verzeichnis /boot benötigt.

cp /tmp/linux-2.4.20/System.map  /boot/System.map-2.4.20-UWE

Danach muss dann die initrd noch erzeugt werden, die die Module beinhaltet die schon zum Booten notwendig sind. Hierzu gehören vor allem Module für SCSI-Adapter und Netzwerkkarten.

mk_initrd  -k vmlinuz.uwe  -i initrd.uwe

Damit ist der Kernel einsatzbereit und es muss nur noch der Bootmanager angepasst werden.

7. Bootmanager

Über den Bootmanager kann man den zu startenden Kernel auswählen. Gerade für den ersten Start eines neuen Kernel macht es Sinn die alte Version nicht zu löschen, sondern parallel zu lassen. Dazu muss man die Konfigurationsdatei des Bootmanagers erweitern.

7.1 LiLo

Bei LiLo ist das die Datei /etc/lilo.conf

image  = /boot/vmlinuz
  label  = linux
  root   = /dev/sda6
  vga    = 791
  initrd = /boot/initrd

  image  = /boot/vmlinuz.uwe
  label  = linux-uwe
  root   = /dev/sda6
  vga    = normal
  initrd = /boot/initrd.uwe

Etwas wie der erste Abschnitt sollte sich in dieser Datei finden. Den fett hervorgehobenen Teil muss man dann für den neuen Kernel hinzufügen. Sollte der neue Kernel nicht starten kann man immer noch auf den alten zurückgreifen.

Eine Änderung an der /etc/lilo.conf wird erst wirksam, wenn man an der Konsole zusätzlich das Kommando

lilo

aufruft. Falls alles wie gewünscht klappt kann man anschließend auch am Anfang der /etc/lilo.conf die Zeile

default=linux-uwe 

eintragen, womit der Kernel zum Standard-Kernel des Rechners wird (den lilo-Aufruf nicht vergessen).

7.2 Grub

Für Grub als Bootmanager (bei SuSE seit 8.1 Standard) ist die Konfigurationsdatei /boot/grub/menu.lst Hier lauten dann die entsprechenden Zeilen:

title linux
   kernel (hd0,0)/vmlinuz root=/dev/hda6   vga=785
   initrd (hd0,0)/initrd
title linux-uwe
   kernel (hd0,0)/vmlinuz.uwe root=/dev/hda6   vga=normal
   initrd (hd0,0)/initrd.uwe

Grub muss nicht wie Lilo über Veränderungen an der Konfigurationsdatei informiert werden. Nach der beschriebenen Änderung sollte der neue Kernel im Boot-Menü angeboten werden.

Auch hier kann man den neuen Kernel zum Standard-Kernel machen über eine Default-Zeile:

default 1

Falls hier vorher default 0 stand, so wurde damit der erste Eintrag ausgewählt. Nach der Beschreibung ist der neue Kernel nun im zweiten Eintrag zu finden, daher die 1.


Kritik, Anregungen und Ergänzungen willkommen. Zusammengestellt von Uwe Debacher und Bernd Burre, letzte Änderung am Friday, 27-Jan-2006 12:44:12 CET
Impressum