5.3 Debian Kernel-Pakete erzeugen

Auf einem Debian GNU/Linux-System gibt es grundsätzlich zwei verschiedene Verfahren, um 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.

5.3.1 Debian-Kernel bauen

Auf aktuellen Debian-Systemen sollte ein eigener Kernel nach Möglichkeit als Debian-Paket gebaut werden. Das erleichtert Installation, Entfernung und Wiederherstellung. Für viele Anpassungen reichen die von Debian gelieferten Kernelpakete; installieren Sie zuerst das passende Metapaket, bevor Sie einen eigenen Kernel bauen.

sudo apt update
sudo apt install build-essential fakeroot dpkg-dev
apt source linux

Die genaue Bauprozedur des Debian-Kernel-Quellpakets hängt von der Version ab und ist in den Dateien und der Dokumentation des Quellpakets beschrieben. Verwenden Sie nicht unbesehen Befehle aus Anleitungen für alte Kernel-Versionen.

5.3.1.1 make-kpkg (historisch)

make-kpkg aus dem Paket kernel-package gehört zu älteren Kernel-Bauanleitungen und ist nicht die empfohlene Standardmethode für Debian 13. Bevorzugen Sie die von Debian gepflegten Build-Anweisungen und erzeugen Sie installierbare Debian-Pakete. Alte Optionen, Patch-Sammlungen oder Verzeichnisnamen dürfen nicht ungeprüft auf aktuelle Kernel-Quellen übertragen werden.

Aktuelle Alternative: Wenn ein eigener Kernel als Debian-Paket benötigt wird, verwenden Sie die zu Kernelquelle und Zielsystem passenden Debian-Bauanweisungen und Werkzeuge wie make bindeb-pkg, sofern vom jeweiligen Kernel unterstützt. Für Paketänderungen gelten die aktuelle Debian Policy und die Kernel-Dokumentation. Vor einer Veröffentlichung sind Paketinhalt, Abhängigkeiten und Installations-/Entfernungsverhalten in einer Testumgebung zu prüfen.

5.3.2 Debian Kernel-Patches

Mit der Debian Distribution werden neben den Sourcen für die in Debian selbst verwendeten Kernel auch eine Reihe Kernel-Patches geliefert, die in eigene Kernel integriert werden können. Ein guter Einstieg für die ersten Versuche ist der kernel-patch-debianlogo; dieser Patch ersetzt den beim Systemstart angezeigten Pinguin durch ein Debian Logo. Bei der ersten Installation eines solchen Debian Kernel-Patches wird in /usr/src/ das Verzeichnis kernel-patches angelegt.

Die Installation eines solchen Kernel-Patch-Pakets wendet den Patch noch nicht an; dies geschieht erst mit dem Aufruf von make-kpkg:

bash$ fakeroot make-kpkg --append-to-version=030825 \
 --added-patches=debianlogo kernel_image modules_image

Das Kommando fakeroot wird dabei benutzt, um beschränkte administrative Rechte auch als normaler Benutzer zu erlangen.

Wenn weitere Patches in den Kernel eingespielt werden sollen, können diese durch Kommata getrennt an der Option --added-patches angegeben werden.

Normalerweise benutzt make-kpkg „make oldconfig“, nachdem die Patches angewendet wurden. Wenn von den Patches neue Kernel-Optionen benötigt werden, so werden diese abgefragt. Alternativ kann auch die Option --config=menuconfig benutzt werden, um die komplette Konfiguration zu überprüfen.

5.3.3 Klassische Kernel (historisch)

[Anmerkung]Historische Anleitung

Die hier beschriebene manuelle Kernel-Kompilierung und einzelne Befehle stammen aus älteren Kernel- und Debian-Versionen. Für aktuelle Systeme ist die vom Debian-Kernelquellpaket dokumentierte Paketbauprozedur maßgeblich; die Schritte nicht ungeprüft kopieren.

5.3.3.1 Anpassen des Kernels von Hand

