Kernel kompilieren

From Linuxwiki
Jump to navigation Jump to search

Vorneweg

Einen eigenen Kernel bauen ist heutzutage meistens nicht mehr erforderlich. Die Hardwareunterstützung der Standard-Kernel ist in der Regel gut genug -> Den Kernel besser als Paket installieren bzw. updaten. Kernelpakete haben diese Bezeichnung:
linux-image-<version>-<architektur> also z.B. linux-image-2.6.32-29-generic-pae .

Ausgangssituation

Ein neuer Kernel soll gebaut werden, um die neuesten WLAN-Chipsätze ins System zu integrieren. Das Basissystem ist ein Debian Lenny (Standardinstallation).
(Ist aber im Grund egal, da es für alle bekannten Linux-Distributionen gleichermaßen funktioniert)

Vorbereitungen

Die Pakete gcc, initrd-tools bzw. initramfs-tools und libncurses5-dev müssen installiert werden. libncurses5-dev ist nicht auf der CD 1 vorhanden (problematisch, wenn noch kein Internetzugang vorhanden).
Bevor die ganze Aktion losgeht, empfiehlt es sich sehr, eine Sicherheitskopie der menu.list zu machen, also z.B. mit

# cp /boot/grub/menu.list /boot/grub/menu.list.bak

Kernel konfigurieren, kompilieren und installieren

# make menuconfig
# make bzImage
# make modules
# make modules_install
# mv /usr/src/linux/arch/i386/boot/bzImage /boot

Führt der Reihe nach folgende Schritte aus: curses-based Auswahlmenü diverser Kernelmodule (mit "make xconfig" kriegt man eine grafische Oberfläche zum Klicken sofern X-Server vorhanden), Kernelimage generieren, Module kompilieren und installieren. Kernelimage an eine sinnvolle Stelle moven.

Vorsicht mit

# make (dist) clean
# make mproper

Diese entfernen scheinbar überflüssige Dateien, aber auch Dateien wie /usr/src/linux/scripts/basic/fixdep Danach funktioniert der "make"-Befehl nicht mehr.

Ramdiskimage erzeugen
Achtung: Sehr distributionsspezifisch!

Neuere Debians:

# mkinitramfs -o /boot/initrd.img-<versionnr> <versionnr>

Ältere Debians:

# mkinitrd.yaird -o /boot/initrd.img-<versionnr> <versionnr>

Andere Distris:

# mkinitrd (--params)

Anmerkung zum Ramdisk-Image

Modulare Kernel brauchen ein Ramdisk-Image (initrd.img). Um das zu erzeugen, muss der Ordner /lib/modules/2.6.<version>/<kernelversion> vorhanden sein. Gibt es schon ein installiertes Debiankernelpaket, ist der Ordner nicht angelegt. In diesem Fall mit

# mkdir /lib/modules/2.6-<version>

den Ordner anlegen, reinwechseln und

# depmod -a

auführen.

Danach einen Symlink zur Kernelsource legen. Symlink zu Sourcen

# ln -s /usr/src/linux-<versionnr> /usr/src/linux

Neuen Kernel booten

Den neuen Kernel geg.falls noch in /boot/grub/menu.lst eintragen.
Den alten Kernel nicht wegschmeißen, bis der neue Kernel nicht mindestens einmal erfolgreich gebootet hat !!!

Nachkontrollieren, ob der neue Kernel läuft:

# reboot
# uname -a

Falls nach dem Reboot Probleme entstehen, die grub-Optionen beim Booten editieren oder mit einer Live-CD booten, /boot- oder /-Partition mounten (näheres dazu s. hier ) und das Backup der menu.list zurückkopieren.

Anmerkungen:
Problem: Selbst abschalten nach shutdown funktioniert nicht mehr (Notebook)
Lösung: Mit make menuconfig/xconfig in ACPI-Options:
ACPI Bios power-off disablen !

Kernelpackages bauen:
Nach dem make-menuconfig-Befehl

# make-kpkg clean
# make-kpkg --rootcmd fake -mykernel --revision 1 kernel_image

Ergibt -> linux_<versionsnr.>-mykernel_1_i386.deb