8.10. Å kompilere en kjerne
Kjernene som Debian leverer har med flest mulig funksjoner, samt et maksimalt antall drivere, for å dekke det bredeste spekteret av eksisterende maskinvareoppsett. Dette er grunnen til at noen brukere foretrekker å rekompilere kjernen for bare å 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 «går ned» til vekselminne, siden det er selve RAM den bruker), som kan redusere den totale systemytelsen. En lokalt utarbeidet kjerne kan også begrense risikoen for sikkerhetsproblemer siden bare 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 rent, eller utplasseres på flere maskiner. Videre, skriptene knyttet til disse pakkene automatiserer samspillet med oppstartslasteren og initrd-generatoren.
Oppstrøms Linux-kilder inneholder alt som trengs for å bygge en Debian-pakke fra kjernen, men du trenger fortsatt å installere build-essential for å sikre at du har de verktøyene som kreves for å bygge en Debian-pakke. Videre, oppsettssteget for kjernen krever pakken libncurses5-dev. Til slutt vil pakken fakeroot se til at Debian-pakken lages uten at administratorrettigheter benyttes.
8.10.2. Å skaffe kildekoden
Like anything that can be useful on a Debian system, the Linux kernel sources are available in a package. To retrieve them, just install the
linux-source-version package. The
apt search ^linux-source
command lists the various kernel versions packaged by Debian. The latest version is available in the
Unstable distribution: you can retrieve them without much risk (especially if your APT is configured according to the instructions of
Seksjon 6.2.6, «Å arbeide med flere distribusjoner»). Note that the source code contained in these packages does not correspond precisely with that published by Linus Torvalds and the kernel developers; like all distributions, Debian applies a number of patches, which might (or might not) find their way into the upstream version of Linux. These modifications include backports of fixes/features/drivers from newer kernel versions, new features not yet (entirely) merged in the upstream Linux tree, and sometimes even Debian specific changes.
The remainder of this section focuses on the 4.19 version of the Linux kernel, but the examples can, of course, be adapted to the particular version of the kernel that you want.
We assume the linux-source-4.19 package has been installed. It contains /usr/src/linux-source-4.19.tar.xz
, a compressed archive of the kernel sources. You must extract these files in a new directory (not directly under /usr/src/
, since there is no need for special permissions to compile a Linux kernel): ~/kernel/
is appropriate.
$
mkdir ~/kernel; cd ~/kernel
$
tar -xaf /usr/src/linux-source-4.19.tar.xz
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ålene.
Ved rekompilering til en nyere versjon av kjernen (muligens med en ytterligere programfiks), vil oppsettet mest sannsynlig bli holdt så nær som mulig opptil det som er foreslått av Debian. 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, som kan finnes med uname -r
-kommandoen) til en .config
-fil i mappen som inneholder kjernekildekoden.
$
cp /boot/config-4.19.0-5-amd64 ~/kernel/linux-source-4.19/.config
Hvis du ikke trenger å endre oppsettet, kan du stoppe her og gå til
Seksjon 8.10.4, «Kompilere og bygge pakken». Hvis du på den andre siden trenger å endre den, eller hvis du bestemmer deg for å endre oppsettet alt 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 target
-kommandoen, der
mål er en av verdiene beskrevet nedenfor.
make menuconfig
kompilerer og starter opp et tekst-grensesnitt (det er derfor libncurses5-dev-pakken er nødvendig) som gjør det mulig å navigere mellom de tilgjengelige alternativene i en hierarkisk struktur. Å trykke på Space-tasten endrer verdien for det valgte alternativet, og Enter validerer knappen som er valgt nederst på skjermen; Select returnerer til den valgte undermenyen; Exit lukker den aktuelle skjermen og flytter tilbake opp i hierarkiet; Help vil vise mer detaljert informasjon om rollen til det valgte alternativet. Piltastene lar deg flytte rundt i listen over alternativer og knapper. For å gå ut av oppsettsprogrammet velger du Exit fra hovedmenyen. Programmet tilbyr deg så å lagre endringene du har gjort; Godta hvis du er fornøyd med dine valg.
Andre grensesnitt har lignende funksjoner, men de arbeider innenfor mer moderne grafiske grensesnitt; slik som make xconfig
som bruker et Qt grafisk brukergrensesnitt, og make gconfig
som bruker GTK+. Det første krever libqt4-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 standardoppsett. Kjernen gir slike oppsett i arch/arch/configs/*_defconfig
, og du kan sette inn dit valgte oppsett med en kommando som make x86_64_defconfig
(for en 64-bit PC), eller make i386_defconfig
(for en 32-bit PC).
8.10.4. Kompilere og bygge pakken
Når kjerneoppsettet er klart, vil en enkel make deb-pkg
generere opptil 5 Debian-pakker: linux-image-versjon som inneholder kjernebildet med tilhørende moduler, linux-headers-versjon som inneholder headerfilene som er nødvendig for å bygge eksterne moduler, linux-firmware-image-versjon som inneholder fastvarefilene som trengs av noen drivere (kanskje mangler denne pakken når du bygger fra Debians kildekode), linux-image-versjon-dbg med feilsøkingssymboler for kjernebildet og dets moduler, og linux-libc-dev som inneholder headere som er aktuelle for noen brukerland-biblioteker slik som GNU glibc.
versjon er definert av sammenkjeding av oppstrøms versjonen (som definert av variablene VERSION
, PATCHLEVEL
, SUBLEVEL
, og EXTRAVERSION
i Makefile
), fra LOCALVERSION
- konfiguasjonsparameteret, og fra LOCALVERSION
-miljøvariabel. 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-4.19.37-falcot_4.19.37-1_amd64.deb
../linux-image-4.19.37-falcot_4.19.37-1_amd64.deb
../linux-libc-dev_4.19.37-1_amd64.deb
8.10.5. Å kompilere eksterne moduler
Some modules are maintained outside of the official Linux kernel. To use them, they must be compiled alongside the matching kernel. A number of common third party modules are provided by Debian in dedicated packages, such as vpb-driver-source (extra modules for Voicetronix telefony hardware) or leds-alix-source (driver of PCEngines ALIX 2/3 boards).
These packages are many and varied, apt-cache rdepends module-assistant$
can show the list provided by Debian. However, a complete list isn't particularly useful since there is no particular reason for compiling external modules except when you know you need it. In such cases, the device's documentation will typically detail the specific module(s) it needs to function under Linux.
For example, let's look at the dahdi-source package: after installation, a .tar.bz2
of the module's sources is stored in /usr/src/
. While we could manually extract the tarball and build the module, in practice we prefer to automate all this using DKMS. Most modules offer the required DKMS integration in a package ending with a -dkms
suffix. In our case, installing dahdi-dkms is all that is needed to compile the kernel module for the current kernel provided that we have the linux-headers-* package matching the installed kernel. For instance, if you use linux-image-amd64, you would also install linux-headers-amd64.
$
sudo apt install dahdi-dkms
[...]
Setting up xtables-addons-dkms (2.12-0.1) ...
Loading new xtables-addons-2.12 DKMS files...
Building for 4.19.0-5-amd64
Building initial module for 4.19.0-5-amd64
Done.
dahdi_dummy.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/4.19.0-5-amd64/updates/dkms/
[...]
DKMS: install completed.
$
sudo dkms status
dahdi, DEB_VERSION, 4.19.0-5-amd64, x86_64: installed
$
sudo modinfo dahdi_dummy
filename: /lib/modules/4.19.0-5-amd64/updates/dkms/dahdi_dummy.ko
license: GPL v2
author: Robert Pleh <robert.pleh@hermes.si>
description: Timing-Only Driver
[...]
8.10.6. Å bruke en kjernefiks
Enkelte funksjoner er ikke inkludert i standard-kjernen på grunn av mangel på modenhet, eller noe uenighet mellom vedlikeholdere av kjernen. Slike funksjoner kan deles ut som programfikser som man så fritt kan anvende i kildekoden.
Debian sometimes provides some of these patches in linux-patch-* packages but they often don't make it into stable releases (sometimes for the very same reasons that they are not merged into the official upstream kernel). These packages install files in the /usr/src/kernel-patches/
directory.
Hvis du vil bruke en eller flere av disse installerte programfikser, bruker du patch
-kommandoen i kildekatalogen, og starter deretter kompilering av kjernen som beskrevet ovenfor.
$
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
å mislykkes når du bruker dem til kildekode. En feilmelding vises, og gir noen detaljer om feilen. I dette tilfellet kan du se 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 som programfiksen er tiltenkt.