Kernel manuell kompilieren

Aus Gentoo Linux Wiki

Wechseln zu: Navigation, Suche
Dieser Artikel ist Teil der HOWTO Sammlung.
Installationsmethoden LiveCDs Kernel & Hardware Laptops & Notebooks Portage System Netzwerke & Services X Software Anderes alphabetischer HOWTO Index


Dieses Howto ist auf den aktuellen 2.6er Kernel bezogen.


Die Kerneloptionen wurden in einem eigenen Artikel ausgelagert:

Dieser Artikel bezieht sich auf die Konfiguration eines x86-Kernels, Unterschiede zum x86_64 sind aber nicht weiter gravierend. Bei einer Kernelkonfiguration gehört, unabhängig von hier vorgeschlagenen Optionen, ein wenig Köpfchen dazu.

Inhaltsverzeichnis

[Bearbeiten] Kernelpaket emergen

gentoo-sources
Full sources including the Gentoo patchset for the 2.6 kernel tree
Entwickler Linux/Gentoo-Programmierer
Kategorie sys-kernel
Lizenz GPL-2
Webseite dev.gentoo.org/~dsd/genpatches

Wie man einen Kernel herunterlädt, sollte aus dem Handbuch bekannt sein. Will man die aktuellen Gentoo 2.6 Sources, muss man folgendes ausführen:

emerge -av gentoo-sources

[Bearbeiten] Konfigurationsvorbereitungen

Der Quellcode wird in /usr/src von emerge entpackt. Nun betreten wir dieses:

cd /usr/src

[Bearbeiten] Symlink überprüfen

Und überprüfen, ob der Symlink /usr/src/linux auf den Kernel gesetzt ist, der konfiguriert und später genutzt werden soll. Bei USE="symlink" wird der Link automatisch gesetzt.

Code: Symlink überprüfen
eselect kernel list
# Listet alle installierten Kernel auf (aktueller Symlink zu erkennen am Stern '*')
 [1]   linux-2.6.24-gentoo-r4
 [2]   linux-2.6.24-gentoo-r5 *
 [3]   linux-2.6.25-gentoo-r1 
# Symlink ändern
eselect kernel set 3


[Bearbeiten] Kerneleinstellung übernehmen

Sollte eine ältere Version des gemergten Kernels installiert sein und Laufen, so kopiert man sich die aktuellen Einstellungen nach /usr/src/linux/.config. Vorzugsweise nimmt man zcat /proc/config.gz > /usr/src/linux/.config. Sind diese nicht vorhanden, schaut man in /boot oder im Verzeichnis der alten Kernelsourcen nach.

Sollte man seine alten Einstellungen übernehmen, so folgt ein

make oldconfig

um sicherzustellen, dass man auf alle Optionen Zugriff hat. Beim Wechsel von 2.4 auf 2.6 sollte man dies nicht tun und sich lieber eine neue config erstellen. In einer zweiten Konsole kann man dann verschiedene Werkzeuge einsetzen, die ungemein bei der Konfiguration des Kernels helfen. Diese wären zum Beispiel:

  • lspci - Informationen über Mainboard, Grafikkarte und PCI-Karten.
  • lsusb - Informationen über angeschlossene USB-Geräte.
  • cat /proc/cpuinfo - Informationen über die CPU.
  • lsmod - gibt Aufschluss über benutzte Module des laufenden Kernels.

[Bearbeiten] Übersicht über die gängigsten Konfigurationsmöglichkeiten

  1. make config
    • Komplett textbasierte Konfiguration.
    • Optionen werden nacheinander abgefragt.
    • Keine Möglichkeit, während der Konfiguration auf vorhergegangene Punkte zuzugreifen.
  2. make menuconfig
    • Textbasierte Konfiguration.
    • Einsatz von curses/ncurses.
    • Menü, dessen Unterpunkte sich jederzeit erreichen, einsehen und ändern lassen.
  3. make xconfig
    • Konfigurationsmenü für grafische Oberfläche.
    • Basierent auf Qt.
    • Dreigeteiltes Fenster, in dem jeweilige Menupunkte, Unterpunkte und deren Beschreibung sichtbar sind.
  4. make gconfig
    • Wie xconfig, nur auf Gtk basierend.
  5. make oldconfig
    • Textbasierte Einstellung aller Konfigurationsoptionen, die seit der vorhergehenden Installation neu hinzugekommen sind.
  6. make help
    • Gibt Auskunft zu weiteren Optionen, die hier nicht genannt wurden.

