Kernel erstellen (FreeBSD)

Betrifft OS:
FreeBSD

Diese Anleitung beschreibt, wie man einen eigenen Kernel und Kernelmodule baut.

Einmalige Vorbereitungen

Bei FreeBSD-Versionen vor der Version 6.1 muss der Port net/csup installiert werden. Bei der Einrichtung hilft der Artikel csup. Bei neueren FreeBSD-Versionen gehört csup zum Userland

Vor dem erstmaligen Kernel-Kompilieren ist es empfehlenswert, den GENERIC-Kernel zu sichern, damit man bei einem nichtfunktionierenden, selbstkompilierten Kernel notfalls noch mit dem GENERIC-Kernel booten kann:

# cp -R /boot/kernel /boot/kernel.GENERIC

Man kann den jeweils letzten zuvor installierten Kernel im Verzeichnis /boot/kernel.old/ finden.

Kernel kompilieren

Oft kann mit einem Eintrag in /boot/loader.conf eine Kernelneukompilierung vermieden werden!

Für die möglichen Einträge in der /boot/loader.conf siehe bitte in der Datei /boot/defaults/loader.conf nach. Für die Soundkartenunterstützung ist zum Beispiel keine /Kernelneukompilierung notwendig.

Bitte lesen Sie auch das entsprechende FreeBSD-Handbuch-Kapitel http://www.de.freebsd.org/doc/de_DE.ISO8859-1/books/handbook/kernelconfig.html durch!

Vorarbeiten vor jeder Kernel-Kompilierung

Das Verzeichnis /usr/src wird mit:

# csup supfile

oder mit:

# cd /usr/src
# make update

aktualisiert oder gegebenenfalls erstellt (Siehe csup).

Als Nächstes erstellt man eine Kopie der Kernel-Konfigurationsdatei. Um der Gefahr aus dem Weg zu gehen, daß man sich seine eigene Kernelkonfiguration versehentlich löscht, kopiert man sich die Vorgabe in sein Heimverzeichnis und erstellt innerhalb des Quelltextbaumes nur einen symbolische Verweis darauf.

# cd /usr/src/sys/i386/conf/
# cp GENERIC ~/MYKERNEL
# ln -s ~/MYKERNEL .

Selbstverständlich kann man MYKERNEL mit einem selber gewählten Namen ersetzen! Der Pfad i386 ist hier mit der verwendeten Architektur zu ersetzen. Üblicherweise i386 oder amd64.

Konfiguration anpassen

Nun kann man die Datei /usr/src/sys/i386/conf/MYKERNEL editieren.

  • Entfernen Sie nur Zeilen aus der Kernel-Konfigurationsdatei, wenn Sie sich sicher sind zu wissen was Sie tun. Mit einer falschen Konfiguration handeln Sie sich meistens nur Ärger ein! Falls in einer Anleitung das Hinzufügen gewisser Zeilen empfohlen wird, kontrollieren Sie unbedingt, ob diese Zeilen nicht schon veraltet sind!
  • Ein System mit angepasstem Kernel und Modulen kann nicht mehr mit freebsd-update auf den neusten Stand gebracht werden. Kernel und Module müssen von jetzt ab, wie in diesem Artikel beschreiben, behandelt werden!
  • Diese Warnung soll Ihnen nicht den Mut zum Kernelneubau nehmen, denn das ist ein wichtiger Schritt zu einem individuellen System, jedoch soll es den Respekt vor der Arbeit am Kernel verdeutlichen. Lesen Sie sich vor dem Neubau diesen Artikel sowie das Kapitel im Handbuch durch, um im Fall eines nicht bootenden Kernels, sich helfen zu können. FreeBSD bietet wichtige Mechanismen, um in diesem Fall einen alten (bspw. den generischen) Kernel zu booten und so wieder Zugriff auf das System zu erhalten.

