Kernel erzeugen

Auf einem Debian GNU/Linux System gibt es grundsätzlich zwei verschiedene Wege einen individuellen Kernel zu erzeugen. Zunächst ist es natürlich möglich alle Arbeitsschritte auf klassischem Wege „zu Fuß“, wie auf jedem anderen Linux System, durchzuführen. Die elegantere Methode ist es jedoch ein eigenes Debian Kernel-Paket zu erzeugen und dieses zu installieren.

Sehen wir uns zunächst die etwas elegantere Debian Methode an, die klassische Methode werden wir später besprechen.

Debian Kernel (kernel-package)

Das Paket kernel-package unterstützt den Debian GNU/Linux-Systemadministrator bei der Verwaltung von individuellen Linux-Kerneln auf seinem System.

Sicherlich haben Sie schon die bei Debian GNU/Linux mitgelieferten Kernel-Pakete entdeckt. Diese sind so konfiguriert, daß diese auf den meisten Systemen funktionsfähig sind. Trotzdem ist es manchmal notwendig, einen eigenen Kernel zu übersetzen, um neue Hardware einzubinden oder um Hardwarekonflikte zu umgehen. Sie können hierbei das Paket kernel-package zu Hilfe nehmen. Dieses erzeugt ein Debian-Paket mit einem individuellen Kernel und allen Modulen für Ihr System.

Zunächst benötigen Sie, neben dem Paket kernel-package, welches Sie schon installieren können, ein Paket mit dem gewünschten Kernel-Quellcode (Source). Sie finden die Archive unter ftp://ftp.kernel.org oder auf den Spiegelservern in Deutschland: ftp://ftp.de.kernel.org oder ftp://ftp2.de.kernel.org.

Tip: aktuelle Kernel-Version herausfinden: Wenn Sie sich nicht per FTP durch die Verzeichnisse auf dem Kernel-Server „wühlen“ möchten um nachzusehen, ob es eine neue Version gibt, können Sie mit dem Kommando finger @www.kernel.org die aktuelle Kernel-Version ermitteln.

Weiter benötigen Sie einige zusätzliche Pakete, um einen neuen Kernel zu übersetzen, dies sind: gcc, libc5-dev oder besser (weil aktueller) libc6-dev, binutils, make, gawk oder mawk, gzip, shellutils, grep sowie bin86 auf der i386-Plattform. Wenn Sie das Kommando make menuconfig zur Kernel-Konfiguration benutzen möchten, muß das Paket libncurses5-dev installiert sein. Aber sicher haben Sie einige davon bereits installiert...

Wenn die notwendigen Pakete installiert sind, entpacken Sie die Kernel-Quellen, üblicherweise geschieht dies unter /usr/src/. Die entpackten Quellen befinden sich dann im Verzeichnis /usr/src/linux. Es ist ratsam, wenn Sie verschiedene Kernelversionen verwalten wollen, diese umzubenennen, beispielsweise in: kernel-source-2.2.14.

Wählen Sie in jedem Fall ein Verzeichnis auf Ihrer Platte, in dem genug Platz vorhanden ist. Die neuesten Kernel-Versionen sind in gepackter Form ca. 16,5 MB groß und nehmen im entpackten Zustand ca. 97 MB sowie ca. 116 MB, wenn alles übersetzt ist, ein. Je entpackter Kernel-Version! Wechseln Sie nun in das Verzeichnis, in dem die Kernel-Quellcodes liegen.

Der Name eines Debian GNU/Linux-Paketes besteht immer aus dem Basisnamen (hier: kernel-image), der Versionsnummer des Kernels (zum Beispiel 2.2.14, diese wird aus dem Kernel-Makefile ermittelt) und der sogenannten Revisionsnummer, diese können Sie individuell vergeben (über die Option --revision, die Sie dem Programm make-kpkg übergeben können). Sie sollten diese Revisionsnummer eindeutig wählen, um zu verhindern, daß ein bereits installierter Kernel überschrieben wird. Weiterhin darf das Zeichen „_“ (Unterstrich) nicht verwendet werden. Alternativ können Sie auch die Umgebungsvariable DEBIAN_REVISION auf den gewünschten Wert setzen.

Sie sollten die Revisionsnummer bei jedem neuen Kernel erhöhen, das Debian-Paketsystem kann so automatisch ein Update durchführen. Auch für das Paket kernel-package gibt es natürlich eine Konfigurationsdatei, diese finden Sie wie üblich im Verzeichnis /etc/ als kernel-pkg.conf. Üblicherweise sollten Sie dort mindestens Ihren Namen sowie die E-Mail-Adresse angeben, Sie können so immer feststellen, daß dieses Paket kein Original-Debian-Paket ist. Sie können, wenn nötig, noch weitere Variablen in dieser Datei benutzen. Momentan werden folgende Optionen unterstützt:

klassische Kernel

Tips

Benutzen Sie das Zeichen ; um mehrere Kommandos nacheinander auszuführen. Sie müssen so nicht die einzelnen Schritte beim Übersetzen eines neuen Kernels abwarten. make dep && make clean && make bzlilo && make modules && make modules_install erledigt einen kompletten Durchlauf ohne Pause.