[Bearbeiten] Möglichkeiten Treiber in den Kernel einzubinden

  1. Eine Methode ist, die einzelnen Bestandteile direkt in den Kernel einzubinden. Dies hat zwar den Nachteil, dass der Kernel am Ende des Kompiliervorgangs größer wird. Doch wird es nicht vorkommen, dass Fehler z.B. wegen nicht geladenen Kernelmodulen auftreten (etwa für cifs).
  2. Eine zweite Methode ist die Verwendung von sog. Modulen. Hier wird der Treiber erst dann in den Kernel mit eingebunden, wenn er wirklich benötigt wird. Die vorkompilierten Dateien befinden sich hier im Verzeichnis /lib/modules/$KERNELVERSION. Im Gegensatz zur obigen Variante ist der so gebaute Kernel kleiner. Weiters lässt sich dadurch das System flexibler konfigurieren. Dies ist unter anderem nützlich, wenn man die Reihenfolge der Erkennung von Geräten festlegen will.

[Bearbeiten] Kerneloptionen

  • [*] - aktiviert
  • [ ] - nicht aktiviert

Funktionen, die als Module eingesetzt werden können:

  • <*> - in den Kernel
  • <M> - als Modul
  • < > - nicht aktiviert

Ab Version 2.6.24 tauchen auch folgende Optionen auf, die bereits automatisch aktiviert und/oder nicht deaktivierbar sind!

  • -*- - in den Kernel und nicht deaktivierbar
  • {*} - in den Kernel
  • {M} - als Modul

[Bearbeiten] New / Experimental / Deprecated / Obsolete

Folgendes erscheint oft beim Konfigurieren neben den Optionen:

  • (NEW)  : Neue oder vorher noch nicht benutzte Optionen.
  • (EXPERIMENTAL) : Neu und im Versuchsstadium, aktivieren wenn notwendig.
  • (DEPRECATED)  : Bald veraltet und überholt, nur noch aktivieren wenn notwendig.
  • (OBSOLETE)  : Veraltet und überholt, sollte nicht mehr aktiviert werden.

Nun geht's zu Konfiguration:

make menuconfig

Die Kerneloptionen wurden in einem eigenen Artikel ausgelagert, die dort gesetzten Einstellungen sollen lediglich ein Vorschlag sein.

[Bearbeiten] Tuning (CFLAGS)

Leider werden beim Kernelbau bzw. make-Vorgang die CFLAGS / CXXFLAGS und LDFLAGS etc. der /etc/make.conf nicht beachtet, diese können aber in das Makefile des Kernels eingetragen werden.

Man sollte ausdrücklich nur sichere Optionen verwenden, speziell bei den LDFLAGS.

In der /usr/src/linux/Makefile (ca. um Zeile 180) die Variable HOSTCFLAGS evtl. auch HOSTCXXFLAGS beliebig anpassen (-Wl,* = LDFLAGS), zum Beispiel:

Datei: /usr/src/linux/Makefile
[...]
HOSTCFLAGS = -Wl,-O1 -Wl,--sort-common -march=prescott -pipe -fomit-frame-pointer -fno-ident -Wall -Wstrict-prototypes
HOSTCXXFLAGS = ${HOSTCFLAGS} -fvisibility-inlines-hidden
[...]


Die Beachtung der LDFLAGS ist nicht sicher, da das Linken an bestimmten Stellen fern der GCC durchgeführt wird.

[Bearbeiten] Kernel kompilieren

Nachdem man die Konfiguration abgeschlossen hat, muss der Kernel übersetzt werden.

Tipp: Wenn man einen Mehrfachkernprozessor hat, empfiehlt es sich durch den make-Parameter "-j<anzahl_cores+1>" die Last zu verteilen.

make && make modules_install

Um die Namen der kompilierten Module in die modules.autoload-Datei einzutragen, können folgende Befehle verwendet werden.

cd /lib/modules/2.6.24
find . -type f -name '*.ko' -printf "%f\n" | sed 's/\.ko$//' > \
/etc/modules.autoload.d/kernel-2.6

Wenn man die Datei anschließend in einem Editor öffnet, findet man meist eine Reihe von Modulen, die man nicht benötigt. Am besten mit "#" auskommentieren und beim nächsten Booten auf evtl. Fehlermeldungen achten. Manche Module werden auch von bestimmten Initscripten automatisch geladen, so dass man sie aus der autoload-Datei löschen kann. So lädt zum Beispiel das Initscript von "firehol" die iptables-Module automatisch.

Das make modules_install lässt man weg, wenn man Modulunterstützung nicht aktiviert hat. Nun muss der fertige Kernel in das Boot-Verzeichniss kopiert werden. Dazu muss man die Bootpartition mounten, sofern diese extra vorhanden ist:

mount /boot

Nun kopiert man den Kernel, es empfiehlt sich den alten Kernel nicht zu löschen oder zu überschreiben. Wenn der selbst kompilierte nicht bootet, hat man wenigstens noch einen bootfähigen zur Verfügung:

cp arch/$PLATTFORM/boot/bzImage /boot/kernel-2.6.24
cp System.map /boot/System.map-2.6.24
cp .config /boot/config-2.6.24

$PLATTFORM ist je nach System i386/x86 (ab 2.6.24), x86_64 oder andere.

In der Regel reicht es, das bzImage zu kopieren. Nun sollte man noch seinen Bootmanager anpassen und rebooten.

Alternativ kann man auch mit

make install

den neu erstellten Kernel in das gemountete /boot installieren. Dabei werden der Kernel und die zugehörigen Dateien (System.map und Konfiguration) unter einem sinnvollen Namen dorthin kopiert und die Symlinks (System.map, vmlinuz, config, sowie alle mit .old) auf die neue bzw. letzte Version gelegt. Dem Bootloader kann man den Symlink dann entsprechend angeben.

[Bearbeiten] Konfiguration des Bootloaders

Zuerst einmal müssen wir uns zwischen zwei populären Bootloadern entscheiden.

Falls /boot auf eine extra Partition gemounted werden soll, dies tun.

[Bearbeiten] Grub-Konfiguration

grub
GNU GRUB 2 boot loader
Entwickler GNU
Kategorie sys-boot
Lizenz GPL-2
Webseite www.gnu.org/software/grub/

Installation

emerge -av sys-boot/grub

Booteinträge schreiben

Die Datei /boot/grub/grub.conf nach Belieben anpassen:

Datei: /boot/grub/grub.conf
default 0    # default-Eintrag festlegen
timeout 30   # Zeit in Sekunden bis der default-Eintrag gebooted wird
splashimage=(hd0,0)/boot/grub/splash.xpm.gz   # nettes Hintergrundbild :)
title=Gentoo GNU/Linux 2.6.24 root (hd0,0) # (Festplatte,Partition) auf dem die Dateien liegen. kernel /boot/kernel-2.6.24


Grub in den MBR schreiben

Wenn man sich im System befindet:

grep -v rootfs /proc/mounts > /etc/mtab

Grub auf der ersten Festplatte (Primary Master) installieren:

grub-install --no-floppy /dev/sda

Mehr Infos im offiziellen Gentoo Handbuch:

Tipp: Unter Remote Kernel Upgrade (englisch) befinden sich gute Informationen zur GRUB-Konfiguration. Besonders empfehlenswert wenn man testweise eine neue Kernel-Konfiguration bzw. Kernel-Version installieren will.

[Bearbeiten] Lilo-Konfiguration

lilo
Standard Linux boot loader
Entwickler John Coffman
Kategorie sys-boot
Lizenz BSD GPL-2
Webseite lilo.go.dyndns.org/pub/linux/lilo/

Installation

emerge -av sys-boot/lilo

Konfigurieren (Booteinträge schreiben etc.)

Die Datei /etc/lilo.conf anlegen und bearbeiten.

Datei: /etc/lilo.conf
boot=/dev/hda   # Lilo in den MBR der ersten Festplatte installieren
prompt          # Mehrere Einträge auswählen können
timeout=100     # 10 Sekunden warten bis der Default-Eintrag auto. geladen wird
default="Gentoo GNU/Linux 2.6.24"   # default-Eintrag
image=/boot/kernel-2.6.24 label="Gentoo GNU/Linux 2.6.24" # Name des Eintrages read-only # Starte mit einem nur-lesen Root root=/dev/hda3 # root-Dateisystem angeben # append=" xyz " # weitere Kernelparameter


Lilo in den MBR schreiben

lilo

lilo muss nach jeder Kernelkompilation erneut ausgeführt werden.

Mehr Infos im offiziellen Gentoo Handbuch:

Die Verwendung von LILO auf der AMD64-Architektur wird nicht empfohlen.

[Bearbeiten] Umgang mit Modulen

Module laden: modprobe nvidia

Entladen: modprobe -r nvidia

Geladene Module anzeigen: lsmod

Sämtliche verfügbare Module anzeigen: modprobe -l

Um Module beim Booten automatisch zu laden, trägt man diese in /etc/modules.autoload.d/kernel-2.6 ein, hier ein Beispiel anhand meines Systems:

Code: nano /etc/modules.autoload.d/kernel-2.6
i2c_isa
eeprom
w83627hf

[Bearbeiten] Links

[Bearbeiten] Quellen

[Bearbeiten] Weiterführende Informationen

Diesem Artikel ist eine Todo-Liste in der Diskussionsseite beigefügt. - Du kannst uns helfen, diesen Artikel zu erweitern, indem du die Punkte auf der Liste abarbeitest.



'Persönliche Werkzeuge