Linux-Arbeitskreis Hamburg |
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.
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.
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
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.
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.
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
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.
Ü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.
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).
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.