In einigen Fällen kann es notwendig sein, den Linux-Kernel an die eigenen Bedürfnisse anzupassen. Debian GNU/Linux installiert einen Standard-Kernel, der in den meisten Fällen ausreichend ist. Zusätzliche Treiber können über Module im laufenden Betrieb hinzugeladen werden.

5.3.3.2 Benötigte Programme

Um aus den Kernel-Sourcen einen lauffähigen Kernel zu erzeugen, müssen die Quelltexte mittels eines passenden Compilers übersetzt werden. Der komplette Linux-Kernel wurde in der Programmiersprache C geschrieben - mit Ausnahme einiger ganz weniger Zeilen, die aus Geschwindigkeitsgründen in der Maschinensprache Assembler geschrieben wurden. Übrigens steht unter Linux der gcc (GNU Compiler Collection) - eine freie Implementierung eines C-Compilers - zur Verfügung.

Es werden folgende Pakete benötigt, um einen Kernel selbst zu erzeugen:

  • binutils - Der GNU-Assembler, -Linker und einige Zusatzprogramme.

  • libc6-dev - GNU C-Bibliothek, Entwicklerpaket.

  • gcc - Der eigentliche GNU (EGCS) C-Compiler.

  • make - GNU-Version von „make“.

  • bin86 - Ein 16-Bit-Assembler.

Nützlich, aber nicht zwingend erforderlich, sind weiterhin folgende Pakete:

  • libncurses5-dev - Entwickler-Bibliotheken und Dokumentation für ncurses.

  • tkstep8.0-dev - NeXTStep ähnliche Version des Tk-Toolkits. (oder tk8.0-dev oder tkstep4.2-dev oder tk4.2-dev).

  • kernel-package - Debian Linux-Kernel-Paket-Skripte.

5.3.3.3 Entpacken der Sourcen

Soll ein individuell auf das System angepasster Kernel installiert werden, so ist es zuerst nötig, die Kernel-Sourcen (Quellcode) zu installieren. Für den ersten Versuch ist es ratsam, die gleiche Kernel-Version zu installieren, die auch schon vom Installationsprogramm installiert wurde. Der Befehl

cat /proc/version

gibt Ihnen die installierte Version aus. Installieren Sie nun (mit dselect, dpkg oder apt) die Sourcen zu diesem Kernel.

Die Kernel-Sourcen werden vom Installationsprogramm unter /usr/src/ als Datei linux-source-2.x.x.tgz abgelegt und müssen noch von Hand entpackt werden. Dies wird mit dem Befehl

tar xvfz linux-source-2.x.x.tgz

erreicht. Die entpackten Sourcen finden sich nun in dem Verzeichnis linux-source-2.x.x/.

Dass die Debian Quellcodes des Kernels als ein Archiv installiert werden, mag auf den ersten Blick seltsam erscheinen, da ja durch das Entpacken sogar noch mehr Speicherplatz belegt wird. Dies hat aber bei näherer Betrachtung einen guten Grund. Das Debian Paketmanagement führt eine Datenbank über alle installierten Pakete und die dazugehörigen Dateien. Würde nun ein Kernel-Quellcode-Paket entpackt installiert werden, so würden die Anwender direkt mit diesen Dateien arbeiten und diese eventuell gar verändern. Damit wäre die zentrale Kontrolle umgangen.

Auf den Servern finden sich die aktuellen Archive des Linux-Kernels auch in einer mit bzip2 (anstatt mit gzip) komprimierten Form. Diese Archive sind noch einmal ein wenig kleiner, da bzip2 bessere Kompressionsalgorithmen verwendet. Die so gepackten Archive enden auf .bz2. Diese Archive können ebenfalls mit tar entpackt werden; hierzu ist aber die Option -j statt -z anzugeben. Beachten Sie: Es sind zwischenzeitlich einige Versionen von tar im Umlauf gewesen, bei denen für bzip2-komprimierte Archive die Option -I zu verwenden ist.

5.3.3.4 Konfiguration des Kernels

