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 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 kjernen koden 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 den 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, konfigurasjonstrinnet for kjernen krever libncurses5-dev-pakken. Til slutt vil fakeroot-pakken se til at Debian-pakken lages uten at administratorrettigheter benyttes.
Som alt som kan være nyttig i et Debian-system, Linux-kjernens kilder er tilgjengelig i en pakke. For å hente dem, bare installer
linux-source-version-pakken.
apt-cache search ^linux-source
kommando viser de ulike kjerneversjoner versjoner pakket av Debian. Den nyeste versjonen er tilgjengelig i
Unstable -distribusjonen. Du kan hente dem uten mye risiko (spesielt hvis APT er konfigurert i henhold til instruksjonene fra
Seksjon 6.2.6, «Å arbeide med flere distribusjoner»). Merk at kildekoden som finnes i disse pakkene ikke samsvarer nøyaktig med det som er publisert av Linus Torvalds og kjerneutviklere. Som alle distribusjoner, bruker Debian en rekke programfikser, som kan (eller kanskje ikke) finner sin vei inn i oppstrømsversjoner av Linux. Disse endringene omfatter backports av rettinger/funksjoner/drivere fra nyere kjerneversjoner, nye funksjoner som ikke ennå er (helt) fusjonert inn i det oppstrøms Linux-treet, og noen ganger til og med konkrete endringer i Debian.
Resten av dette avsnittet fokuserer på 3.16-versjonen av Linux-kjernen, men eksemplene kan selvsagt tilpasses den spesielle versjonen av kjernen som du ønsker.
Vi går ut fra at linux-source-3.16-pakken er blitt installert. Den inneholder /usr/src/linux-source-3.16.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-3.16.tar.xz
8.10.3. Å konfiguere kjernen
Det neste trinnet består i å konfigurere 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 konfigurasjonen mest sannsynligvis bli holdt så nær som mulig opptil det som er foreslått av Debian. I dette tilfellet, og i stedet for å konfigurere 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
-komandoen) til en .config
-fil i mappen som inneholder kjernekildekoden.
$
cp /boot/config-3.16.0-4-amd64 ~/kernel/linux-source-3.16/.config
Hvis du ikke trenger å endre konfigurasjonen, 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 å rekonfigurere alt fra bunnen av, må du ta deg tid til å konfigurere kjernen. Det finnes ulike egne grensesnitt i kjernens kildekatalog som kan brukes med
make target
-kommandoen, der
target er en av verdiene beskrevet nedenfor.
make menuconfig
kompilerer og kjører i et tekst-grensesnitt (det er der 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 tillater flytting på listen over alternativer og knapper. For å gå ut av konfigurasjonsprogrammet, 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
sin 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 konfigurasjonsgrensesnittene, er det alltid en god idé å starte fra en fornuftig standardkonfigurasjon. Kjernen gir slike konfigurasjoner i arch/arch/configs/*_defconfig
, og du kan sette inn din valgte konfigurasjonen 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 kjernekonfigurasjonen er klar, vil en enkelmake deb-pkg
genrerer oppp til 5 Debian pakker: linux-image-version som inneholder kjernebildet med tilhørende moduler, linux-headers-version som inneholder toppteksene som er nødvendig for å bygge eksterne moduler, linux-firmware-image-version som inneholder maskinvarefilene som trengs av noen drivere (kanskje mangler denne pakken når du bygger fra Debians kildekode), linux-image-version-dbg med feilsøkingsymboler for kjernebildet og dets moduler, og linux-libc-dev som inneholder overskrifter som passer for noen brukerområde-biblioteker slik som GNU glibc.
version 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 versjonstreng med en tilføyd revisjon som regelmessig økes (og lagres i .version
), bortsett fra hvis du overstyre den med KDEB_PKGVERSION
-miljøvariablen.
$
make deb-pkg LOCALVERSION=-falcot KDEB_PKGVERSION=$(make kernelversion)-1
[...]
$
ls ../*.deb
../linux-headers-3.16.7-ckt4-falcot_3.16.7-1_amd64.deb
../linux-image-3.16.7-ckt4-falcot_3.16.7-1_amd64.deb
../linux-image-3.16.7-ckt4-falcot-dbg_3.16.7-1_amd64.deb
../linux-libc-dev_3.16.7-1_amd64.deb
8.10.5. Å kompilere eksterne moduler
Noen moduler er holdt utenfor den offisielle Linux-kjernen. Hvis du vil bruke dem, må de kompileres sammen med tilhørende kjernen. En rekke vanlige tredjepartsmoduler leveres av Debian i egne pakker, for eksempel xtables-addons-source (ekstra moduler for iptables) eller oss4-source (Open Sound System, noen alternative lyd-drivere).
Disse eksterne pakkene er mange og varierte, og vi vil ikke liste dem alle her. Med apt-cache search source$
-kommandoen kan innskrenke søkeområdet. Imidlertid er en komplett liste ikke spesielt nyttig siden det ikke er noen spesiell grunn for å kompilere eksterne moduler, unntatt når du vet at du trenger det. I slike tilfeller vil enhetens dokumentasjon vanligvis gi detaljene for de spesifikke modulen(e) det er behov for, for å virke under Linux.
For eksempel, la ås se på xtables-addons-source-pakken: Etter installasjonen, blir en .tar.bz2
fra modulens kildekode lagret i /usr/src/
. Mens vi manuelt kan trekke ut tar-ballen og bygge modulen, foretrekker vi i praksis automatisere alt dette ved hjelp av DKMS. De fleste moduler gir den nødvendige DKMS-integrering i en pakke som slutter med en -dkms
-endelse. I vårt tilfelle, er å installere xtables-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å installere linux-headers-amd64.
$
sudo apt install xtables-addons-dkms
[...]
Setting up xtables-addons-dkms (2.6-1) ...
Loading new xtables-addons-2.6 DKMS files...
First Installation: checking all kernels...
Building only for 3.16.0-4-amd64
Building initial module for 3.16.0-4-amd64
Done.
xt_ACCOUNT:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.16.0-4-amd64/updates/dkms/
[...]
DKMS: install completed.
$
sudo dkms status
xtables-addons, 2.6, 3.16.0-4-amd64, x86_64: installed
$
sudo modinfo xt_ACCOUNT
filename: /lib/modules/3.16.0-4-amd64/updates/dkms/xt_ACCOUNT.ko
license: GPL
alias: ipt_ACCOUNT
author: Intra2net AG <opensource@intra2net.com>
description: Xtables: per-IP accounting for large prefixes
[...]
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 distribuerer noen av disse programfiksene i linux-patch-* eller kernel-patch-* packages (for eksempel, linux-patch-grsecurity2, som sttrammer inn på noe på sikkerhetshensynet for kjernen). Disse pakkene installerer filer i /usr/src/kernel-patches/
-mappen.
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-3.16
$
make clean
$
zcat /usr/src/kernel-patches/diffs/grsecurity2/grsecurity-3.0-3.17.1-201410250027.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.