Linux: Kernel compilieren

4

Bevor wir anfangen uns mit dem Kernel zu beschäftigen, sollte kurz geprüft werden ob die notwendigen Tools dafür auch alle installiert sind.

apt-get install kernel-package ncurses-dev fakeroot wget bzip2 initramfs-tools gcc-4.9-plugin-dev

1. Kernel sources herunterladen

Als erstes läd man sich die gewünschten kernel sources unter http://kernel.org/ herunter. Im folgenden Beispiel habe ich mich für den Kernel 2.6.32.4 entscheiden. Diese sollten anschließend unter /usr/src abgelegt und entpackt werden.

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.4.tar.bz2
tar xfvj linux-2.6.32.4.tar.bz2

In einigen Büchern ist zu lesen, dass das Verzeichniss /usr/src/linux auf den aktuellen kernel zeigt. Unter Debian ist dies von Hause aus nicht der Fall. Da ich den Konzept aber gut finde, lege ich diesen Link immer mit an.

ln -s /usr/src/linux-2.6.32.4 /usr/src/linux
cd /usr/src/linux

2.Kernel Konfiguration erstellen

Jeder Kernel hat eine .config Datei die alle Informationen darüber enthält was im Kernel aktiviert wird und was nicht. Für das compilieren eines neunen Kernels muss diese Datei erst erstellt werden. Dazu gibt es zwei Möglichkeiten.

Entweder man legt händisch fest, welche Optionen aktiviert werden – was ziemlich viele Fragen nach sich zieht 😉 oder man nutzt als Grundlage für die .config Datei die Konfiguration des aktuellen Kernels und lässt sich nur nach den neuen Funktionen des Kernels befragen.

Für eine komplett neue Konfiguration gibt es drei Möglichkeiten

make config

rein Textbasiert.

make menuconfig

Menüunterstützung auf der Konsole

make xconfig:

grafisch Abfrage. Setzt einen X-Server sowie die Qt-Bibliotheken vorraus.

make gconfig

gleiche wie xconfig jedoch auf Basis der Gnome Bibliotheken

Um eine Kernel Konfiguration auf Basis der aktuellen Kernel Konfig. zu erstellen gibt es den Befehl

make oldconfig

3. Aufräumen

Bevor nun der Kernel kompiliert werden kann, sollte noch auferäumt werden.

make-kpkg clean

Der Befehl löscht alle Objekt-Dateien (*.o). Ohne diesen Befehl werden lediglich alle Dateien kompiliert, die sich seid dem letzten Vorgang geändert haben.

4. Kernel kompilieren

Bevor der Kernel nun gebaut wird sollte ich noch dazu sagen, dass ich mit make-kpkg dafür entschieden habe den Kernel als Debian Archiv erstellen zu lassen. Wer eine MultiCore CPU besitzt, kann mit

export CONCURRENCY_LEVEL=3

die Anzahl der zu verarbeitenden Jobs auf 3 setzten wobei CONCURRENCY_LEVEL = Kernanzahl +1 nicht überschreiten sollte. Bei make gibt es dafür den Parameter -j.

Wird der Befehl als root ausgeführt reicht

make-kpkg --revision=custom.1.0 kernel_image

anderfalls muss fakeroot eingesetzt werden.

fakeroot make-kpkg --revision=custom.1.0 kernel_image

Nach dem absetzten des Befehls kann es etwas dauern bis der Kernel fertig kompiliert ist. Auf meiner virtuellen Maschine (Intel T7200, 2x 2 GHz, 2 GB Ram) dauert es ca. 40 Minunten.

Ist das Debian Archiv fertig, muss es noch installiert werden.

dpkg -i linux-image-2.6.32.4_custom.1.0_amd64.deb

5. Initial Ramdisk erstellen

Zu einem neuen Kernel gehört, auch eine neue initial ramdisk. Die Initial Ramdisk ist dafür verantwortlich, die Kernelmodule bereits beim booten zu verfügung zu stellen.

update-initramfs -c -k 2.6.32.4

6. Fertig

Im Prinzip wäre der neue Kernel nun einsatzbereit. An dieser Stelle sollte man vor dem Reboot noch mal überlegen, ob man nicht etwas vergessen hat, denn bleibt das System beim botten hängen, so hilft auch fallback Funktion von Grub nicht weiter. In diesem Fall muss manuell der alte Kernel im Grub Menü ausgewählt werden, was sich remote schwierig gestalten könnte 😉

Anmekrung zu Ubuntu

Ubuntu in kompiliert ist der Kernel mit Debuging Informationen kompiliert. Dies führt dazu, dass ein neuer Kernel auf der Basis der alten Konfiguration nicht 20-30 MB groß ist, sondern 200-300 MB.

Die entsprechende Zeile in der .config dafür ist

CONFIG_DEBUG_INFO

Sed leistet hier mal wieder gute Dienste.

sed 's/CONFIG_DEBUG_INFO/# CONFIG_DEBUG_INFO/' -i .config

Links

Update vom 29.11.2016

Fehler: Cannot use CONFIG_GCC_PLUGINS: your gcc installation does not support plugins, perhaps the necessary headers are missing?
Lösung: apt-get install gcc-4.9-plugin-dev

 