Probieren Sie einfach einmal den Kernel mit der Option -s zu übersetzen, also: make -s zImage oder make -s bzImage. Bei einem so übersetzten Kernel werden lediglich Warnungen und Fehlermeldungen des Kernels beim Systemstart ausgegeben. Alle Ausgaben der Treiber werden unterdrückt.

Sie können das Übersetzen des Kernels beschleunigen, indem Sie den Parameter -j # einfügen, wobei # für eine (fast beliebige) Zahl steht. Mit diesem Parameter werden, entsprechend der angegebenen Zahl, mehrere Prozesse gestartet und Teile des Kernels gleichzeitig übersetzt. Sinnvolle Werte für die Anzahl der Prozesse sind in erster Linie vom Ausbau des Hauptspeichers (RAM) abhängig. Auf Systemen mit mehreren Prozessoren wirkt sich dies natürlich auch positiv aus. Bedenken Sie bitte, daß zu hoch gewählte Werte zum Auslagern (swappen) führen und den Vorgang merklich verlangsamen.

Um festzustellen, welcher Wert sinnvoll ist, benutzen Sie das Kommando: time make -j 10 bzImage und variieren den Wert für die Anzahl der Prozesse.

Sollten Sie nach dem Übersetzen der Module mit make modules; make modules_install Probleme haben, diese zu laden, liegt dies wahrscheinlich daran, daß die Datei modules.dep, in der die Abhängigkeiten (dependencies) beschrieben sind, nicht aktuell ist. Es ist nicht nötig, in dieser Datei irgendetwas von Hand zu ändern: der Befehl depmod -a 2.2.x erstellt eine aktuelle Datei für Sie, wobei 2.2.x der neuen Kernelversion entspricht.

Wenn Sie viele verschiedene Kernelversionen auf der Platte halten, kann es vorkommen, daß Fehlermeldungen in der Form: Warning: /boot/System.map has an incorrect kernel version. erscheinen. Neben der Möglichkeit, je eine Version der System.map in /boot/ und eine weitere in /usr/src/linux/ zu halten (was maximal zwei Versionen erlaubt), bietet Debian GNU/Linux sozusagen eine „Komplettlösung“. Das Script /etc/init.d/sysklogd startet beim Systemstart auch den klogd. Sie können am Anfang dieses Scripts in der Variablen KLOGD als Parameter -k /boot/System.map-$(uname -r) angeben. So wird je nach verwendeter Kernelversion eine passende System.map aus /boot/ geladen. Diese müssen Sie nach dem Übersetzen des Kernels in das Verzeichnis /boot/ kopieren und passend zur Kernelversion benennen. Am einfachsten können Sie das mit folgendem Kommando erledigen: cp /usr/src/linux/System.map /boot/System.map-`uname -r`.

Hier ein kleines Script, welches in /boot/ nach Kerneln sucht und eine passende lilo.conf erstellt, mit dem neuesten Kernel als Standardkernel.

#!/bin/bash

umask 772
kernel_dir=/boot

# lilo assumes the default image is the first one in lilo.conf, so
# we sort the kernel images backwards, hence the highest-version'd kernel
# will be the default.
images=`cd $kernel_dir && ls -1 vmlinuz-* \
 | egrep "vmlinuz-([0-9]+).([0-9]+).([0-9]+)[^-]*$" \
 | sort -rn`

cp -f /etc/lilo.conf.static /tmp/lilo.conf

# three lines per entry, 3 x 19 images = 57
( for img in $images ; do
   label=`echo $img | sed 's/vmlinuz/linux/ ; s/-//g ; s/\.//g'`
   echo "image=$kernel_dir/$img"
   echo "label=$label"
   echo ""
 done ) | head -57 >> /tmp/lilo.conf

if /sbin/lilo -C /tmp/lilo.conf ; then
  mv -f /etc/lilo.conf /etc/lilo.conf.last
  cp -f /tmp/lilo.conf /etc/lilo.conf
  echo successfully installed new bootloader.
  rm -f /tmp/lilo.conf
  exit 0
else
  echo eek, lilo barfed
  rm -f /tmp/lilo.conf
  exit 1
fi

Wenn Sie einen der neuesten Kernel (2.3.x oder 2.4.x) mit Debian GNU/Linux 2.2 verwenden möchten, sollten Sie folgende Zeile in die Datei /etc/fstab einfügen:

none	/var/shm	shm	defaults	0	0
Ab der Kernel-Version 2.3.51 wurde das „Shared-memory“-Dateisystem eingeführt.

SMP - Linux mit mehreren Prozessoren

Mittlerweile sind Motherboards mit mehreren Prozessoren recht preiswert zu erhalten. Diese werden natürlich auch von Debian GNU/Linux unterstützt. Die Kernelversion 2.0.x kann bereits mit mehreren Prozessoren umgehen, im Kernel 2.2.x wurde die Unterstützung wesentlich verbessert. Ein Umstieg ist ratsam, aber nicht zwingend nötig.