= Debian-Kernel kompilieren =

Hier wird beschrieben, wie man Debian-Kernel-Pakete kompilieren
kann.

== Warum nicht einfach so? ==

Wer schon Erfahrung mit dem Kernel-Kompilieren hat, fragt sich
vielleicht, wozu man hier einen besonderen Debian-Weg gehen soll.
Ein direkt kompilierter Kernel kann schliesslich mit '''make'''
einfach erzeugt werden und mit '''make install; make
modules_install''' installiert werden.

Diese Vorgehensweise hat jedoch einige Nachteile. Der Kernel wird
immer nur auf der Maschine installiert, auf der er auch kompiliert
ist. Will man z.B. einen kleinen Router aufsetzen, so hat dieser
meistens keine Ressourcen, um eine ganze Kernel-Kompilierung
durchzuführen. Außerdem soll z.B. auf einer Firewall auch nicht die
ganze Entwicklungsumgebung installiert sein. Ein zweiter Grund ist
der, daß man einen Kernel, den man als Paket installiert hat, auch
mit einem einfachen Befehl wieder deinstallieren kann. Alle
Vorteile eines guten Paketmanagers gelten nämlich für Kernel
genauso wie für alle anderen Bereiche.

Eine zusätzliche Erleichterung ist, dass man, falls es
entsprechende Debian-Pakete gibt, verschiedene Kernel-Patches
direkt mit einbinden kann. Dies habe ich z.B. mit dem
freeswan-Patch getan, der ein VPNmitIPSec ermöglicht.

== Ziel ==

Unser Ziel ist ein einzelnes Paket, das alles enthält, was einen
Kernel ausmacht. Wenn es installiert wird, wird die Kerneldatei
nach ''/boot'' geschrieben, der vorhergehende Kernel evtl. als
''old'' in das LILO-Menü eingebunden, die Module in das richtige
Verzeichnis kopiert und LILO aufgerufen.

Allerdings kann man auch sehr einfach andere Kernel-Pakete
erstellen, wie z.B. ein Paket nur mit dem Image oder nur mit den
Modulen oder nur mit den Headern. Dieses Header-Paket braucht man
z.B. wenn später Software kompiliert werden soll, die sich auf den
aktuellen Kernel bezieht.

Alle Schritte können als normaler Benutzer gemacht werden.
Lediglich die Installation des fertigen Paketes benötigt einen
root-Account.

== Wir benötigen ==

Ein laufendes Debian-System, alles, was man zum normalen
Kernel-kompilieren braucht, und die Debian-Kernel-Package-Tools,
also insbesondere folgende Pakete:

* gcc, libc6-dev, bin86
* libncurses5-dev
* kernel-package
* fakeroot

== Konfiguration ==

In ''./kernel-pkg.conf'' kann das Paket konfiguriert werden. Als
Vorlage kann man sich ''/etc/kernel-pkg.conf'' ansehen. Hier sollte
mindestens Name und EMail des Benutzers eingetragen werden. Dieser
wird dann als Maintainer in das Paket eingefügt. Ausserdem sollte
der Wert ''patch_the_kernel'' auf ''YES'' gesetzt werden, wenn man
Debian-Patch-Pakete automatisch einbinden will sowie der Wert
''debian'' auf die Revisionsnummer des Paketes (kann später mit
Kommandozeilenoption ''--revision'' geändert werden).

== Kernel-Sourcen ==

Zuerstmal muss ein aktueller Kernel besorgt werden. Dieser kann
entweder von http://www.kernel.org heruntergeladen werden oder man
installiert ein Debian-Paket mit den Kernelsourcen. Diese hinken
manchmal etwas hinter dem aktuellen Kernel her, aber sooo eilig
sollte man es eh nicht haben. Interessant ist auch die Tatsache,
dass die Debian-Sourcen nicht identisch sind, sondern bereits
einige Patches enthalten. Aufgefallen ist mir das, weil es z.B. nur
bei Debian möglich ist, ACPI als Modul zu konfigurieren. Ich habe
also folgendes gemacht:

  apt-get install kernel-source-2.4.18
  cd /usr/src
  bzcat kernel-source-2.4.18.tar.bz2 | tar x

Falls man das Ganze aus Sicherheitsgründen soweit wie möglich als
normaler Benutzer und nicht als root machen möchte, kann man als
root mit ''adduser myusername src'' den Benutzer in die Gruppe
''src'' aufnehmen. Dann kann die komplette Erstellung von
Kernelpaketen von diesem User durchgeführt werden. Lediglich die
eigentliche Installation muss dan natürlich wieder root machen.

Zusätzlich kann man Kernel-Patch-Pakete installieren. Natürlich ist
dabei immer zu beachten, ob der Patch zum vorhandenen Kernel passt.
Die automatische Einbindung der Patches klappt IMHO auch nur mit
Debian-Patch-Paketen. Diese legen sich nach
''/usr/src/kernel-patches'' und enthalten Skripten für Installation
und Deinstallation etc. Ansonsten muss man einen Patch selber
anwenden. Dies kann natürlich nicht mehr so leicht rückgängig
gemacht werden. Den freeswan-Patch installiert man z.B. mit

  apt-get install kernel-patch-freeswan_1.96

