Compilatevi il vostro Kernel!

Intraprendo la scrittura di questa guida al puro scopo di cercare di aiutare qualcuno in un'operazione che normalmente risulta ostica ed incomprensibile, in particolar dovrebbe risultare adatta:

  • a chi sta installando Gentoo
  • a chi, più in generale, deve modificare la configurazione del kernel o necessita di una soluzione ad hoc rispetto a quelle fornite dai formati binari

Per ovvi motivi non è scopo di questo articolo coprire argomenti come il funzionamento della compilazione, i comandi base di un sistema GNU/Linux, il fatto che tutto sotto GNU/Linux è un file, invece cercherà di fornire un approccio a basso livello alla compilazione e configurazione del kernel, che possa funzionare in qualsiasi situazione.

Indice

  1. Introduzione e installazione
  2. Consigli utili per la configurazione
  3. Configurare il kernel
  4. Compilare il kernel
  5. Note finali e conclusione

Fossi matto!

E se non lo sei lo diventerai! Apparte gli scherzi, le ragioni che possono portarvi a configurare ex-novo, o a modificare una configurazione preesistente di un kernel è dettata da una necessità di ottimizzare un sistema, aggiungere un supporto precedentemente inesistente, eseguire un aggiornamento obbligatorio (dovuto al supporto di hardware nuovo o buggoso), impazzire.

Una piccola panoramica del kernel

Il kernel, se non ve l'avesse già detto qualcun altro, è (a grandi linee) lo strato software che mette in comunicazione i dispositivi hardware con il software utente: significa che senza il kernel non potrete usare il lettore cd, la videocamera, scrivere con la tastiera e accedere basilarmente al file system.
La versione attualmente disponibile del kernel, al momento in cui sto scrivendo questo articolo, è la 2.6.30.1.
Il kernel Linux, a capo del cui sviluppo è Linus Torvald, normalmente viene rilasciato in formato sorgente dal sito di kernel.org, ed è chiamato vanilla. In quanto software Open Source, chiunque ha la possibilità di prendere parte al suo sviluppo, segnalarne i suoi bug, modificarne i sorgenti e rilasciare un patchset: questo non è altro che l'insieme di modifiche (patch) realizzate da un team o da un singolo per raggiungere le modifiche necessarie al suo utilizzo in determinati ambienti. Alcuni dei patchset più conosciuti sono:

mm
Patchset realizzato da Andrew Morton, comprende bugfixes al kernel vanilla e altro relativamente alla memoria virtuale.
tux on ice
Patchset che include un supporto ottimizzato per l'ibernazione e la sospensione nei laptop
gentoo
Patchset realizzato dal team di Gentoo realitivi a bugfixes, fix di sicurezza e altro, all'interno dello scope dell'applicabilità del kernel Linux con Gentoo.

Molte, se non tutte, le distribuzioni binarie forniscono un kernel precompilato e spesso risulta pure difficile risalire alla configurazione esatta dello stesso, quindi la sua modifica può implicare, oltre allo scaricamento dei sorgenti vanilla, anche delle singole patch, applicandole di volta in volta (sperando che non collidano tra di loro).
Per la natura di Gentoo, i patchset esistenti sono già pronti per essere applicati al kernel vanilla tramite l'albero di portage, in maniera del tutto trasparente all'utente, e senza particolari difficoltà.

Prima di configurare

Occorre quindi scaricare il kernel che desiderate.
Se la vostra distribuzione non fornisce i sorgenti del kernel, o avete particolari necessità, potete scaricarlo e scompattarlo in /usr/src/ (in base agli standard di organizzazione del file system):

  1. # cd /usr/src/
  2. # wget kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.1.tar.bz2
  3. # tar -xvjpf linux-2.6.30.1.tar.bz2
  4. # cd linux-2.6.30.1

se avete delle patch da applicare, questo è il momento giusto.
Una volta scaricata la patch (che chiameremo per sempicità "file.patch") vi basterà applicarla dando il comando:
# patch -p1 < /path/to/file.patch
se avete dubbi che la patch possa andare in conflitto con una precedentemente applicata o perché creata per una versione diversa di kernel, allora vi consiglio di usare l'opzione --dry-run, così:
# patch -p1 --dry-run < /path/to/file.patch
che non modifica nulla ma vi fa vedere se la modifica andrà a buon fine.

Pronti? Via alla configurazione!

Si accede molto semplicemente al menu di configurazione testuale (navigabile con le frecce) tramite il comando:
# make menuconfig
o alternativamente, se disponibile, anche tramite l'interfaccia grafica (anche se può essere fuorviante rispetto a questa e altre guide):
# make xconfig
Ora la struttura del kernel è fondamentalmente caotica per chi non ci ha mai messo mano, non solo, dovete tenere presente che se state configurandolo per la prima volta, il comando precedente vi avrà impostato automaticamente delle opzioni di default, che molto spesso possono non essere adeguate per voi: è quindi necessario avere un po' di occhio e aiutarsi costantemente con l'HELP fornito dal menu per capire se è necessario o meno abilitare o disabilitare una certa opzione.

Ma facciamo un passo indietro: come facciamo a capire come è organizzato il tutto? Una guida davvero interessante l'ho trovata un po' di tempo fa per sbaglio, ed è una guida interattiva al kernel Linux.

Nella sezione successiva troverete informazioni utili per come configurare (il più possibile) correttamente il vostro kernel.


Comments

Bellina coma guida, discorsiva, non trascuri cose spesso date per scontate, ci sono link per approfondire...

Minima aggiunta riguardo alla configurazione del kernel precompilato della distribuzione: Nelle Debian & derivate si trova in /boot/config-`uname -r`-ARCHITETTURA (se non sbaglio, non ho pc GNU/Linux sotto mano).

Riguardo alla pulizia dei sorgenti, si può andare anche più leggeri di un Mastro Lindo - make mrproper: make clean toglie tutti i file prodotti durante la compilazione ma lascia il .config

Non so se potrebbe starci un riferimento ai metodi specifici delle distribuzioni per creare pacchetti binari dalla compilazione, tipo quello che uso, il Metodo Debian, ma c'è pure il Metodo Fedora, ecc...

grazie per il make clean (me n'ero completamente dimenticato) e pure per dove trovare il config di debian&co.
Per quanto riguarda i metodi specifici non so. Questa guida l'ho voluta realizzare fondamentalmente per dare dei suggerimenti in fase di configurazione. Al massimo aggiungo in coda nella documentazione aggiuntiva.
Grazie ancora per il commento.

Aggiungo un piccolo contributo che, almeno per me, è stato di vitale importanza.
Lo script /scripts/extract-ikconfig, da invocare da , permette di estrarre il .config da un kernel già compilato.
Potrebbe essere utile estrarre detto file dal kernel normalmente installato nella distribuzione ed utilizzarlo come base per un fine tuning.
Chiaramente, il kernel precompilato deve supportare la funzionalità, che in ogni caso consiglio a tutti di attivare, ma, almeno su Slackware 12, pare esserci.

Buona compilata a tutti!

non conoscevo ancora questo script. ottima segnalazione!
l'unica cosa che mi sfugge è "da cosa è data la possibilità di estrarne il config?" indagherò, nel frattempo lo aggiungo all'articolo.
grazie ancora!

Hai ragione.
Almeno nel menuconfig del kernel 2.6.26, occorre abilitare 'General setup -> Kernel .config support'.