Teilen.

Über den Autor

Seit der Ausbildung zum Fachinformatiker Systemintegration (2002-2005) bei der DaimlerChrysler AG, beruflich im Bereich der E-Mail Kommunikation (Exchange, Linux) sowie des ActiveDirectory, mit entsprechenden Zertifizierungen (MCSE 2003, MCITP Ent.-Admin 2008, MCSE 2012, LPIC 1-3) tätig. Abgeschlossenes Studium zum Master of Science der IT-Management an der FOM sowie zertifizierter Datenschutzbeauftragter. Aktuell im Projektmanagement tätig.

4 Kommentare

  1. Unter Ubuntu scheitert die Installation leider mit folgender Meldung

    dpkg -i linux-image-2.6.32.4_selfbuild.1.0_amd64.deb
    Wähle vormals abgewähltes Paket linux-image-2.6.32.4.
    (Lese Datenbank ... 191477 Dateien und Verzeichnisse sind derzeit installiert.) Entpacke linux-image-2.6.32.4 (aus linux-image-2.6.32.4_selfbuild.1.0_amd64.deb) ...
    Done.
    Richte linux-image-2.6.32.4 ein (selfbuild.1.0) ...
    Running depmod.
    Running postinst hook script update-grub.
    Generating grub.cfg ...
    Found linux image: /boot/vmlinuz-2.6.32.4 Found linux image: /boot/vmlinuz-2.6.31-17-generic Found initrd image: /boot/initrd.img-2.6.31-17-generic
    Found linux image: /boot/vmlinuz-2.6.31-16-generic Found initrd image: /boot/initrd.img-2.6.31-16-generic
    Found linux image: /boot/vmlinuz-2.6.31-14-generic Found initrd image: /boot/initrd.img-2.6.31-14-generic
    Found memtest86+ image: /memtest86+.bin
    Found Windows 7 (loader) on /dev/sda1
    done
    Examining /etc/kernel/postinst.d.
    run-parts: executing /etc/kernel/postinst.d/dkms
    run-parts: executing /etc/kernel/postinst.d/nvidia-common
    run-parts: /etc/kernel/postinst.d/nvidia-common exited with return code 20 Failed to process /etc/kernel/postinst.d at /var/lib/dpkg/info/linux-image-2.6.32.4.postinst line 1186.
    dpkg: Fehler beim Bearbeiten von linux-image-2.6.32.4 (--install):
    Unterprozess installiertes post-installation-Skript gab den Fehlerwert 2 zurück Fehler traten auf beim Bearbeiten von:
    linux-image-2.6.32.4

    Schuld daran ist das nvidia-commin Script

    chmod -x /etc/kernel/postinst.d/nvidia-common

    (https://bugs.launchpad.net/ubuntu/+source/nvidia-common/+bug/292606)

    Nach dem entfernen der Ausführungsrechte ließ sich der Kernel auch installieren.

    dpkg -i /usr/src/linux-image-2.6.32.4_selfbuild.1.0_amd64.deb
    Wähle vormals abgewähltes Paket linux-image-2.6.32.4.
    (Lese Datenbank ... 191477 Dateien und Verzeichnisse sind derzeit installiert.)
    Entpacke linux-image-2.6.32.4 (aus .../linux-image-2.6.32.4_selfbuild.1.0_amd64.deb) ...
    Done.
    Richte linux-image-2.6.32.4 ein (selfbuild.1.0) ...
    Running depmod.
    Running postinst hook script update-grub.
    Generating grub.cfg ...
    Found linux image: /boot/vmlinuz-2.6.32.4
    Found linux image: /boot/vmlinuz-2.6.31-17-generic
    Found initrd image: /boot/initrd.img-2.6.31-17-generic
    Found linux image: /boot/vmlinuz-2.6.31-16-generic
    Found initrd image: /boot/initrd.img-2.6.31-16-generic
    Found linux image: /boot/vmlinuz-2.6.31-14-generic
    Found initrd image: /boot/initrd.img-2.6.31-14-generic
    Found memtest86+ image: /memtest86+.bin
    Found Windows 7 (loader) on /dev/sda1
    done
    Examining /etc/kernel/postinst.d.
    run-parts: executing /etc/kernel/postinst.d/dkms

  2. Hi!

    Da ich mich seit ein paar Tagen durch verschiedenste Anleitungen zum Kernel-Kompilieren gelesen habe, bin ich etwas verwirrt. In manchen Befehlen unterscheiden sich komischer Weise die Anleitungen doch etwas. Jetzt wollte ich gerne wissen wie aktuell deine Anweisungen hier sind, gerade im Bezug auf initrd und so. Danke schon mal!

  3. Bei entfernen Systemen bietet kann über die Grub-Option „savedefault –default=2 –once“ (alternativ grub-reboot 2) der neue Kernel einmalig geladen werden. Wenn der Bootvorgang scheitert, wird wieder der default-Kernel aus der menu.lst genommen.

    Damit das System bei einer kernel panic auch noch neu startet, muss dem neuen Kernel der Parameter panic=10 mitgegeben werden (Neustart nach 10 Sekunden).

Antworten