== Kernel konfigurieren und kompilieren ==

Zuerstmal in das Kernel-Source-Verzeichnis wechseln:

  cd /usr/src/kernel-source-2.4.18

Dann erst alles leerräumen und dann zuerst die Konfiguration und
dann die Kompilation starten:

  make-kpkg clean
  make-kpkg --append-to-version=lug --config=menuconfig configure
  fakeroot make-kpkg --append-to-version=lug --config=menuconfig
kernel_image

Wie die Konfiguration genau einzustellen ist, ist ein Artikel für
sich. Als Tip ist vielleicht zu sagen, daß die ganze Konfiguration
im Sourcen-Verzeichnis in der Datei '''".config"''' landet. Die
Konfiguration des gerade installierten Kernels ist mit dem
Kernel-Paket nach ''/boot'' kopiert worden (noch ein Vorteil von
Kernel-Paketen!). Diese Datei kann man nach ".config" kopieren und
als Ausgangspunkt nehmen. Mit ''--config=oldconfig'' kann man dann
erstmal nur die Fragen beantworten, die neu seit dem Kernel sind,
aus dem die Config-Datei stammt. Danach kann man dann mit
''--config=menuconfig'' ein Feintuning per Menü machen.

Wenn man keine Patches benutzt, reicht auch ein '''make
menuconfig''' gefolgt von obiger fakeroot-Zeile zum Starten der
Kompilierung. Ansonsten ist der Aufruf über make-kpkg nötig, damit
die Patches eingespielt werden, bevor die Konfiguration erfolgt.

Wenn man mehrere Paketversionen der gleichen Kernelsourcen erzeugt,
kann es Probleme geben, wenn man diese Pakete gleichzeitig
installieren will. Darum hängt man z.B. '''append-to-version
-custom1''' an, um verschiedene Unterversionen eines Kernels zu
bekommen. Dabei ist es aber wichtig, diese Option auch bei späteren
Aufrufen immer gleich anzugeben (es erscheint dann eine Warnung)
oder mit '''clean''' von vorne zu beginnen.

== Zusatzmodule als eigenes Paket mit module-assistant ==

Es gibt unter Debian Linux eine sehr schöne Methode, um für
besondere Kernelmodule (die also nicht im Standard-Kernel drin
sind) eigene Pakete zu erstellen. Für die meisten derartigen Module
gibt es nämlich (wie oben im Beispiel) Debian-Pakete mit den
Sourcen. Aus diesen Paketen kann man (wenn man die Kernel-Sourcen
seines laufenden Kernels installiert hat), mit dem Tool
'''module-assistant''' ganz einfach eigene Pakete bauen. Ist ein
solches Paket einmal erstellt, so kann es immer dazuinstalliert
werden, wenn der entsprechende Kernel installiert wird. Nachteil
ist, daß man das Modul-Paket bei jedem Kernel-Update neu erstellen
muss. Allerdings muss man bei obiger Methode immer den ganzen
Kernel neu erstellen.

Benötigt man einen angepassten Kernel nur wegen eines besonderen
Moduls, ist diese Lösung dem kompletten Neukompilieren auf jeden
Fall vorzuziehen.

__Anmerkung__: Ein Modul bauen (Non-Debian) 

Der "normale" Weg (ohne Debian-Unterstützung) "mal eben" ein 
Kernel-Modul zu kompilieren ist:

  cd /usr/src/linux
  make SUBDIRS=drivers/staging/rt2860/ modules


== Installation ==

Das fertige Kernel-Paket liegt nun in ''/usr/src''. Es kann von
root mit '''dpkg -i <filename.deb>''' installiert werden.
Voila! -- ThomasBayen

----

== Andere Artikel zum Thema: ==

* http://kernel-handbook.alioth.debian.org/ - Debian Kernel Handbook
* Hier findet Ihr einen gegoogelten
<b>[http://dugfaq.sylence.net/dug-faq.htm/ch-kernel.htm#s-debkernel
Kernelbau]</b> für Debian. -- MarkusMonderkamp
* Sehr interessant und ausführlich zu diesem Thema ist auch
http://www.osnews.com/story.php?news_id=2949 -- ThomasBayen
* So habe ich einen Kernel 2.6. mit initrd gebaut:
http://www.falkotimme.com/howtos/debian_kernel2.6_compile/index.php
-- SusanneWenz
* http://channel.debian.de/faq/ch-dpkgundco.html - kurze und gute
FAQs auf deutsch -- ThomasBayen

== Welches Modul für welche Hardware ==

* http://kmuto.jp/debian/hcl/ - diese Seite erlaubt es einem herauszufinden welche Module man braucht

[{Tag Debian Linux}]