News

Debian spezifische Anleitungen

 

Kernel selbst kompilieren - the Debian way

Hier will ich beschreiben, wie man einen Linux-Kernel unter Debian GNU/Linux selbst kompiliert. Dabei gehe ich auf Besonderheiten des Debian-Systems ein, d.h. ich verwende Debian-eigene Tools, um ein Debian-Kernel-Paket zu erzeugen, dass anschließend bequem mit dpkg installiert werden kann.

Kernel-Quellen vorbereiten

Zunächst muss man sich entscheiden, ob man die Kernel-Quellen von kernel.org oder aus dem Debian-Archiv beziehen will. Grundsätzlich macht es keinen Unterschied, für welche Alternative man sich entscheidet, die Kernel aus dem Debian-Archiv enthalten lediglich ein paar kleinere Anpassungen.
Möchte man die Kernel-Quellen aus dem Debian-Archiv installieren, installiert man das entsprechende linux-source-Paket:

debian:/# apt-get install linux-source-2.6.12

Jetzt gibt es im Verzeichnis "/usr/src" eine Datei namens "linux-source-2.6.12.tar.bz2". Wir wechseln in das Verzeichnis "/usr/src" und entpacken die Kernel-Quellen:

debian:/# cd /usr/src
debian:/usr/src# tar -xvvjf linux-source-2.6.12.tar.bz2

Falls man es noch komfortabler will, installiert man das Paket unp vorher mit:

debian:/# apt-get install unp
debian:/usr/src# unp linux-source-2.6.12.tar.bz2

Damit die Bezeichnungsweise im folgenden übereinstimmt, legen wir noch einen symbolischen Link namens "linux" auf das entstandene Verzeichnis "linux-source-2.6.12":

debian:/usr/src# ln -s linux-source-2.6.12 linux

Kernel konfigurieren

Oft bietet es sich an, mit der Konfiguration eines Debian-Standard-Kernels anzufangen und diese anzupassen, insbesondere, wenn die Hardware-Komponenten schon (größtenteils) von diesem unterstützt werden. Dazu übernehmen wir die Datei "/boot/config-xxx" aus einer Debian, Knoppix oder Kanotix (aktueller) Boot-CD als unsere Kernel-Konfigurationsdatei. Diese kopieren wir nach "/usr/src/linux/.config" und wechseln anschließend nach linux:

debian:/# cp /boot/config-xxx /usr/src/linux/.config
debian:/# cd /usr/src/linux

Falls man eine Konfiguration "from scratch" erstellen möchte, lässt man obigen Schritt einfach aus oder übernimmt eine eigene (vielleicht gebackupte) .config. Für die Konfiguration stehen mehrere Frontends zur Verfügung, für die Konsole oder für X. Möchte man den Kernel mit einem graphischen Frontend unter X konfigurieren, ist der nächste Schritt:

debian:/# cd /usr/src/linux
debian:/usr/src/linux# make xconfig

Möchte man den Kernel lieber menügesteuert auf der Konsole konfigurieren (diese Art ist meiner Meinung nach noch komfortabler als make xconfig, weil das Menüsystem besser gemacht ist; außerdem kann man das prima in einem xterm machen, während man in Mozilla die Dokumentation (z.B. HOWTOs) durchgehen kann. Übrigens: die Konfiguration und das Kompilieren des Kernels ist kein besonderer Prozess, man kann nebenbei das System ganz normal nutzen (Internet etc.)), installiert man zunächst die Entwicklungsversion der Ncurses-Bibliothek und startet dann make menuconfig:

debian:/usr/src/linux# apt-get install libncurses5-dev
debian:/usr/src/linux# make menuconfig

Kernel patchen

Jetzt kann auch der Kernel gepatcht werden, falls gewünscht. In meinem Fall hätte ich gerne eine Reiser4 Unterstützung im Kernel. Standardmäßig wird Reiser4 (noch) nicht im Kernel integriert. Von daher muss man den Kernel entsprechend mit dem Reiser4 Debian-Kernel-Patch bearbeiten. Wir installieren den Patch , der ein neues Verzeichnis "kernel-patches" unter "/usr/src/" einrichtet. Den darin enthaltenen Patch wenden wir auf den Kernel an. Wir gehen wie folgt vor:

debian:/usr/src/linux# apt-get install kernel-patch-2.6-reiser4
debian:/usr/src/linux# patch -p1 < /usr/src/kernel-patches/diffs/reiser4/reiser4-2.6.patch

Anschliessend muss man Reiser4 im Kernel aktivieren. Dazu im Untermenü "File Systems" des Kernelmenü Reiser4 Support aktivieren:

debian:/usr/src/linux# make menuconfig

Zum Abschluss die ganze .config natürlich abspeichern und als Backup sichern. Nachdem man die Konfiguration abgeschlossen hat, gibt man nicht wie vorgeschlagen make dep ein, sondern (wir wollen ja den Komfort von Debian nutzen ;-)) erledigt die Kompilierung und das Erstellen eines Debian-Pakets mittels kernel-package, das schnell installiert ist:

