Product SiteDocumentation Site

8.10. Kompilering av en kjerne

Kjernene som Debian leverer har med flest mulig funksjoner, samt et maksimalt antall drivere, for å dekke bredest mulig spekter av eksisterende maskinvareoppsett. Dette er grunnen til at noen brukere foretrekker å rekompilere kjernen for å ta med det de spesifikt trenger. Det er to grunner for dette valget. For det første kan det være å optimalisere minneforbruk, ettersom kjernekoden (selv om den aldri blir brukt) opptar minne uten nytteverdi (og aldri flyttes til vekselminne, siden det er selve minnet den bruker), som kan redusere den totale systemytelsen. En lokalt utarbeidet kjerne kan også begrense risikoen for sikkerhetsproblemer siden kun en brøkdel av kjernekoden er kompilert og kjører.
Rekompilering av kjernen er også nødvendig hvis du ønsker å bruke bestemte funksjoner som bare er tilgjengelig som programfikser (og ikke er med i standardversjonen av kjernen).

8.10.1. Introduksjon og forutsetninger

Ikke overraskende håndterer Debian kjernen i form av en pakke, som ikke er hvordan kjerner tradisjonelt har blitt kompilert og installert. Siden kjernen forblir under kontroll av pakkesystemet, kan den således fjernes på renslig vis, eller utrulles på flere maskiner. Videre automatiserer skriptene knyttet til disse pakkene samspillet med oppstartslasteren og initrd-generatoren.
Oppstrøms-Linux-kilder inneholder alt som trengs for å bygge en Debian-pakke av kjernen, men du trenger fortsatt å installere build-essential for å forsikre at du har de verktøyene som kreves. Videre, oppsettssteget for kjernen krever pakken libncurses-dev-pakken (tidligere libncurses5-dev, som nå er en overgangspakke). Til slutt vil pakken fakeroot se til at Debian-pakken kan skapes uten at administratorrettigheter benyttes.

8.10.2. Henting av kildekode

Som alt som kan være nyttig i et Debian-system, er Linux-kjernens kildekode tilgjengelig i en pakke. For å hente dem kan du installere pakken linux-source-versjon. Kommandoen apt search ^linux-source viser de ulike kjerneversjonene pakket av Debian. Den nyeste versjonen er tilgjengelig i Unstable-distribusjonen. Du kan hente dem uten særlig risiko (spesielt hvis APT er satt opp i henhold til instruks fra Seksjon 6.2.6, «Å arbeide med flere distribusjoner»). Merk at kildekoden som finnes i disse pakkene ikke er identisk med den som er publisert av Linus Torvalds og kjerneutviklere. Som alle distribusjoner, bruker Debian en rekke programfikser, som finne sin vei inn i oppstrømsversjoner av Linux (eller forblir der de er). Disse endringene omfatter tilbakeføringer av rettinger/funksjoner/drivere fra nyere kjerneversjoner, nye funksjoner som ikke ennå er (helt) tatt inn i oppstrøms-Linux-treet, og noen ganger til og med Debian-spesifikke endringer.
Resten av dette avsnittet fokuserer på 5.10-versjonen av Linux-kjernen, men eksemplene kan selvsagt tilpasses den versjonen av kjernen du ønsker å ha med å gjøre.
Hvis linux-source-5.10-pakken er installert inneholder /usr/src/linux-source-5.10.tar.xz et komprimert arkiv av kjernens kilder. Du må pakke ut disse filene i en ny katalog (ikke direkte under /usr/src/, siden det ikke er behov for spesielle tillatelser for å lage en Linux-kjerne): ~/kernel/ er hensiktsmessig.
$ mkdir ~/kernel; cd ~/kernel
$ tar -xaf /usr/src/linux-source-5.10.tar.xz
For å bygge en kjerne fra jomfruelige kilder kan du laste ned tjæreballen av versjonen du vil ha fra kernel.org, bekrefte integriteten etter å ha importert kjernevedlikeholderens nøkkel, og så fortsette som beskrevet i de følgende kapitlene.

$ wget https://kernel.org/pub/linux/kernel/v5.x/linux-5.10.62.tar.xz
[..]
$ wget https://kernel.org/pub/linux/kernel/v5.x/linux-5.10.62.tar.sign
[..]
$ unxz -c linux-5.10.62.tar.xz | gpg --verify linux-5.10.62.tar.sign -
gpg: Signatur opprettet fr. 03. sep. 2021 kl. 10.11 +0200 CEST
gpg:                bruker RSA nøkkel 647F28654894E3BD457199BE38DBBDC86092693E
gpg: God signatur fra «Greg Kroah-Hartman <gregkh@linuxfoundation.org>» [ukjent]
gpg:                 aka «Greg Kroah-Hartman (Linux kernel stable release signing key) <greg@kroah.com>» [ukjent]
gpg:                 aka «Greg Kroah-Hartman <gregkh@kernel.org>» [ukjent]
gpg: Advarsel: Denne nøkkelen er ikke signert med en betrodd signatur.
gpg:          Det finnes ingen indikasjon på at signaturen tilhører eieren.
Hovednøkkelfingeravtrykk: 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E

