Einen eigenen Kernel unter FreeBSD zu kompilieren, ist nicht sonderlich
schwer. Eine ausführliche Anleitung dazu findet sich auch im
FreeBSD-Handbuch (http://www.freebsd.org/doc/de_DE.ISO8859-1/books/handbook/kernelconfig-building.html).
Die dortige Anleitung finde ich allerdings durch die Vielzahl der
beschriebenen Variationsmöglichkeiten gerade für "Newbies" recht
verwirrend. Außerdem werden einige - meiner Ansicht nach
wichtige - Kerneloptionen nicht erwähnt. Daher soll meine Anleitung
als kurze Einführung dienen, wie man unter FreeBSD 5.1-RELEASE einen
(i386-)Kernel an seine Bedürfnisse anpaßt und installiert.
Die Kernelquellen befinden sich im Verzeichnis
/usr/src/sys.
Existiert dieses Verzeichnis nicht oder ist leer, dann sind die
Kernelquellen nicht installiert worden. Das läßt sich
folgendermaßen nachholen:
Man ruft als
root das Programm
/stand/sysinstall
auf und wählt
Configure ->
Distributions
->
src ->
sys zur Installation aus.
Am besten legt man ein spezielles Verzeichnis an, in dem man seine
Kernelkonfigurationen speichert. Das kann z.B.
/root/kernels
sein. Dort ist die Kernelkonfiguration vor einem versehentlichen Löschen
bei Änderungen des Kernelbaums geschützt.
Dazu führt man (als
root) folgende Schritte aus:
cd /usr/src/sys/i386/conf
mkdir /root/kernels
cp GENERIC /root/kernels/MYKERNEL
ln -s /root/kernels/MYKERNEL
(Natürlich kann man anstelle von
MYKERNEL auch einen
beliebigen anderen Namen wählen, z.B. den des Systems, auf dem
man kompiliert.)
Nun hat man die Datei
/root/kernels/MYKERNEL, die die
Konfiguration des mitgelieferten Standardkernels enthält, als
Vorlage für seine eigenen Konfigurationswünsche.
Diese Datei editiert man mit einem beliebigen Texteditor, z.B. mit
dem Editor
vim. Das Dateiformat ist recht simpel:
Jede Zeile enthält ein Schlüsselwort (z.B.
machine, cpu,
options und ein oder mehrere Argumente. Kommentare werden mit einer
# eingeleitet.
Unbedingt nötig sind folgende Schlüsselwörter:
# gibt die Architektur an
machine i386
# je nach CPU-Typ I386_CPU, I486_CPU, I586_CPU oder I686_CPU
cpu I686_CPU
# Kernelname, wird beim Booten ausgegeben
ident MYKERNEL
# limitiert u.a. die maximale Anzahl an Prozessen; bei "0" setzt das
# System den Wert selbst
maxusers 0
# Schnittstelle zur Fließkomma-Einheit, muß angegeben werden!
device npx
# TCP/IP-Loopback, muß angegeben werden!
device loop
Die weiteren Optionen sind mehr oder weniger optional. Auf dem eigenen
System nicht benötigte Optionen (z.B. Treiber für
ISA-Steckkarten auf Systemen ohne ISA-Slots, Treiber für nicht
vorhandene NIC-/SCSI-/sonstige Steckkarten...) können mit einer
# auskommentiert werden.
Wichtig dabei: Manche
Optionen werden benötigt, obwohl anscheinend kein entsprechendes
Gerät mehr installiert ist. Dazu zählt insbesondere der Eintrag
device isa der
nicht auskommentiert werden darf! Also
im Zweifelsfall lieber einen Eintrag zuviel im Kernel belassen und/oder in
der Kernel-Dokumentation nachlesen!
Wichtig: In der
GENERIC-Datei finden sich
nicht
alle möglichen Kerneloptionen, sondern nur eine Liste der am
häufigsten genutzten. Wer eine Funktion benötigt und keine
entsprechende Option findet, sollte sich die Dokumentationsdateien
/usr/src/sys/conf/NOTES und
/usr/src/sys/i386/conf/NOTES einmal genauer anschauen!
Sowohl im entsprechenden
Handbuchkapitel
(http://www.FreeBSD.org/doc/de_DE.ISO8859-1/books/handbook/kernelconfig-config.html) als auch in diesen Dateien sind die Optionen genau beschrieben, so
daß ich an dieser Stelle auf weitergehende Beschreibungen verzichte.
Stattdessen will ich kurz einige Optionen nennen, die in der
Standardkonfiguration nicht auftauchen, aber für einige Systemfunktionen
durchaus wichtig sind.
Nicht wenige "FreeBSD-Newbies" werden auf ihrem System auch eine
Linux-Installation haben. Da die verwendete Software oftmals identisch ist,
bietet es sich an, Konfigurationsdateien der Linux-Installation auch
für FreeBSD zu verwenden oder zumindest als Vorlage für die
Konfiguration zu verwenden. Dazu muß allerdings ein Zugriff auf
die Linux-Partitionen möglich sein. Wenn das verwendete Dateisystem
ext2 oder
ext3 ist, benötigt man dazu
folgenden Eintrag in seiner Kernelkonfiguration, der aus Lizenzgründen
standardmäßig leider fehlt:
# Linux ext2fs
options EXT2FS
Die meisten PCI-Soundkarten und Boards mit onboard-Sound werden durch folgende
Option unterstützt:
device pcm
Laut Handbuch wäre für onboard-Sound auch noch die Option
options PNPBIOS nötig, auf meinem System
(Sony Vaio mit nForce-Chipsatz) verhinderte diese Option aber die
korrekte Soundausgabe. Im Zweifelsfall einfach ausprobieren!
Wer zum CD-Brennen Programme wie
cdrecord oder
cdrdao benutzen möchte, muß noch den
ATAPI/CAM-Treiber in den Kernel einbinden, das Gegenstück
zum Modul "
ide-scsi" unter Linux. Dazu dienen die
folgenden Zeilen:
device atapicam
device scbus
device cd
device pass
device ata
device atapicd
Weitere Informationen zum CD-Brennen finden sich auch im entsprechenden
Handbuchkapitel unter
http://www.freebsd.org/doc/de_DE.ISO8859-1/books/handbook/creating-cds.html
Wichtig: In der Datei
/usr/src/UPDATING sind wichtige
Informationen zu Neuerungen und Änderungen enthalten, außerdem
wird vor möglichen Fallstricken gewarnt. Deshalb sollte man
(gerade wenn man die Kernelkompilation im Rahmen eines System-Updates
durchführt) diese Datei
unbedingt vor der Installation eines
neuen Kernels lesen!
Nachdem man nun eine auf sein System zugeschnittene Konfigurationsdatei
erzeugt hat, kann man im nächsten Schritt darangehen, den neuen
Kernel zu kompilieren und installieren. Dazu sind als
root
folgende Schritte nötig:
cd /usr/src
make buildkernel KERNCONF=MYKERNEL
make installkernel KERNCONF=MYKERNEL
(
MYKERNEL ist gegebenenfalls durch einen anderen Namen zu
ersetzen.)
Der neue Kernel samt Modulen wird nach
/boot/kernel/ installiert,
während der alte nach
/boot/kernel.old/ gesichert wird. So
ist sichergestellt, daß immer ein lauffähiger Kernel verfügbar
ist.
Wenn der neue Kernel nicht bootet, ist das noch lange kein Grund zur Panik.
Man kann im
FreeBSD Boot Loader ganz einfach einen anderen
Kernel angeben, z.B.
kernel.old oder eine andere Sicherungskopie.
Dazu drückt man einfach eine Taste außer
Enter,
während das System von 10 herunterzählt. Dann gibt man
unload ein und bootet mittels
boot kernel.old
(gegebenenfalls anpassen) den alten Kernel.
Wenn man sich nach einem Reboot und einigem Testen vergewissert hat, daß
der neue Kernel wie gewünscht funktioniert, sollte man eine
Sicherungskopie der Konfiguration und des Kernels anlegen. So hat man eine
Konfiguration, auf die man auch nach fehlgeschlagenen weiteren Testversuchen
wieder zurückgreifen kann.
Dazu kann man z.B. eine Sicherungskopie mit Datum wie folgt erstellen:
cd /root/kernels
cp MYKERNEL MYKERNEL-2003-12-26
cd /boot
mkdir /boot/kernel-2003-12-26
cp -Rp /boot/kernel/* /boot/kernel-2003-12-26/
Abschließend noch ein
Hinweis: Wenn statt des gewünschten
neuen Kernels ein anderer Kernel bootet, z.B. der GENERIC-Kernel, dann
kann das daran liegen, daß man in der Kernelkonfigurationsdatei
Kommentarzeilen(!) eingefügt hat, die Umlaute oder Sonderzeichen
enthalten. Das Kompilieren eines Kernels auf der Basis einer solchen
Konfigurationsdatei liefert leider keinerlei Fehlermeldungen, sondern
führt zu solch merkwürdigen Phänomenen, wie ich
aus eigener Erfahrung bestätigen kann.
Quellen und weiterführende Links