(2006-09-06)

eisfair :: Framebuffer-Kernel

Die Motivation

Mein Server steht in meinem Zimmer direkt unter dem Schreibtisch, beherbergt die ganze Musik und ist an die HiFi-Anlage angeschlossen. Außerdem benutze ich dort mICQ. Das hat den Vorteil, dass ich an den anderen Rechnern beliebig spielen, arbeiten, neu booten oder rumbasteln und gleichzeitig aber auch andere Leute über ICQ erreichen kann und die mich. Oft ist es dann auch so, dass alle anderen Rechner aus sind und ich nur noch Musik und ICQ über den eisfair-Server laufen habe.

Der Pferdefuß an der Sache: mICQ auf der Standardkonsole mit 80x25 Zeichen ist zwar möglich, aber irgendwie nervig, weil der Platz doch sehr begrenzt ist. Die Framebuffer-Technik vespricht hier höhere Auflösungen. Bei 800x600, die ich auf dem alten 17"-CRT-Monitor hier benutze, sind das immerhin 100x37 Zeichen und man kann mit ein bisschen Trickserei sogar echte Screenshots machen.

Ziel war es also einen Kernel mit Framebuffer-Unterstützung zu bauen, der mit dem original eisfair-Kernel 100% kompatibel ist, um Kernelmodule, die andere Pakete wie z.B. lmsensors oder asterisk mitbringen, problemlos nutzen zu können.

Kleine Randbemerkung: bei der Standardkonsole wird der Monitor mit 70 Hz angesteuert. Ich habe ausschließlich den VESA-Treiber für Framebuffer aktiviert, so dass man sich mit 60 Hz begnügen muss. Bei einer grafischen Oberfläche empfinde ich das als deutlich flimmernd, bei reinen Konsolenanwendungen stört mich das nicht. Mit den immer weiter verbreiteten TFT-Flachbildschirmen dürfte das überhaupt kein Problem sein.

Wer sich nur für den fertigen Kernel interessiert, kann den folgenden Abschnitt überspringen und bei Fertiges Kernelimage installieren weiterlesen!

Konfigurieren und Kompilieren

notwendige Tools und Kernelquellen installieren

Es empfiehlt sich, wie bei anderer Software auch, den Kernel nicht auf einem Produktivsystem zu kompilieren. Ich habe auf meinem Server auch keinen Compiler installiert, das lief alles von einem zweiten Rechner aus, auf dem ich ebenfalls eisfair installiert habe. Den gcc-Compiler und diverse Developer-Tools findet man auf Pack-Eis, diese habe ich zuerst installiert. Am einfachsten ist es, das Paket developer zu installieren, weil dort alle notwendigen Pakete mitinstalliert werden. Sehr praktisch ist dann noch ncurses-dev, weil man dann die Kernelkonfiguration menügeführt machen kann.

Die Kernelquellen sollte man dann nicht direkt von kernel.org laden, sondern den eisfair-Kernel-Source-Loader verwenden. Die im eisfair-Standard-Kernel benutzten Patches werden damit gleich eingefügt, so dass man dies nicht von Hand machen muss.

Kernel konfigurieren und kompilieren

Die Vorraussetzung sind jetzt geschaffen. Man sollte nochmal kontrollieren ob die Kernelquellen ordnungsgemäß nach /usr/src/linux-2.4.26-1 entpackt wurden und ob dort die Datei dot-config vorhanden ist. Diese enthält die ursprüngliche Kernelkonfiguration von Frank Meyer. Desweiteren sollte das Makefile vorhanden und dort in der vierten Zeile die EXTRAVERSION = -1 gesetzt sein. Dann gilt es noch zu kontrollieren, ob /usr/src/linux auf dieses eben erwähnte Verzeichnis zeigt. Ist das der Fall, wechselt man als root nach /usr/src/linux und beginnt mit der Konfiguration des Kernels.

