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
Unsurprisingly, Debian manages the kernel in the form of a package, which is not how kernels have traditionally been compiled and installed. Since the kernel remains under the control of the packaging system, it can then be removed cleanly, or deployed on several machines. Furthermore, the scripts associated with these packages automate the interaction with the bootloader and the initrd generator.
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.
We assume the linux-source-5.10 package has been installed. It contains /usr/src/linux-source-6.1.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-6.1.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.
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-6.1.0-21-amd64 ~/kernel/linux-source-6.1/.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 (3.0.10-8+deb12u1) ...
Setting up linux-compiler-gcc-12-x86 (6.1.99-1) ...
Setting up fxload (0.0.20081013-2) ...
Setting up linux-headers-6.1.0-23-common (6.1.99-1) ...
Setting up linux-kbuild-6.1 (6.1.99-1) ...
Setting up dahdi-dkms (1:2.11.1.0.20170917~dfsg-8.4) ...
Loading new dahdi-2.11.1.0.20170917 DKMS files...
Building for 6.1.0-23-amd64
Building initial module for 6.1.0-23-amd64
Done.
dahdi_dummy.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/6.1.0-23-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/6.1.0-23-amd64/updates/dkms/
[..]
depmod...
Setting up dahdi-linux (1:2.11.1.0.20170917~dfsg-8.4) ...
Setting up linux-headers-6.1.0-23-amd64 (6.1.99-1) ...
/etc/kernel/header_postinst.d/dkms:
dkms: running auto installation service for kernel 6.1.0-23-amd64.
dkms: autoinstall for kernel: 6.1.0-23-amd64.
Setting up linux-headers-amd64 (6.1.99-1) ...
Processing triggers for man-db (2.11.2-2) ...
$
sudo dkms status
dahdi/2.11.1.0.20170917, 6.1.0-23-amd64, x86_64: installed
$
sudo modinfo dahdi_dummy
filename: /lib/modules/6.1.0-23-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: 6.1.0-23-amd64 SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: DKMS module signing key
sig_key: 69:A6:CA:D5:86:6A:FE:F4:A8:04:6A:31:8B:AB:E1:07:88:BA:45:C7
sig_hashalgo: sha256
signature: 9B:F9:8E:38:4D:06:A6:20:52:33:D9:AE:9D:B9:83:17:BB:5A:18:F1:
F2:5B:F3:12:06:0A:1D:48:C3:BA:89:2C:40:64:1C:2C:52:7C:46:BE:
27:49:F5:55:42:1B:71:38:A2:1B:FA:58:BB:CE:7C:70:2C:EC:37:7B:
65:91:A1:E7:23:6E:B6:92:9D:B9:20:43:F5:39:7F:95:CA:36:DC:C0:
DA:82:49:AC:21:69:65:DF:5D:0F:C5:8F:E5:E6:92:76:F1:DD:18:7E:
91:D2:DC:43:86:CA:5B:66:7C:FF:AE:EA:F9:06:F8:55:4A:1F:C0:56:
8B:F7:6C:9E:77:35:9B:E0:14:9D:C4:68:D8:5E:FD:3F:53:73:F1:B6:
12:67:9E:F4:68:48:C8:A7:80:69:42:01:83:52:D8:EF:54:FE:11:E4:
63:3C:6F:B3:B6:BF:E9:4F:DF:52:C4:A7:6B:35:D6:3B:C9:E2:FD:48:
70:41:D1:D1:68:4C:D4:12:7F:CB:7D:92:E5:E6:79:4A:5B:5E:7C:38:
1D:98:B2:EF:0E:F3:8D:07:1B:51:75:2A:58:2E:F2:53:BA:6A:79:F5:
AD:D1:12:08:E1:15:EC:5C:7A:CF:99:A2:9B:DB:BB:C0:EE:BD:C0:96:
77:92:D7:CC:68:14:A2:61:E0:F2:65:64:54:70:B8:73
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ç.