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

     

    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).

    Reply To Christian Scholz Cancel Reply