Product SiteDocumentation Site

8.10. Compilare un kernel

I kernel forniti da Debian includono il maggior numero possibile di funzionalità, così come il massimo numero di driver, per coprire lo spettro più ampio di configurazioni hardware esistenti. Ecco perché alcuni utenti preferiscono ricompilare il kernel per includere unicamente ciò di cui necessitano. Ci sono due ragioni per questa scelta. Primo, questo può ottimizzare il consumo di memoria perché il codice del kernel anche se non viene mai utilizzato occupa memoria senza motivo (e non viene mai posto nello spazio di swap, dato che utilizza la vera RAM), cosa che può diminuire le prestazioni complessive del sistema. Inoltre un kernel compilato localmente può anche limitare i rischi di sicurezza poiché solo una frazione del codice del kernel è compilato ed eseguito.
Ricompilare il kernel è inoltre necessario se si vuole utilizzare certe funzionalità che sono disponibili solo come patch (e non sono incluse nella versione standard del kernel).

8.10.1. Introduzione e prerequisiti

Non stupisce che Debian gestisca il kernel sotto forma di pacchetti, diversamente da come i kernel sono stati compilati ed installati tradizionalmente. Poiché il kernel rimane sotto il controllo del sistema di pacchettizazione può essere rimosso in modo pulito, o distribuito su diverse macchine. Inoltre, gli script associati con questi pacchetti automatizzano l'interazione con il bootloader ed il generatore initrd.
I sorgenti originari di Linux contengono tutto il necessario per costruire un pacchetto Debian del kernel. Ma è ancora necessario installare build-essential per assicurarsi di avere gli strumenti necessari per costruire un pacchetto Debian. Inoltre, le fasi di configurazione del kernel richiedono il pacchetto libncurses5-dev. Infine, il pacchetto fakeroot consente la creazione del pacchetto Debian senza l'impiego di privilegi di amministratore.

8.10.2. Ottenere i sorgenti

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 Sezione 6.2.6, «Lavorare con più distribuzioni»). 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.9 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.9 package has been installed. It contains /usr/src/linux-source-4.9.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.9.tar.xz

8.10.3. Configurare il kernel

