Kernel kompilieren und installieren

Datum

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

Autor
Kategorien Linux

PRTG Map