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.