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