Den eigenen Debian-Kernel bauen

Es kommt nicht oft vor, dass ich den Linuxkernel selbst übersetzen muss. In der Regel bietet der generische Debian- oder Ubuntukernel alle Treiber, die man braucht und da die Module nur dann geladen werden, wenn sie tatsächlich benötigt werden, ist der Performancegewinn eines eigenen Kernel für mich auf neuer Hardware kaum spürbar.
Natürlich gibt es aber auch gute Gründe, warum ein eigener Kernel sinnvoll sein kann. Sei es nur um das letzte bisschen Leistung herauszukitzeln, ein neues Kernelfeature zu aktivieren oder unnötige zu deaktivieren.
Der Standardkernel 2.6.32 von Squeeze und auch der 2.6.26 von Lenny funktionieren beide nicht auf meinem Toshiba Satellite 220cs Laptop. Bei nur 16 MB RAM regt sich nach GRUB für gewöhnlich nichts mehr. Meine Versuche mit Slitaz hingegen waren sehr erfolgreich. Sowohl das Betriebssystem als auch der Kernel sind so angepasst, dass selbst 16 Jahre alte Hardware mit aktueller Software funktioniert.
Als Debian-Fan wollte ich unbedingt den Kernel anpassen, um auszuprobieren wie sich Debian auf dem alten Laptop schlägt. Natürlich stand ich wieder mal vor dem Problem, wie ging das eigentlich bei Debian mit dem Kernelkompilieren.
Debians Kernel Handbook zeigt schon die wichtigsten Schritte auf, doch am einfachsten und nachvollziehbarsten werden sie auf www.adminlife.net beschrieben.
Debian bringt nämlich schon ein Werkzeug mit, welches alle wichtigen Schritte der Kernelkompilierung übernimmt und den angepassten Kernel auch gleich in ein .deb Paket umwandelt, welches sich über Debians Apt dann problemlos verwalten lässt.
Die wichtigsten Schritte sind:

  • Notwendige Programme zum Kompilieren installieren
    aptitude install kernel-package build-essential
  • Gewünschte Kernel Quellen installieren. Entweder die Debian Kernel Sourcen nehmen oder direkt von www.kernel.org herunterladen und in /usr/src entpacken. Z.B.
    aptitude install linux-source-2.6.30
  • Symlink anlegen
    ln -s /usr/src/linux-2.6.30 /usr/src/linux
  • Kernelconfig kopieren. Für den Anfang genügt es die aktuelle config aus /boot zu nehmen. Allgemein geht auch zcat /proc/config.gz > kernel.cfg
    cp /boot/config-`uname -r` /usr/src/linux/.config
  • Kernel an die eigenen Bedürfnisse anpassen
    cd /usr/src/linux
    make oldconfig
    make menuconfig
    
  • Den Kernel kompilieren und ein .deb Paket erstellen
    make-kpkg kernel_image --revision 20110217 --initrd

Ich musste auf meinem im letzten Post vorgestellten Debian-Minimalsystem mit debootstrap noch das Paket lzma installieren, damit das Kompilieren erfolgreich war.
Als Kernelconfig hatte ich die Slitaz 2.6.30-loram config ausgewählt. Beim Übersetzen wurde zuerst ein Fehler mit dem Kernelmodul lguest gemeldet, dass ich danach aus der config gestrichen habe.
Erfreulicherweise lief danach die Kernelkompilierung erfolgreich durch. Das entstandene .deb Paket lässt sich bequem mit dpkg -i installieren.
Mit diesem Kernel ließ sich wie erhofft problemlos sowohl ein Squeeze als auch ein Lenny in Qemu booten. Möglichkeiten zum Optimieren gibt es noch einige. Z.B. benötige ich nicht wirklich das ReiserFS-Dateisystem und gefühlte 100 weitere Module auch nicht.
Vielleicht werde ich deswegen auch in Zukunft die Kernelconfig soweit anpassen, dass tatsächlich nur noch die absolut notwendigen Pakete übrig bleiben. Für den Anfang ist "the Debian way ™" und ein Minidebian in Ubuntu eine bequeme Möglichkeit um weiter herum zu experimentieren.
Wie sich der neue Kernel auf dem Toshiba 220cs geschlagen hat, dazu demnächst mehr.

Veraltete Kernelversionen deinstallieren

Von Zeit zu Zeit werden neue Updates und Sicherheitsaktualisierungen über Ubuntu eingespielt und ab und zu findet sich auch eine neue Kernelversion darunter. Beim Update werden automatisch neue Menüeinträge im Bootmanager vorgenommen, die dann bei jedem Neustart als Auswahlmöglichkeit erscheinen. Wer nach dem Ausprobieren der neuen Version keine unerwarteten Probleme feststellt, kann die Einträge im Bootmanager GRUB entfernen und die älteren Kernelversionen einfach wieder deinstallieren.
Hierbei benutze ich meistens Synaptic, wo ich per Suche nach linux-image die aktuell installierten Versionen des Kernels herausfinde. Die Pakete sollte man für vollständiges Entfernen vormerken, womit auch Konfigurationseinstellungen deinstalliert werden.
Wenn die Menueinträge im Bootmanager nicht automatisch bei der Deinstallation entfernt werden, hilft eine Bearbeitung der Konfigurationsdatei /boot/grub/menu.lst weiter.
An deren Ende findet sich ein ähnlicher Eintrag wie der folgende:

title Ubuntu 8.04, kernel 2.6.24-19-generic
root           (hd0,6)
kernel /boot/vmlinuz-2.6.24-19-generic root=UUID=b99d10d3-7dd6-4538-93e5-210fde6a9466 ro quiet splash
initrd /boot/initrd.img-2.6.24-19-generic
quiet

Alle Einträge der älteren Kernelversionen können nun entfernt werden. Lediglich den Eintrag für die neueste Kernelversion muss man beibehalten. Wer sich nicht sicher ist, welcher Kernel gerade läuft, findet dies im Terminal durch Eingabe von

uname -r

heraus.
Um eine andere Kernelversion oder Betriebssystem als Standardauswahl in GRUB einzustellen, genügt es den Eintrag default: 0 anzupassen.
Dabei zählt 0 als der erste Menüeintrag in GRUB. Soll Windows standardmäßig gebootet werden und befindet sich der Eintrag an dritter Stelle, muss hierfür dann z.B. default: 2 eingetragen werden.
Nach dem Schließen der Datei muss man mit

sudo update-grub

überprüfen, ob die Datei menu.lst richtig bearbeitet wurde und keine Fehler aufgetreten sind. Nach dem Neustart sind dann die neuen Einträge verfügbar.