Compile And Install Kernel



In diesem Artikel möchte ich erklären wie ihr euch euren eigenen Kernel in Linux Debian kompiliert.

Inhaltsverzeichnis


Download Kernel
Verify Kernel Signature
Installing Required Packages
Building Kernel
Compiling Kernel

Download Kernel



Als erstes finden wir heraus, welcher Kernel denn auf unserer Maschiene bereits installiert ist.

# uname -a 

or
# uname -mrns


i.e. Output:
Linux MilesPrower-debian 4.2.6-linux-4.2.6 x86_64


-s : Print Operating System (‘Linux’, Here).
-n : Print System Hostname (‘MilesPrower-debian’, Here).
-r : Print Kernel Version (‘4.2.6-linux-4.2.6’, Here).
-m : Print Hardware Instruction Set (‘x86_64’, Here).


Als nächstes laden wir uns die neueste stabile Version des Kernel herunter
https://www.kernel.org

Der Downloadlink wird am besten kopiert und per wget ausgeführt
# wget https://www.kernel.org/pub/linux/kernel/vx.x/linux-x.xx.tar.xz



Verify Kernel Signature


Nachdem das KernelImage heruntergeladen ist, sollte zusätzlich die Signature noch runtergeladen werden.
# wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.16.tar.sign

Entpackt das Image
# unxz linux-x.xx.tar.xz

Ladet am besten gleich den Public Key mit herunter, falls dieser im nächsten Schritt nicht automatisch erkannt wird
# gpg --recv-keys  00411886

Als nächstes Können wir das Image verifizieren
gpg --verify linux-x.xx.tar.sign



Installing Required Packages


Bevor wir den Kernel kompilieren sollten wir dringend folgende Programme und Bibliotheken auf unserem Debian installieren.
# apt-get install libncurses5-dev
# apt-get install fakeroot
# apt-get install kernel-package
# apt-get install binutils
# apt-get install libc6-dev
# apt-get install gcc
# apt-get install make
# apt-get install bin86
 
--Optional sollten aber trotzdem mit installiert werden
 
# apt-get install libncurses5-dev
# apt-get install tkstep8.0-dev
# apt-get install kernel-package



Building Kernel


Nachdem alle Programme installiert wurden, bewegen wir uns in das Arbeitsverzeichnis hinein (der entpackte Ordner aus dem KernelImage).
# cd linux-x.xx/

Bevor es weitergeht kopieren wir uns nun die .config-Datei des bestehenden Kernel in das aktuelle Verzeichnis
hinein. Die aktuellen KernelImages liegen unter /boot/
# cp /boot/config-"uname -r" .config

"uname -r" ersetzt wird hierbei von der aktuellen Releasenummer des Kernel ersetzt.

Wir werden nun auf Basis der eben kopierten Datei eine neue .config-Datei anlegen. Es gibt dafür mehrere Methoden, da wir extra ncurses installiert haben, werden wir make menu verwenden (eine grafische Oberfläche zum vereinfachten Konfigurieren des Kernel). Also:
# make menuconfig



Nach ein paar Sekunden, wird sich eine Oberfläche aufbauen mit deren Hilfe wir verschiedene Treiber, Module etc. anpassen, hinzufügen und entfernen können. Als ersten Punkt laden wir die kopierte .config des aktuellen Kernel in das Programm hinein. Nun passen wir die .config unseren Wünschen entsprechend an. Da dies ein sehr individueller Prozess ist, muss jeder selbst wissen welche Punkte für ihn entscheidend sind. Die angewählten Punkte werden dann in den Kompilierungsprozess eingebunden. Überflüssige Inhalte werden gecleart und ignoriert.

Wir schließend das Programm und entledigen uns des überflüssigen Contents.
# make-kpkg clean



Compiling Kernel


Der Kompilierungsprozess kann eine sehr große Menge an Zeit in Anspruch nehmen, dies hängt stark von den Resourcen des PCs ab. Es gibt jedoch die Möglichkeit den Kompilierungsprozess mit einem Export des CONCURRENCY_LEVEL zu beschleunigen.
# export CONCURRENCY_LEVEL=X

Wobei X eine Zahl ist, welche sich aus der Anzahl der Kerne bestimmen lässt. Um die Anzahl der vorhanden Kerne zu ermitteln:
# cat /proc/cpuinfo

Sample Output:
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 30
model name      : Intel(R) Core(TM) i7 CPU         870  @ 2.93GHz
stepping        : 5
cpu MHz         : 2945.000
cache size      : 8192 KB
physical id     : 0
siblings        : 8
core id         : 0
 
 
 
cpu cores       : 4
 
 
 
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 11
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe pni dtes64 monitor ds_ 
cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt lahf_lm ida dtherm
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:


Es gibt einige Faustregeln zur Bestimmung des CONCURRENCY_LEVEL.

1 core CONCURRENCY_LEVEL = 1
2 core CONCURRENCY_LEVEL = 3
4 core CONCURRENCY_LEVEL = 5


Also in meinem Fall
# export CONCURRENCY_LEVEL=5


Nun der entscheidene Part: das Image und die Module kompilieren, sowie Headerfiles und *.deb-Pakete erzeugen, wird mittels dieser Zeile realisiert:
# fakeroot make-kpkg --append-to-version "-YOURLINUXNAME" --revision "1" --initrd kernel_image kernel_headers

Und nun wird kompiliert. Dies kann wie gesagt eine sehr lange Zeit in Anspruch nehmen.

...

Nachdem alles fertig kompiliert ist, wurden die für uns relevanten Debian-Packages in das übergeordnete Verzeichnis gelegt. Wenn wir davon ausgehen, dass wir uns noch immer im Arbeitsverzeichnis des entpackten Kernelimages befinden:
# cd ..# ls -l linux-*.deb

Sample Output:
linux-headers-x.xx.x-YOURLINUXNAME_1_amd64.deblinux-image-x.xx.x-YOURLINUXNAME_1_amd64.deb

diese beiden Pakete werden nun mit dem dpkg Paketmanager installiert:
# dpkg -i linux-image-x.xx.x-YOURLINUXNAME_1_amd64.deb# dpkg -i linux-headers-x.xx.x-YOURLINUXNAME_1_amd64.deb

Das praktische daran ist, dass alle relevanten Dateien in die entsprechenden Verzeichnisse kopiert werden. Das bootfähige Image befindet sich nun unter /boot/
# cd /boot/

Dort sollten sich nun 2 neue Dateien befinden. Je nachdem welchen Bootloader ihr verwendet müsst ihr diese nun refreshen. Ich verwende GRUB. Deswegen:
update-grub

Anschließend
# reboot

Beim Booten sollte der Punkt Advanced option angewählt werden, um eine Liste der zur Verfügung stehenden Kernels einzusehen. Selektiere den aktuellsten Kernel um das System zu booten. Nachdem das System gebootet wurde überprüfen wir abschließend noch die aktuelle Kernel Version:
# uname -mrns

Et voilá. Der aktuelle Kernel sollte tatsächlich mit dem eben grade installierten Kernel übereinstimmen.
Viel Spaß.