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>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