Hier will ich mal zeigen wie man einen aktuellen Kernel selbst kompilliert und installiert.
Die aktuellste (Vanilla)Kernel-Version findet man auf kernel.org.
Erklärung „Vanillia“ Als Vanilla-Kernel bezeichnet man einen (Referenz)kernel ohne weitere Extras (im Gegensatz zu dem Kernel einer Linux-Distro)
Vorbereitungen
Meine aktuell verwendeter Kernel: 4.4.0-116-generic (Ubuntu 16.04.4 LTS)
Wir beginnen damit, dass wir uns den gewünschten Kernel von kernel.org. und die passende Signatur herunterladen.
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.15.13.tar.xz https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.15.13.tar.sign
Nun prüfen wir ob die das heruntergeladene Archiv auch zu der Signatur passt, dazu benötigt man (unter Ubuntu) noch ein paar zusätzliche Pakete:
apt install xz-utils
apt install gnupg2
des weiteren benötigen wir noch die Pakete make, build-essential, libncurses5-dev, libssl-dev, bc und libelf-dev:
apt install make build-essential libncurses5-dev libssl-dev bc libelf-dev
Da die Signatur für das .tar-Archiv ist, müssen wir zuerst das xz-Archiv einmal entpacken, damit das tar-Archiv verfügbar wird:
unxz linux-4.15.13.tar.xz
Das entpacken und überprüfen lässt sich auch in einem Befehl zusammenfassen:
root@ubuntu:~# xz -cd linux-4.15.13.tar.xz | gpg2 --verify linux-4.15.13.tar.sign -
gpg: Signatur vom Sa 24 Mär 2018 11:03:04 CET mittels RSA-Schlüssel ID 6092693E
gpg: Signatur kann nicht geprüft werden: Kein öffentlicher Schlüssel
Hier fehlt scheinbar noch der öffentliche Schlüssel…
In diesem Fall holen wir uns die öffentlichen Schlüssel (mit der ID 6092693E) mit dem Befehl:
root@ubuntu:~# gpg2 --recv-key 6092693E
gpg: Schlüssel 6092693E: Öffentlicher Schlüssel "Greg Kroah-Hartman (Linux kernel stable release signing key) <greg@kroah.com>" importiert
gpg: Schlüssel 6092693E: Öffentlicher Schlüssel "Greg Kroah-Hartman <gregkh@linuxfoundation.org>" importiert
gpg: keine ultimativ vertrauenswürdigen Schlüssel gefunden
gpg: Anzahl insgesamt bearbeiteter Schlüssel: 2
gpg: importiert: 2
Nun sollte auch die Überprüfung der Signatur endlich erfolgreich sein:
root@ubuntu:~# gpg2 --verify linux-4.15.13.tar.sign
gpg: die unterzeichneten Daten sind wohl in 'linux-4.15.13.tar'
gpg: Signatur vom Sa 24 Mär 2018 11:03:04 CET mittels RSA-Schlüssel ID 6092693E
gpg: Korrekte Signatur von "Greg Kroah-Hartman <gregkh@linuxfoundation.org>" [unbekannt]
gpg: alias "Greg Kroah-Hartman <gregkh@kernel.org>" [unbekannt]
gpg: alias "Greg Kroah-Hartman (Linux kernel stable release signing key) <greg@kroah.com>" [unbekannt]
gpg: WARNUNG: Dieser Schlüssel trägt keine vertrauenswürdige Signatur!
gpg: Es gibt keinen Hinweis, daß die Signatur wirklich dem vorgeblichen Besitzer gehört.
Haupt-Fingerabdruck = 647F 2865 4894 E3BD 4571 99BE 38DB BDC8 6092 693E
Wen die angezeigte Warnung stört, der findet die Befehle diese zu beseitigen hier: https://www.kernel.org/category/signatures.html
Als nächsten Schritt entpacken wir das tar-Archiv nach /usr/src/:
tar -vxf linux-4.15.13.tar -C /usr/src/
und wechseln in das Verzeichnis mit cd /usr/src/linux-4.15.13
Kompilieren
Hier können wir, rein prophylaktisch, einen Cleanup mit dem Befehl make mrproper durchführen.
Nun benötigen wir noch eine Konfiguration. Für diese nehmen wir einfach die vom aktuell laufenden System:
cp /boot/config-$(uname -r) ./.config
Da man diese Konfiguration vielleicht nicht 1:1 übernehmen, bzw. einfach ein paar andere Optionen anpassen möchte, bearbeiten wir die Konfiguration (.config) mithilfe des Befehls make menuconfig
Hierbei bedeutet ein M das der entsprechende Support oder Treiber als Modul zur Verfügung steht und ein * bedeutet, dass dies direkt in den Kernel eingebaut wird.
An dieser Stelle kann man, sofern man will, sämtliche Optionen durchgehen und alles entsprechend anpassen (z.B. Module aktivieren/deaktivieren).
Nachdem alle Änderungen in der config gespeichert sind und wir uns wieder in der Bash befinden, können wir dem eigentlichen Kompilier-Vorgang beginnen.
Folgender Aufruf setzt eventuelle neuen Optionen entsprechend der Vorschläge der Kernel-Entwickler:
yes "" | make oldconfig
bzw.
yes "" | make config
Nun starten wir mit einem einfachen make. Man sollte beachten, dass dieser Vorgang, entsprechend der verfügbaren Anzahl an CPUs, eine gewisse Zeit in Anspruch nehmen kann. Man kann mit dem -j Parameter angeben auf wie vielen Kernen kompiliert werden soll. Hat man beispielsweise 4 Kerne zur Verfügung kann man mit make -j 3 gleich 3 Kerne arbeiten lassen.
Im Anschluss daran kompilieren wir die Kernel-Module mit make modules und installieren diese mit make modules_install.
root@ubuntu:/usr/src/linux-4.15.13# make modules
CHK include/config/kernel.release
CHK include/generated/uapi/linux/version.h
CHK include/generated/utsrelease.h
CHK include/generated/bounds.h
CHK include/generated/timeconst.h
CHK include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
DESCEND objtool
CHK scripts/mod/devicetable-offsets.h
Building modules, stage 2.
MODPOST 4501 modules
root@ubuntu:/usr/src/linux-4.15.13# make modules_install
INSTALL drivers/video/backlight/l4f00242t03.ko
INSTALL drivers/video/backlight/lcd.ko
INSTALL drivers/video/backlight/ld9040.ko
INSTALL drivers/video/backlight/lm3533_bl.ko
INSTALL drivers/video/backlight/lm3630a_bl.ko
INSTALL drivers/video/backlight/lm3639_bl.ko
INSTALL drivers/video/backlight/lms283gf05.ko
INSTALL drivers/video/backlight/lms501kf03.ko
INSTALL drivers/video/backlight/lp855x_bl.ko
INSTALL drivers/video/backlight/lp8788_bl.ko
INSTALL drivers/video/backlight/ltv350qv.ko
INSTALL drivers/video/backlight/lv5207lp.ko
INSTALL drivers/video/backlight/max8925_bl.ko
INSTALL drivers/video/backlight/pandora_bl.ko
INSTALL drivers/video/backlight/pcf50633-backlight.ko
INSTALL drivers/video/backlight/platform_lcd.ko
INSTALL drivers/video/backlight/pm8941-wled.ko
INSTALL drivers/video/backlight/pwm_bl.ko
...
INSTALL sound/usb/snd-usb-audio.ko
INSTALL sound/usb/snd-usbmidi-lib.ko
INSTALL sound/usb/usx2y/snd-usb-us122l.ko
INSTALL sound/usb/usx2y/snd-usb-usx2y.ko
INSTALL virt/lib/irqbypass.ko
DEPMOD 4.15.13
ACHTUNG: Es sollte für den Kompilierungsvorgang genug Festplattenplatz zur Verfügung stehen, da während des Kompilierens einige GB belegt werden können. Bei meinem Durchlauf wuchs das Verzeichnis /usr/src/linux-4.15.13/ bis auf 14GB an.
Installation
Der letzte Schritt ist nun make install. Hierbei wird z.B. die Grub-Konfiguration angepasst und die Dateien passend nach /boot kopiert.
Dieser Vorgang geht recht schnell.
root@ubuntu:/usr/src/linux-4.15.13# make install
sh ./arch/x86/boot/install.sh 4.15.13 arch/x86/boot/bzImage \
System.map "/boot"
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.15.13 /boot/vmlinuz-4.15.13
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.15.13 /boot/vmlinuz-4.15.13
update-initramfs: Generating /boot/initrd.img-4.15.13
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.15.13 /boot/vmlinuz-4.15.13
Grub-Konfigurationsdatei wird generiert …
Linux-Abbild gefunden: /boot/vmlinuz-4.15.13
initrd-Abbild gefunden: /boot/initrd.img-4.15.13
Linux-Abbild gefunden: /boot/vmlinuz-4.4.0-116-generic
initrd-Abbild gefunden: /boot/initrd.img-4.4.0-116-generic
Linux-Abbild gefunden: /boot/vmlinuz-4.4.0-87-generic
initrd-Abbild gefunden: /boot/initrd.img-4.4.0-87-generic
erledigt
Ein Blick in die passende Grub-Konfigurationsdatei zeigt, dass hier nun ein entsprechender Eintrag vorhanden ist:
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-1b6729b4-e38f-4d1e-8d95-3475e7419a27' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 6ba7e77a-cde4-46f0-9e00-36751a209e66
else
search --no-floppy --fs-uuid --set=root 6ba7e77a-cde4-46f0-9e00-36751a209e66
fi
linux /vmlinuz-4.15.13 root=/dev/mapper/ubuntu--vg-root ro
initrd /initrd.img-4.15.13
}
Nach dem Neustart des Systems lässt sich nun der entsprechende Eintrag im Grub-Menü auswählen:
Und auf dem System selber:
root@ubuntu:~# uname -r
4.15.13
