Linux Kernel

Das Linux Project wurde 1991 vom Finnen Linus Torvalds ursprünglich für die x86-Architektur ins Leben gerufen. Mittlerweile ist der Linux Kernel mit über 16 Millionen Codezeilen und über 2000 Entwicklern das größte OpenSource Software Projekt weltweit. 80% der Personen die aktiv in den Kernel committen sind bei Firmen (Redhat, Google, …) angestellt um am Kernel zu arbeiten, 20% sind Privatleute die in Ihrer Freizeit am Kernel mitentwickeln.

Kernel herunterladen

Alle Kernel-Versionen (mainline, stable, longterm, next) können von kernel.org herunterladen werden.

Der Quellcode kann wahlweise per http, git oder rsync gezogen werden, wobei git dabei die gebräuchlichste Variante sein dürfte. Auch sind alle ausgecheckten Tags als *.tar.gz Tarball verfügbar.

Stable Tree:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

Latest RC-Tree

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

Wann sollte ich welche Version verwenden?

  • Ich will sehen ob ein bestimmter Bug gefixt wurde

    stable.

  • Ich will einen relativ modernen Kernel, der zuverlässing läuft

    stable.

  • Ich will mir ein neues Feature genauer ansehen

    rc.

  • Ich möchte höchste stabilität und Sicherheit für einen möglichst langen Zeitraum

    longterm.

  • Ich möchte für meinen Raspberry Pi einen Kernel bauen der zuverlässig läuft, mir reicht eine bestimmte Version und ich will nicht lange warten.

    stable (4.1.2)

    wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.1.2.tar.xz
    

Upstream Kernel für den Raspberry Pi

Dieser Vorgang setzt eine funktionierende Croos-Toolchain für ARMv7l Architekturen voraus.

Besorgen der aktuellen Kernel-Version 4.1.2:

$ wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.1.2.tar.xz

Danach entpacken wir die Quellen und wechseln ins Verzeichnis:

$ tar -xvf linux-4.1.2.tar.xz
$ cd linux-4.1.2

Anschließend können wir den Kernel konfigurieren:

# RP1 / Compute Module
$ cd linux
$ KERNEL=kernel
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

# RP2
$ cd linux
$ KERNEL=kernel7
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

Möchte man die Konfiguration noch weiter anpassen, kann man das mit menuconfig tun:

make menuconfig

Nun kompilieren wir das Kernelimage, Module und den DeviceTree-Blob:

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

Das Kernelimage sowie der DeviceTree-Blob können nun auf die SD-Karte übertragen werden, die Kernel-Module werden später in das Rootfile-System im Verzeichnis /lib/modules installiert.

Was ist der Unterschied zwischen einem Image, zImage, uImage?

Kommt man zum ersten mal mit Kernelimages in Berührung ist es wichtig die einzelnen Imagetypen unterscheiden zu können. Wir haben im vorherigen Punkt ein zImage generiert, doch was bedeutet das genau?

  • Image

    Hierbei handelt es sich um eine „generic Linux Kernel Binary Image file“. Dieser Imagetyp ist nicht komprimiert, was beim Startvorgang die Bootzeit reduziert.

  • zImage

    Das zImage ist eine komprimierte Version, in seinem Header ist ein Dekomprimierungstool eingebaut das der Prozessor liest und damit das Image entpacken kann. Reduzierte Dateigröße aber höhere Bootzeit

  • uImage

    Dieser Imagetyp hat einen integrierten U-Boot wrapper (hinzugefügt durch mkimage), dieser enthält den OS-typ und spezielle Informationen für den Bootloader.