Product SiteDocumentation Site

8.10. Compilació d'un nucli

Els nuclis proporcionats per Debian inclouen el major nombre possible de característiques, així com el màxim de controladors, per tal de cobrir l'espectre més ample de les configuracions de maquinari existents. Per això alguns usuaris prefereixen recompilar el nucli per tal d'incloure només el que necessiten específicament. Hi ha dues raons per a aquesta elecció. En primer lloc, pot ser per optimitzar el consum de memòria, ja que el codi del nucli, encara que mai s'utilitzi, ocupa memòria per no res (i mai es “baixa” a l'espai d'intercanvi, ja que és RAM real que utilitza), que pot disminuir el rendiment global del sistema. Un nucli compilat localment també pot limitar el risc de problemes de seguretat, ja que només una fracció del codi del nucli està compilat i executat.
La recompilació del nucli també és necessària si voleu utilitzar certes característiques que només estan disponibles com a pedaços (i no estan incloses a la versió estàndard del nucli).

8.10.1. Introducció i prerequisits

No és sorpresa que Debian gestioni el nucli en forma de paquet, fet que no és com els nuclis han estat tradicionalment compilats i instal·lats. Atès que el nucli roman sota el control del sistema d'empaquetament, es pot eliminar de manera neta, o desplegar en diverses màquines. A més, els «scripts» associats amb aquests paquets automatitzen la interacció amb el carregador d'arrencada i el generador initrd.
Les fonts Linux principals contenen tot el necessari per construir un paquet Debian del nucli. Però encara heu d'instal·lar build-essencial per assegurar-vos que teniu les eines necessàries per construir un paquet Debian. A més, el pas de configuració del nucli requereix el paquet libncurses-dev (que abans era libncurses5-dev i ara és un paquet de transició). Finalment, el paquet fakeroot permetrà la creació del paquet Debian sense utilitzar permisos d'administrador.

8.10.2. Obtenir les fonts

