Kernel kompilieren

tagged Linux

Kompilieren eines neuen Kernels

Folgende Schritte sind bei einem Upgrade des Kernels notwendig, damit auch beim nächsten Start der Computer korrekt läuft.

Zur Not sollte man vorher einen Browser für die Konsole, wie z.B. lynx, installieren, damit man bei Problemen mit der grafischen Oberfläche immer noch Zugriff auf die hervorragende Dokumentation im Internet hat. Nützlich ist auch der Texteditor Nano für das Editieren von Konfigurationsdateien.

Installation der Kernel-Sourcen

Der erste Schritt ist die Installation des Quellcodes über den Paketmanager (sys-kernel/gentoo-sources), der Code befindet sich dann in /usr/src/ in einem eindeutigen Verzeichnis. Der Link /usr/src/linux muss auf das aktuelle Verzeichnis aktualisiert werden (per Hand oder 'eselect kernel list' und dann 'eselect kernel set [Nr]').

Konfiguration

Die Konfiguration erfolgt über eine schmucke Ncurses-Oberfläche (bekannt vom Norton Commander vor 15 Jahren) über den Befehl 'make menuconfig'. Bei einem Update von einer Minor-Version auf die nächste (z.B. 2.6.22 auf 2.6.23) kann die alte Konfiguration wiederverwendet werden: einfach die Datei '.config' aus dem alten Verzeichnis /usr/src/linux-2.6.22-gentoo in das neue Verzeichnis /usr/src/linux-2.6.23-gentoo kopieren und dann im neuen Verzeichnis über 'make menuconfig' die Anpassungen durchführen. Bei größeren Upgrades ändert sich die Konfigurationsdatei zu stark und kann nicht wiederverwendet werden.

Bei der Konfiguration besteht die Möglichkeit, verwendete Treiber in den Kernel zu integrieren oder als Module zu kompilieren. Um den Kernel klein zu halten, sollten die benötigten Treiber als Module kompiliert werden, wenn sie nicht beim Boot-Prozess benötigt werden. Nicht benötigte Treiber müssen nicht vorausschauend kompiliert werden, wegen der Einkompilierung von Einsprungadressen vergrößert sich der Kernel trotzdem. Ein großer Vorteil von Gentoo ist die problemlose und schnelle Neukompilierung des Kernels und der Module, sollte ein neuer Hardwaretreiber später doch benötigt werden. Bei Suse und Ubuntu werden einfach alle Module kompiliert und installiert, der Kernel wird dadurch entprechend groß und langsam.

Kompilation und Installation

Der Kompilationsvorgang wird durch 'make' gestartet. Dies kann bei einem neuen Kernel lange dauern. Bei der Neukompilierung von Modulen geht dies sehr flott, da lediglich die neuen Module und der Kernel selbst kompiliert werden, die sonstigen Module werden nicht neu erstellt.

Die Module werden dann mit 'make modules_install' in /lib64/Modules/2.6.[minor_version] installiert. Der Kernel selbst wird entweder über 'make install' als 'vmlinuz' in das Bootverzeichnis /boot geschrieben. Ich bevorzuge die händische Installation durch Kopieren:

'cp /usr/src/linux-2.6.[minor version]-gentoo/arch/x86_64/boot/bzImage /boot/linux-2.6.[minor version]-gentoo'.

Es ist immer gut, noch ein Backup zu haben.

Nacharbeit

Die kompilierten Module sollten aufgeräumt werden durch 'make clean'. Sonst werden bei einer Neukompilation mit weniger Modulen diese trotzdem installiert, da sie ja noch vorhanden sind, dies führt zu gefährlichen Inkonsistenzen.

Damit der Kernel auch verwendet wird, muss der Bootmanager Grub angepasst werden. Ich verwende dazu Yast aus meiner Sekundär-Distribution Suse wegen der schönen grafischen Oberfläche. Es sollte dort der aktualisierte Kernel /boot/linux-2.6.[minor version]-gentoo als zu ladender Kernel hinterlegt werden.

Proprietäre Grafiktreiber

Der nächste Start sollte ohne grafische Oberfläche gestartet werden, da die Nvidia-Treiber noch nicht mit dem neuen Kernel funktioniert und die automatisch gestartete grafische Oberfläche abschmiert. Dazu wird bei Auswahl der Distribution in Grub der Parameter 'nox' (No X) eingegeben. Mit emerge werden dann die proprietären Nvidia-Treiber installiert: 'FEATURES="-sandbox" emerge -av x11-drivers/nvidia-drivers'.