Hier folgt jetzt das übliche und bekannte Vorgehen beim Kernel-Kompilieren. Ich will das nicht in allen Einzelheiten beschreiben und kürze das deshalb in Stichworten ab:

  • Alles bereinigen mit make mrproper
  • make menuconfig
  • /usr/src/linux/dot-config als alte Konfiguration laden
  • Framebuffersupport aktivieren
  • Konfiguration speichern und beenden
  • make dep
  • makemake modules und make modules_install ist nicht notwendig, die Module wurden ja schonmal kompiliert und sind bei eisfair dabei
  • nach make bzImage kopiert man dieses Image von /usr/src/linux/arch/i386/boot nach /boot und gibt ihm einen aussagekräftigeren Namen, z.B. eis-fb-mod.

anderes Boot-Logo

Wer mein fertiges Kernelimage später benutzt, wird sich vielleicht wundern, dass beim Booten nicht der gewohnte Pinguin Tux in der linken oberen Ecke auftaucht. Ich habe stattdessen dort das eisfair-Logo eingefügt. Wie das geht, ist ausführlich im WWW zu finden, ich stelle aber gern meine neue Header-Datei /usr/src/linux/include/linux/linux_logo.h zur Verfügung. Diese Datei kann ohne weitere Veränderungen verwendet werden, da das Logo die gleichen Abmessungen hat wie das Original.

Fertiges Kernelimage installieren

Vorraussetzungen

  • Du hast das Paket eiskernel in Version 1.0.13 installiert. Mit keinem anderen wird dies hier funktionieren!
  • Du weißt was Du tust!

Installation

Du entpackst das Kernelimage nach /boot. Bitte lösche nicht das Original-Image namens kernel! Dann ist es notwendig die Datei /etc/lilo.conf zu editieren. Ich zeige hier kurz eine Beispiel-Datei und erkläre dann noch ein wenig dazu:

lba32
disk=/dev/hda
bios=0x80
boot=/dev/hda
read-only
prompt
timeout=50
default=eis-fb-mod

image=/boot/kernel
root=/dev/hda8
label=eis
initrd=/boot/initrd.gz
vga=normal

image=/boot/kernel-fb-mod
root=/dev/hda8
label=eis-fb-mod
initrd=/boot/initrd.gz
vga=789 

Bei der Änderung der lilo.conf sollte man darauf achten, den Abschnitt für den alten Kernel beizubehalten. Dies ist hier der zweite Abschnitt. Am besten kopiert man den und ändert dann im neuen, hier dritten Abschnitt nur den Namen des Kernel-Images und die Parameter für die Grafikauflösung. Man kann dann noch im ersten Abschnitt den Eintrag hinter default auf den Namen des neuen Kernels setzen. In jedem Fall kann man später beim Booten auswählen, welchen Kernel man booten will. Die Änderungen speichert man. Da man schon root ist, weil man sonst die /etc/lilo.conf gar nicht editieren dürfte, ist es jetzt nur noch notwendig einmal als root lilo auszuführen. Fertig!

Der Parameter vga

Der Parameter vga bestimmt Auflösung und Farbtiefe. Beim Booten muss er in hexadezimaler Schreibweise angegeben werden. Dann ist ist eine führende '0' oder ein führendes '0x' notwendig. In der lilo.conf wird er in dezimaler Schreibweise erwartet. Die folgende Tabelle ist ein Auszug aus der Dokumentation vom Framebuffer und enthält in der jeweils linken Spalte die hexadezimalen Werte. In die rechte Spalte habe ich nochmal die umgerechneten Dezimalwerte eingetragen. Wer sich genauer dafür interessiert, kann ich /usr/src/linux/Documentation nachlesen.

  640x480 800x600 1024x768 1280x1024
256 0x301769 0x303771 0x305773 0x307775
32k 0x310784 0x313787 0x316790 0x319793
64k 0x311785 0x314788 0x317791 0x31A794
16M 0x312786 0x315789 0x318792 0x31B795