Welche Zeilen man hinzufügen muss, kann von Maschine zu Maschine verschieden sein, daher muss man selber herausfinden, was man braucht! Dabei helfen folgende Dateien:

  • FreeBSD 4.x: /usr/src/sys/i386/conf/LINT
  • FreeBSD 5.x bis 7.x: /usr/src/sys/i386/conf/NOTES und /usr/src/sys/conf/NOTES

sowie das Handbuch.

Man kann theoretisch Gerätetreiber einfach deaktivieren, wenn man sie nicht benötigt, dabei ist jedoch Vorsicht geboten (s.o.). FreeBSD installiert (leider) standartmäßig auch proprietäre Software. Wenn man das nicht möchte kann man speziell diese Treiber deaktivieren. Die betroffenen Module sind nve und ath_hal (u.U. auch ath_rate_sample). Um sie nicht zu bauen, macht man aus dem „device“ vor dem Treiber ein „nodevice“. Das sieht dann so aus:

nodevice          nve             # nVidia nForce MCP on-board Ethernet Networking
...
nodevice          ath             # Atheros pci/cardbus NIC's
nodevice          ath_hal         # Atheros HAL (Hardware Access Layer)
nodevice          ath_rate_sample # SampleRate tx rate control for ath

Das ath-Modul ist zwar freie Software benötigt aber denke ich das HAL-Modul, weswegen ich es auch deaktiviert habe.

Mit einen Minimaltest kann man die Korrektheit der Kernel-Konfigurationsdatei prüfen:

# cd /usr/src/sys/i386/conf/
# config MYKERNEL

Kernel-Kompilierung und Installation

Die Kernel-Kompilierung dauert je nach System zwischen etwa 5 Minuten und mehreren Stunden (bei sehr alter Hardware):

# cd /usr/src
# make buildkernel KERNCONF=MYKERNEL

Fortfahren nur, wenn make buildkernel nicht mit einer Fehlermeldung abbricht!

# make installkernel KERNCONF=MYKERNEL

Tipp

Durch Hinzufügen der Zeile

  KERNCONF=MYKERNEL

in /etc/make.conf kann man sich den KERNCONF-Parameter bei den make-Befehlen weglassen:

# echo "KERNCONF=MYKERNEL" >> /etc/make.conf
# cd /usr/src
# make buildkernel
  
--------------------------------------------------------------
>>> Kernel build for MYKERNEL started on ...
--------------------------------------------------------------
...
# make installkernel

Den Kernelbau beschleunigen

Dies ist für fortgeschrittene Benutzer gedacht. Anfänger sollten dieses Feature erst bei ausreichender Erfahrung nutzen, da fehlende Module das System unbrauchbar machen können.

Da bei der Ausführung von make buildkernel jedes mal ALLE Kernelmodule neu gebaut werden - egal ob sie später gebraucht werden oder nicht - kann man mit der Option MODULES_OVERWRITE im make.conf die Module auflisten, die tatsächlich gebraucht werden (zum Beispiel):

MODULES_OVERRIDE=       linux xl acpi linprocfs syscons/logo

Etwas einfacher kann man mit

WITHOUT_MODULES=       urio uscanner fxp

Module angeben, die man NICHT erstellen lassen möchte.

Der jeweilige Modulname richtet sich nach dem Ordner, in dem sich die jeweiligen Sourcen befinden. Für das Modul if_xl.ko wird beispielsweise xl und für den Screensaver logo_saver.ko wird syscons/logo eingesetzt.

Neustart

Wenn nichts mit einer Fehlermeldung abbrach, kann man nun den Rechner neu starten:

# shutdown -r now

Der neue Kernel sollte jetzt booten. Falls der Kernel nicht bootet, kann man (hoffentlich) mit einem alten Kernel starten. Hilfestellung kann man im FreeBSD-Handbuch Kapitel 8.6 http://www.de.freebsd.org/doc/de_DE.ISO8859-1/books/handbook/kernelconfig-trouble.html finden.

Viel Spass und Glück beim Kompilieren!