Wechseln Sie nun in das Verzeichnis, in dem Sie vorher die Kernel-Sourcen entpackt haben. Mit dem Kommando make config erzeugen Sie die benötigte Konfigurationsdatei. Sie können hier den Kernel individuell an Ihre eigene Hardware anpassen. Bei vielen Optionen haben Sie die Möglichkeit, zwischen fest im Kernel integrierten Treibern „ * “ oder Modulen „ M “ zu wählen. Achten Sie darauf, nur die nötigen Treiber fest in den Kernel einzubinden, da sonst der Kernel zu groß wird und nicht mehr von lilo geladen werden kann. Gute Kandidaten auf der Liste der Module sind alle Treiber, die nicht zum unmittelbaren Systemstart benötigt werden (Netzwerk, Bandlaufwerke).

Neben make config stehen Ihnen alternativ die Befehle make menuconfig mit einer textbasierten Oberfläche ähnlich wie bei dselect sowie make xconfig unter X11 zur Verfügung. Diese erleichtern kleine Änderungen am Kernel sehr, da die gewünschten Einstellungen direkt anzuwählen sind.

Wenn Sie die Option menuconfig benutzen wollen, muss das Paket libncurses5-dev installiert sein; dieses stellt die notwendigen Funktionen für die textbasierte Oberfläche zur Verfügung.

5.3.3.5 Übersetzen des Kernels

Nachdem Sie die gewünschten Einstellungen gemacht haben, werden mit dem Befehl make dep die Abhängigkeiten geprüft. Ein make clean räumt noch übrig gebliebene Dateien von der Festplatte. Einen neuen Kernel erzeugen Sie mit dem Befehl make bzImage. Zum Übersetzen des Kernels müssen neben einem C-Compiler auch die Pakete bin86 und natürlich make (das haben Sie aber sicher vorher schon bemerkt) installiert sein. Nach einiger Zeit (wenn alles ohne Fehlermeldungen über die Bühne gegangen ist) finden Sie den neuen Kernel unter /usr/src/linux-source-2.x.x/arch/i386/boot/. Dieser muss nun noch an die passende Stelle (bei Debian üblicherweise /boot/) kopiert werden. Abschließend ist die Konfiguration von lilo zu prüfen und ggf. anzupassen.

Statt make bzImage können Sie auch make bzlilo verwenden: Dieser Befehl kopiert den Kernel nach /vmlinuz und benennt vorher den schon vorhandenen Kernel in vmlinuz.old um. Danach wird automatisch lilo aufgerufen, und somit steht der Kernel dann ab dem nächsten Neustart zur Verfügung.

5.3.3.6 Übersetzen der Module

Sie können nun die Treiber, die Sie bei der Konfiguration als Module ausgewählt haben, übersetzen. Dies geschieht mit dem Befehl make modules. Nach dem Übersetzen der Module werden diese mit make modules_install an den richtigen Ort kopiert.

5.3.3.7 Tipps

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, dass 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, dass 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.6.x erstellt eine aktuelle Datei für Sie, wobei 2.6.x der neuen Kernel-Version entspricht.

Wenn Sie viele verschiedene Kernel-Versionen auf der Festplatte halten, kann es vorkommen, dass 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 Skript /etc/init.d/klogd startet beim Systemstart den klogd. Sie können am Anfang dieses Skriptes in der Variablen KLOGD als Parameter -k /boot/System.map-$(uname -r) angeben. Eine entsprechende Zeile findet sich bereits vorbereitet in dem Skript. So wird je nach verwendeter Kernel-Version eine passende System.map aus /boot/ geladen. Diese müssen Sie nach dem Übersetzen des Kernels in das Verzeichnis /boot/ kopieren und passend zur Kernel-Version benennen. Am einfachsten können Sie das mit folgendem Kommando erledigen: cp /usr/src/linux/System.map /boot/System.map-`uname -r`.

Hier sehen Sie ein kleines Skript, das 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 neueren 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.

Stand: 21.10.2026 22:27

 Impressum  Datenschutzerklärung