debian:/usr/src/linux# apt-get install kernel-package

Bevor wir mittels kernel-package ein Debian-Paket unseres Kernels erstellen, ist es sinnvoll, sich eine eigene Bezeichnung (z.B. dri) zu überlegen, die nebst eigener Versionsnummer (z.B. startend mit 0) dem Kernel-Paket mitgegeben wird, damit der Kernel bei Bedarf wieder sauber aus dem System entfernt werden kann. Bevor man das folgende Kommando eingibt sollte man sich außerdem im klaren sein, dass das Kompilieren des Kernels je nach Systemleistung mehrere Stunden dauern kann (auf meinem P2/400-System dauerte die Kompilierung eines angepassten 2.6.12-Kernels gute 3h).

Kernel-Image bauen

Wir starten debian-like den Bau des Kernel-Images:

debian:/usr/src/linux# make-kpkg kernel_image --revision=dri.0

Jetzt kann man das in "/usr/src" liegende Debian-Archiv bequem mit "dpkg -i" installieren:

debian:/usr/src/linux# cd ..
debian:/usr/src# dpkg -i kernel-image-2.6.12-dri.0_i386.deb

Boot-Loader aktualisieren

Anschließend wird LILO konfiguriert. Sicherheitshalber sollte man "/etc/lilo.conf" selbst noch einmal mit dem Editor öffnen und auch den alten Kernel (mit dem das System ja auf jeden Fall gestartet werden kann) in das Bootmenü aufnehmen. Dazu fügt man etwa folgende Zeilen nach dem Standard-Kernel-Image ein:

/etc/lilo.conf :
image=/vmlinuz.old
label=LinuxOLD
read-only
# restricted
# alias=1

Beim Grub wird die "/boot/grub/menu.1st bearbeitet. Zu beachten ist, dass Grub die Partitionen anders deklariert. Die 1. Partition der Master-Platte am 1. IDE-Anschluss (dev/hda1) muss hier mit "(hd0,0)" angegeben werden. Das alte Device (/dev/hdb3) ergibt "(hd1,2)". Vielleicht bau ich die Config auch mal hier ein. ;-)

Anschließend müssen die Änderungen noch wirksam gemacht werden, indem lilo aufgerufen wird. Falls man den Grub vewendet, fällt dieser Schritt hier weg. Grub erkennt und aktualisiert den neuen Kernel automatisch beim nächsten Neustart:

debian:/# lilo

Jetzt kann das System neugestartet werden, und der neue Kernel sollte als "Linux" im Bootmenü verfügbar sein. Sollte der eigene Kernel nicht starten, kann das System mit dem alten Kernel ("LinuxOLD") gestartet werden und erneut konfiguriert werden.

Beim Grub kann der Befehl grub-reboot aufgerufen werden, der automatisch auf den alten Kernel zurückgreift, falls beim neuen Probleme auftauchen.

 

Module selbst installieren

Laptop-Benutzer sind oft auf das Paket "pcmcia-cs" und die in ihm enthaltenen Module angewiesen. Um "pcmcia-cs" verwenden zu können, sollte die PCMCIA/CardBus-Unterstützung im Kernel deaktiviert sein, sonst kann es zu Konflikten kommen. Wir laden uns wieder die Quellen mittels apt herunter:

debian:/# apt-get install pcmcia-source

Anschließend finden wir in "/usr/src" eine Datei namens "pcmcia-cs.tar.gz", diese entpacken wir:

debian:/# cd /usr/src
debian:/usr/src# tar -xvvzf pcmcia-cs.tar.gz

Module-Image bauen

Dies erzeugt einen Verzeichnisbaum modules unterhalb von "/usr/src". Wir wechseln wieder nach "/usr/src/linux" und kompilieren die pcmcia-cs-Module mittels:

debian:/usr/src/linux# make-kpkg modules_image --revision=dri.0

Die Kennung nach "--revision=" muss dabei exakt mit der Kennung unseres eigenen Kernels übereinstimmen, den wir verwenden möchten. Anschliessend kann wieder das entstandene Debian-Paket installiert werden:

debian:/usr/src/linux# cd ..
debian:/usr/src# dpkg -i pcmcia-modules-2.6.12_xxx+dri.0_i386.deb

Nach einem Neustart und Auswählen des neuen Kernels sollten nun auch die PCMCIA/CardBus-Dienste wieder verfügbar sein.

Die so entstandenen Images können immer wieder eingesetzt werden. Vor allem lohnt sich dieses Vorgehen bei schon etwas älteren Rechnern. Die Kompilierung erfolgt auf einem vorhandenen rechenstarken Computer und wird dann nur noch auf dem leistungsschwachen Rechner installiert. Der zeitraubende Kompiliervorgang entfällt somit.