Com qualsevol cosa que pugui ser útil en un sistema Debian, les fonts del nucli Linux estan disponibles en un paquet. Per obtennir-les, només cal instal·lar el paquet linux-source-versió. L'ordre apt search ^linux-source llista les diverses versions del nucli empaquetades per Debian. L'última versió està disponible a la distribució Unstable: podeu obtenir-la sense gaire risc (especialment si el vostre APT està configurat d'acord amb les instruccions de Secció 6.2.6, «Treballar amb diverses distribucions»). Tingueu en compte que el codi font contingut en aquests paquets no es correspon exactament amb el publicat per Linus Torvalds i els desenvolupadors del nucli; com totes les distribucions, Debian aplica una sèrie de pedaços que podrien (o no) trobar el seu destí a la versió original de Linux. Aquestes modificacions inclouen retroadaptacions de correccions/característiques/controladors de versions del nucli més recents, noves característiques que encara no s'han fusionat (totalment) a l'arbre Linux principal, i de vegades fins i tot canvis específics de Debian.
La resta d'aquesta secció se centra en la versió 5.10 del nucli Linux, però els exemples poden, per descomptat, ser adaptats a la versió particular del nucli que voleu.
Suposem que s'ha instal·lat el paquet linux-source-5.10. Conté /usr/src/linux-source-5.10.tar.xz, un arxiu comprimit de les fonts del nucli. Heu d'extreure aquests fitxers en un nou directori (no directament sota /usr/src/, ja que no hi ha necessitat de permisos especials per compilar un nucli Linux): ~/kernel/ és apropiat.
$ mkdir ~/kernel; cd ~/kernel
$ tar -xaf /usr/src/linux-source-5.10.tar.xz
Per a crear un nucli a partir de les fonts originals, simplement cal descarregar el «tarball» de la versió desitjada de kernel.org, verificar-ne la integritat després d'importar la clau dels mantenidors del nucli i després procedir tal i com es descriu en els següents capítols.

$ 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: Signature made Fri 03 Sep 2021 10:11:35 AM CEST
gpg:                using RSA key 647F28654894E3BD457199BE38DBBDC86092693E
gpg: Good signature from "Greg Kroah-Hartman <gregkh@linuxfoundation.org>" [unknown]
gpg:                 aka "Greg Kroah-Hartman (Linux kernel stable release signing key) <greg@kroah.com>" [unknown]
gpg:                 aka "Greg Kroah-Hartman <gregkh@kernel.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E

8.10.3. Configurar el nucli

El següent pas consisteix a configurar el nucli segons les vostres necessitats. El procediment exacte depèn dels objectius.
Quan es recompila una versió més recent del nucli (possiblement amb un pedaç addicional), la configuració es mantindrà probablement el més a prop possible de la proposada per Debian. En aquest cas, i en lloc de reconfigurar-ho tot des de zero, n'hi ha prou amb copiar el fitxer /boot/config-versió (la versió és la del nucli actualment utilitzat, que es pot trobar amb l'ordre uname -r) en un fitxer .config al directori que conté les fonts del nucli. En aquest cas, assegureu-vos de llegir la barra lateral SUGGERIMENT Falta debian/certs/debian-uefi-certs.pem.
$ cp /boot/config-5.10.0-8-amd64 ~/kernel/linux-source-5.10/.config
Tret que calgui canviar la configuració, podeu parar aquí i saltar a Secció 8.10.4, «Compilació i creació del paquet». Si cal canviar-la, d'altra banda, o si decidiu reconfigurar-ho tot des de zero, haureu de dedicar temps per configurar el vostre nucli. Hi ha diverses interfícies dedicades al directori de codi font del nucli que es poden utilitzar cridant l'ordre make objectiu, on objectiu és un dels valors descrits tot seguit.
make menuconfig compila i executa una interfície de mode text (aquí és on es requereix el paquet libncurses-dev) que permet navegar per les opcions disponibles en una estructura jeràrquica. En prémer la tecla Espai es canvia el valor de l'opció seleccionada, i Retorn valida el botó seleccionat a la part inferior de la pantalla; Selecciona retorna al submenú seleccionat; Surt tanca la pantalla actual i tira amunt en la jerarquia; Ajuda mostrarà informació més detallada sobre el rol de l'opció seleccionada. Les tecles de fletxa permeten moure's dins de la llista d'opcions i botons. Per sortir del programa de configuració, trieu Surt del menú principal. Llavors el programa ofereix desar els canvis que heu fet; accepteu si esteu satisfets amb les vostres seleccions.
Altres interfícies tenen característiques similars, però funcionen amb interfícies gràfiques més modernes, com ara make xconfig que utilitza una interfície gràfica Qt, i make gconfig que utilitza GTK+. La primera requereix qtbase5-dev, mentre que la segona depèn de libglade2-dev i libgtk2.0-dev.
Quan s'utilitza una d'aquestes interfícies de configuració, sempre és una bona idea començar des d'una configuració predeterminada raonable. El nucli proporciona aquestes configuracions a arch/arquitectura/configs/*_defconfig i podeu posar la configuració seleccionada al lloc amb una ordre com make x86_64_defconfig (en el cas d'un PC de 64 bits) o make i386_defconfig (en el cas d'un PC de 32 bits).

8.10.4. Compilació i creació del paquet

Un cop la configuració del nucli està llesta, un simple make deb-pkg generarà fins a cinc paquets debian:
linux-image-versió
conté la imatge del nucli i els mòduls associats,
linux-headers-versió
conté els fitxers de capçalera requerits per a crear mòduls externs,
linux-firmware-image-versió
conté els fitxers de «firmware» que necessiten alguns controladors (aquest paquet pot no aparèixer quan es genera a partir de les fonts del nucli proveïdes per Debian),
linux-image-versió-dbg
conté els símbols de depuració de la imatge del nucli i dels seus mòduls (només serà creat si CONFIG_DEBUG_INFO=y), i
linux-libc-dev
conté les capçaleres rellevants per a algunes libreries d'espai d'usuari com ara la glibc de GNU.
La versió es defineix per la concatenació de la versió original (definida per les variables VERSION, PATCHLEVEL, SUBLEVEL i EXTRAVERSION al Makefile), del paràmetre de configuració LOCALVERSION, i de la variable d'entorn LOCALVERSION. La versió del paquet reutilitza la mateixa cadena de versió amb una revisió annexada que s'incrementa regularment (i desada a .version), excepte si la sobreescriviu amb la variable d'entorn KDEB_PKGVERSION.
$ 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
El procés complet requereix al voltant de 20 GB d'espai lliure, un mínim de 8 GB de RAM i un grapat d'hores de compilació (usant un sol «core») per un nucli estàndard Debian amd64. Aquests requeriments es poden reduir dràsticament desactivant la informació de depuració usant CONFIG_DEBUG_INFO=n, però això farà impossible rastrejar errors al nucli («oops») usant gdb i evitarà la creació del paquet linux-image-versió-dbg.

8.10.5. Compilació de mòduls externs

Alguns mòduls són mantinguts fora del nucli Linux oficial. Per utilitzar-los, s'han de compilar juntament amb el nucli coincident. Una sèrie de mòduls comuns de tercers són proporcionats per Debian en paquets dedicats, com ara vpb-driver-source (mòduls addicionals per a maquinari de telefonia de Voicetronix) o leds-alix-source (controlador per a plaques PCEngines ALIX 2/3).
Aquests paquets són molts i variats, l'ordre apt-cache rdepends module-assistant pot mostrar la llista proporcionada per Debian. No obstant això, una llista completa no és particularment útil, ja que no hi ha cap raó particular per compilar mòduls externs excepte quan se sap que es necessita. En aquests casos, la documentació del dispositiu típicament detallarà els mòduls específics que necessita per funcionar amb Linux.
Per exemple, considerem el paquet dahdi-source: després de la instal·lació, un .tar.bz2 de les fonts del mòdul s'emmagatzema a /usr/src/. Tot i que podríem extreure manualment el fitxer comprimit («tarball») i construir el mòdul, a la pràctica preferim automatitzar tot això utilitzant la infraestructura DKMS («Dynamic Kernel Module Support» o “Suport per a mòduls dinàmics del nucli”) . La majoria dels mòduls ofereixen la integració DKMS necessària en un paquet que acaba amb un sufix -dkms. En el nostre cas, la instal·lació de dahdi-dkms és tot el que es necessita per compilar el mòdul del nucli per al nucli actual sempre que tinguem el paquet linux-headers-* que coincideixi amb el nucli instal·lat. Per exemple, si utilitzeu linux-image-amd64, també voldreu instal·lar 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. Aplicar pedaços al nucli

Algunes característiques no s'inclouen en el nucli estàndard a causa de falta de maduresa o a algun desacord amb els mantenidors del nucli. Aquestes característiques es poden distribuir com a pedaços que després qualsevol persona és lliure d'aplicar a les fonts del nucli.
Debian de vegades proporciona alguns d'aquests pedaços en els paquets linux-patch-*, però sovint no es fa en llançaments estables (de vegades per les mateixes raons que no estan fusionats en el nucli oficial original). Aquests paquets instal·len fitxers al directori /usr/src/kernel-patches/.
Per aplicar un o més d'aquests pedaços instal·lats, utilitzeu l'ordre patch al directori de les fonts i després inicieu la compilació del nucli com s'ha descrit anteriorment. A continuació es mostra un exemple antic usant linux-patch-grsecurity2 i 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
Tingueu en compte que un pedaç concret no necessàriament funciona amb qualsevol versió del nucli; és possible que patch falli quan s'aplica a les fonts del nucli. Es mostrarà un missatge d'error i es donaran alguns detalls sobre la fallada; en aquest cas, consulteu la documentació disponible al paquet Debian del pedaç (al directori /usr/share/doc/linux-patch-*/). En la majoria dels casos, el mantenidor indica per a quines versions del nucli està pensat el pedaç.