I passi successivi consistono nella configurazione del kernel secondo le proprie necessità. La procedura esatta dipende dagli obiettivi.
Quando si ricompila una versione del kernel più recente (eventualmente con patch aggiuntive) la configurazione sarà probabilmente mantenuta più simile possibile a quella proposta da Debian. In questo caso, e piuttosto di riconfigurare tutto da zero, è sufficiente copiare il file /boot/config-versione (la versione è quella del kernel correntemente in uso, che può essere trovato con il comando uname -r) in un file .config nella directory contenente i sorgenti del kernel.
$ cp /boot/config-4.9.0-3-amd64 ~/kernel/linux-source-4.9/.config
Se non si necessita di cambiare la configurazione, è possibile fermarsi qui e saltare alla Sezione 8.10.4, «Compilazione e creazione del pacchetto». Se invece è necessario modificarla, o se si è deciso di riconfigurare tutto da zero, è necessario prendersi del tempo per configurare il kernel. Ci sono varie interfacce dedicate nella directory dei sorgenti del kernel che possono essere richiamate utilizzando il comando make target, dove target sarà uno dei valori descritti di seguito.
make menuconfig compila ed esegue un'interfaccia testuale (ecco perché è richiesto il pacchetto libncurses5-dev) che consente la navigazione tra le opzioni disponibili in una struttura gerarchica. La premendo il tasto Spazio cambia il valore delle opzioni selezionate, ed Invio conferma il bottone selezionato in basso sullo schermo; Select rimanda al sotto-menu selezionato; Exit chiude la finestra corrente e torna indietro alla gerarchia, Help visualizzerà informazioni maggiormente dettagliate sul ruolo dell'opzione selezionata. Le frecce consentono di muoversi tra la lista di opzioni ed i bottoni. Per uscire dal programma di configurazione, scegliere Exit dal menu principale. Il programma offrirà di salvare le modifiche effettuate; accettare se si è soddisfatti delle proprie scelte.
Altre interfacce hanno funzioni simili, ma lavorano con interfacce grafiche più moderne: come make xconfig che usa l'interfaccia grafica Qt, e make gconfig che usa GTK+. La prima richiede libqt4-dev, mentre quest'ultima dipende da libglade2-dev e libgtk2.0-dev.
Quando si utilizza una di queste interfacce di configurazione, è sempre una buona idea partire da una configurazione predefinita ragionevole. Il kernel fornisce tali configurazioni in arch/arch/configs/*_defconfig e si può attivare la configurazione selezionata con un comando come make x86_64_defconfig (in caso di un PC a 64-bit) opuure make i386_defconfig (in caso di un PC a 32-bit).

8.10.4. Compilazione e creazione del pacchetto

Una volta che la configurazione del kernel è pronta, un semplice make deb-pkg genererà fino a 5 pacchetti Debian: linux-image-versione che contiene l'immagine del kernel e dei moduli associati, linux-headers-versione che contiene i file header necessari per compilare moduli esterni, linux-firmware-image-versione che contiene i file del firmware necessari per alcuni driver ( questo pacchetto potrebbe mancare quando si genera dai sorgenti del kernel forniti da Debian), linux-image-versione-dbg che contiene i simboli di debug per l'immagine del kernel e dei suoi moduli, e linux-libc-dev che contiene gli header realtivi ad alcune librerie come GNU glibc.
La versione è definita dalla concatenazione della versione originaria (come definita dalle variabili VERSION, PATCHLEVEL, SUBLEVEL e EXTRAVERSION in Makefile), del parametro di configurazione LOCALVERSION, e della variabile d'ambiente LOCALVERSION. La versione del pacchetto riutilizza la stessa stringa della versione con aggiunto un numero di revisione che viene viene incrementato regolarmente (e memorizzata in .version), almeno che non si sovrascrive con la variabile d'ambiente KDEB_PKGVERSION.
$ make deb-pkg LOCALVERSION=-falcot KDEB_PKGVERSION=$(make kernelversion)-1
[...]
$ ls ../*.deb
../linux-headers-4.9.30-ckt4-falcot_4.9.30-1_amd64.deb
../linux-image-4.9.30-ckt4-falcot_4.9.30-1_amd64.deb
../linux-image-4.9.30-ckt4-falcot-dbg_4.9.30-1_amd64.deb
../linux-libc-dev_4.9.30-1_amd64.deb

8.10.5. Compilare moduli esterni

Alcuni moduli sono mantenuti fuori dal kernel ufficiale Linux. Per usarli, è necessario compilarli parallelamente al kernel corrispondente. Alcuni moduli comuni di terze parti sono forniti da Debian in pacchetti dedicati, come xtables-addons-source (moduli aggiuntivi per iptables) o oss4-source (Open Sound System, alcuni driver audio alternativi).
Questi pacchetti esterni sono molti e variegati e non possiamo elencarli tutti qui: il comando apt-cache search source$ può restringere il campo alla chiave di ricerca. Comunque una lista completa non sarebbe particolarmente utile visto che non c'è una ragione particolare per compilare moduli esterni se non quando si sa di averne bisogno. In questi casi la documentazione del dispositivo dettaglia tipicamente i moduli specifici di cui necessita per funzionare su Linux.
Per esempio, diamo un'occhiata al pacchetto xtables-addons-source: dopo l'installazione, in /usr/src/ viene memorizato un file .tar.bz2 dei sorgenti del modulo. Anche se si potrebbe estrarre manualmente l'archivio tarball e creare il modulo, in pratica si preferisce automatizzare il tutto utilizzando DKMS. La maggior parte dei moduli offrono l'integrazione DKMS nei pacchetti che terminano con il suffisso -dkms. Nel nostro caso, l'installazione di xtables-addons-dkms è tutto ciò che serve per compilare il modulo del kernel per il kernel corrente a condizione che abbiamo il pacchetto linux-headers-* corrispondente al kernel installato. Per esempio, se si utilizza linux-image-amd64, si dovrebbe installare anche linux-headers-amd64.
$ sudo apt install xtables-addons-dkms

[...]
Setting up xtables-addons-dkms (2.12-0.1) ...
Loading new xtables-addons-2.12 DKMS files...
Building for 4.9.0-3-amd64
Building initial module for 4.9.0-3-amd64
Done.

xt_ACCOUNT:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/4.9.0-3-amd64/updates/dkms/
[...]
DKMS: install completed.
$ sudo dkms status
xtables-addons, 2.12, 4.9.0-3-amd64, x86_64: installed
$ sudo modinfo xt_ACCOUNT
filename:       /lib/modules/4.9.0-3-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. Applicare una patch al kernel

Alcune funzionalità non sono incluse nel kernel standard perché non mature o per un mancato accordo tra il manutentore del codice sorgente ed i manutentori del kernel. Alcune funzionalità possono essere distribuite come patch che chiunque può applicare liberamente ai sorgenti del kernel.
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.
Per applicare una o più di queste patch installate utilizzare il comando patch nella directory dei sorgenti, poi avviare la compilazione del kernel come descritto sopra.
$ 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
Notare che una patch potrebbe non funzionare con ogni versione del kernel: è possibile che patch fallisca quando la applica ai sorgenti del kernel. Un messaggio d'errore sarà visualizzato e fornirà alcuni dettagli a proposito del fallimento. In questo caso, si deve far riferimento alla documentazione disponibile nel pacchetto Debian della patch (nella directory /usr/share/doc/linux-patch-*/). In molti casi il manutentore indica per quali versioni del kernel è stata realizzata la patch.