8.10.3. Å konfiguere kjernen

Det neste steget består i å sette opp kjernen etter dine behov. Den nøyaktige fremgangsmåten avhenger av målsetningene.
Ved rekompilering til en nyere versjon av kjernen (muligens med en ytterligere programfiks), vil oppsettet mest sannsynlig tilnærmingsvis være så likt det foreslått av Debian som mulig. I dette tilfellet, og i stedet for å sette opp alt fra bunnen av, er det tilstrekkelig å kopiere /boot/config-version-filen (som er versjonen til den kjernen som brukes i dag, og som kan tas rede på med uname -r-kommandoen) til en .config-fil i mappen som inneholder kjernekildekoden. Sørg for å ha lest TIP Manglende debian/certs/debian-uefi-certs.pem-sidefeltet.
$ cp /boot/config-5.10.0-8-amd64 ~/kernel/linux-source-5.10/.config
Hvis du ikke trenger å endre oppsettet, kan du stoppe her og gå til Seksjon 8.10.4, «Kompilering og bygging av pakken». Hvis du derimot trenger å endre det, eller hvis du bestemmer deg for å endre det fra bunnen av, må du ta deg tid til å sette opp kjernen. Det finnes ulike egne grensesnitt i kjernens kildekatalog som kan brukes med make mål-kommandoen, der mål er en av verdiene beskrevet nedenfor.
make menuconfig compiles and executes a text-mode interface (this is where the libncurses-dev package is required) which allows navigating the options available in a hierarchical structure. Pressing the Space key changes the value of the selected option, and Enter validates the button selected at the bottom of the screen; Select returns to the selected sub-menu; Exit closes the current screen and moves back up in the hierarchy; Help will display more detailed information on the role of the selected option. The arrow keys allow moving within the list of options and buttons. To exit the configuration program, choose Exit from the main menu. The program then offers to save the changes you've made; accept if you are satisfied with your choices.
Andre grensesnitt har lignende funksjoner, men de fungerer innenfor mer moderne grafiske grensesnitt; slik som make xconfig som bruker et grafisk (Qt-) brukergrensesnitt, og make gconfig som bruker GTK. Førstnevnte krever qtbase5-dev, mens det andre er avhengig av libglade2-dev, og libgtk2.0-dev.
Når du bruker et av disse oppsettsgrensesnittene, er det alltid en god idé å starte fra et fornuftig forvalgsoppsett. Kjernen tilbyr slike i arch/arch/configs/*_defconfig, og du kan instrumentere inn ditt valgte oppsett med en kommando som make x86_64_defconfig (for en 64-biters PC), eller make i386_defconfig (for en 32-biters PC).

8.10.4. Kompilering og bygging av pakken

Når kjerneoppsettet er ferdig, vil en enkel make deb-pkg-kommando generere opp til 5 Debian-pakker:
linux-image-versjon
inneholder kjene-avtrykk og tilknyttede moduler,
linux-headers-versjon
inneholder hodefiler som kreves for bygging av eksterne moduler,
linux-firmware-image-versjon
inneholder fastvarefiler som trengs av noen driverrutiner (denne pakken kan mangle når du bygger fra kjernekildene som tilbys av Debian),
linux-image-versjon-dbg
inneholder avlusingssymbolene for kjerneavtrykket og dets moduler (opprettes kun hvis CONFIG_DEBUG_INFO=y), og
linux-libc-dev
inneholder hoder relevante for brukerområdebibliotek, som f.eks. GNU glibc.
versjon er definert av sammenkjeding av oppstrømsversjonen (som definert av variablene VERSION, PATCHLEVEL, SUBLEVEL, og EXTRAVERSION i Makefile), fra LOCALVERSION- oppsettsparameteret, og fra LOCALVERSION-miljøvariabelen. Pakkeversjonen gjenbruker samme versjonsstreng med en tilføyd revisjon som regelmessig økes (og lagres i .version), bortsett fra hvis du overstyrer den med KDEB_PKGVERSION-miljøvariablen.
$ make deb-pkg LOCALVERSION=-falcot KDEB_PKGVERSION=$(make kernelversion)-1
[...]
$ ls ../*.deb
../linux-headers-5.10.46-falcot_5.10.46-1_amd64.deb
../linux-image-5.10.46-falcot_5.10.46-1_amd64.deb
../linux-image-5.10.46-falcot-dbg_5.10.46-1_amd64.deb
../linux-libc-dev_5.10.46-1_amd64.deb
Hele prosessen krever rundt 20 GB ledig plass, minst 8 GB minne, og flere timer avsatt til kompilering (ved bruk av én kjerne) for standard AMD64-variant av Debian-kjernen. Disse kravene kan reduseres drastisk ved å skru av avlusingsinfo ved å sette CONFIG_DEBUG_INFO=n, men dette vil gjøre det umulig å spore kjernefeil («oopser») ved bruk av gdb og også stoppe opprettelse av linux-image-versjon-dbg-pakken.

8.10.5. Kompilering av eksterne moduler

Noen moduler er holdt utenfor den offisielle Linux-kjernen. Hvis du vil bruke dem, må de kompileres sammen med den tilhørende kjernen. En rekke vanlige tredjepartsmoduler leveres av Debian i egne pakker, for eksempel vpb-driver-source (ekstra moduler for Voicetronix-telefonimaskinvare), eller leds-alix-source (driverrutine for PCEngines ALIX 2/3 boards).
Disse pakkene er mangeslungne, apt-cache rdepends module-assistant$ viser listen levert av Debian. Imidlertid er en komplett liste ikke spesielt nyttig siden det ikke er noen spesiell grunn til å kompilere eksterne moduler, annet enn når du vet at du trenger det. I slike tilfeller vil enhetens dokumentasjon vanligvis angi de spesifikke modulen(e) den trenger for å virke i Linux|GNU.
La oss for eksempel se på dahdi-source-pakken: Etter installasjon, blir en .tar.bz2 fra modulens kildekode lagret i /usr/src/. Mens man manuelt kan pakke ut tjæreballen og bygge modulen, er detforetrekket i praksis å automatisere alt dette ved hjelp av DKMS-rammeverket (dynamisk kjernemodulstøtte). De fleste moduler tilbyr nødvendig DKMS-integrering i en pakke som har -dkms-endelse. I vårt tilfelle er det å installere dahdi-addons-dkms alt som trengs for å kompilere kjernemodulen til den nåværende kjernen, forutsatt at vi har linux-headers-*-pakken som samsvarer med den installerte kjernen. For eksempel, hvis du bruker linux-image-amd64, ville du også måtte installere linux-headers-amd64.
$ sudo apt install dahdi-dkms
[...]
Setting up dkms (2.8.4-3) ...
Setting up linux-headers-5.10.0-8-amd64 (5.10.46-4) ...
/etc/kernel/header_postinst.d/dkms:
dkms: running auto installation service for kernel 5.10.0-8-amd64:.
Setting up dahdi-dkms (1:2.11.1.0.20170917~dfsg-7.4) ...
Loading new dahdi-2.11.1.0.20170917~dfsg-7.4 DKMS files...
Building for 5.10.0-8-amd64
Building initial module for 5.10.0-8-amd64
Done.

dahdi_dummy.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/5.10.0-8-amd64/updates/dkms/

dahdi_dynamic_eth.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/5.10.0-8-amd64/updates/dkms/

[...]
DKMS: install completed.
$ sudo dkms status
dahdi, 2.11.1.0.20170917~dfsg-7.4, 5.10.0-8-amd64, x86_64: installed
$ sudo modinfo dahdi_dummy
filename:       /lib/modules/5.10.0-8-amd64/updates/dkms/dahdi_dummy.ko
license:        GPL v2
author:         Robert Pleh <robert.pleh@hermes.si>
description:    Timing-Only Driver
depends:        dahdi
retpoline:      Y
name:           dahdi_dummy
vermagic:       5.10.0-8-amd64 SMP mod_unload modversions 
parm:           debug:int

8.10.6. Iførelse av en kjernefiks

Enkelte funksjoner er ikke inkludert i standard-kjernen fordi de ikke er modnet, eller noe uenighet mellom vedlikeholdere av kjernen. Slike funksjoner kan deles ut som programfikser som man så fritt kan anvende i kildekoden.
Debian tilbyr noen av disse programfiksene i linux-patch-*-pakker, men ofte kommer de ikke med i de stabile utgivelsene (som naturlig kan skrive seg til grunnen til at de ikke er lagt inn i den offisielle oppstrømskjernen). Disse pakkene installerer filer i /usr/src/kernel-patches/-mappen.
Hvis du vil bruke én eller flere av disse installerte programfiksene, bruker du patch-kommandoen i kildekatalogen, og starter deretter kompilering av kjernen som beskrevet ovenfor. Følgende viser et gammelt eksempel som bruker linux-patch-grsecurity2 og linux-source-4.9.
$ cd ~/kernel/linux-source-4.9
$ make clean
$ zcat /usr/src/kernel-patches/diffs/grsecurity2/grsecurity-3.1-4.9.11-201702181444.patch.gz | patch -p1
Merk at en gitt programfiks kanskje ikke nødvendigvis fungerer med alle versjoner av kjernen; Det er mulig for patch å misslykkes når du bruker dem til kjerne-kildekode. En feilmelding vises, og gir noen detaljer om feilen. I dette tilfellet kan du ta rede på om dokumentasjonen om denne oppdateringen er tilgjengelig i Debian-pakken (i /usr/share/doc/linux-patch-*/ directory). I de fleste tilfeller indikerer vedlikeholderen hvilke kjerneversjoner programfiksen er tiltenkt.