Guida pratica alla compilazione del Kernel

0
89
Escludendo distribuzioni come Gentoo o LFS, oggi è raro dover necessariamente compilare un kernel per poter avviare la propria distribuzione, e di fatto Ubuntu, Fedora ma anche Slackware, Arch Linux e molte altre a tutti i livelli, forniscono uno o più kernel di default .

Allora, perchè voler un kernel “su misura”?
Le motivazioni sono tante e varie, quella che chi scrive piazza al primo posto è la compattezza (e quindi indirettamente, la velocità e l’avidità di memoria), ma le possiblità sono tante e variegate, potreste volere un supporto ad un filesystem esotico, fregandovene del classico EXTx piuttosto che il supporto nel kernel a qualche periferica inusuale (vedremo più avanti) o ancora, un kernel minimale per una macchina obsoleta e con poca memoria .
Le possiblità sono veramente infinite, tutto per avere la massima versatilità possibile.

Probabilmente vi è stato detto che “ricompilare il kernel è cosa difficile e macchinosa“, in realtà non è esattamente così; richiede attenzione, una buona conoscenza della macchina ed un po’ di pazienza. Un invito che posso darvi è quello di compilare una versione diversa e/o con un nome diverso il vostro kernel, così da avere la “via di fuga” di quello di default in caso di pasticci.
Ora che siete a conoscenza di queste poche cose possiamo iniziare a lavorare, un buon inizio è capire come è fatto un kernel: create una directory di compilazione (ad esempio /home/nomeutente/src) e procuratevi i sorgenti del kernel (al momento in cui scriviamo 3.2) e della patch (al momento x.13, che “insieme” al kernel darà vita a “linux-3.2.13”), ed andranno spacchettati in nella directory precedente; ora siete davanti ad un gruppo di tanti ed “inutili” file sorgenti.
“Inutili“ perché così come sono la loro compilazione avrebbe effetti deleteri, bisogna prima di tutto “istruire” il compilatore su cosa e come lo deve fare, e per farlo c’è bisogno di un file /.config.
NOTA: Questo file è reperibile ad esempio su Ubuntu nel percorso /boot ed è chiamato config-2.6*.
NOTA 2: Ogni distribuzione ha un approccio più o meno gestibile alla compilazione del kernel, su Arch Linux la vita è facilitata da ABS, ma su Ubuntu l’operazione è più complicata, quindi da qui in avanti il metodo che indicherò sarà quello “all’antica”.
Spostiamoci nella directory dei sorgenti ed applichiamo la patch col comando

bzcat [NOME_DELLA_PATCH].bz2 | patch -p1

Questa operazione ha una durata variabile, a seconda del vostro hardware, ma lascietelo fare e vedrete che prima o poi il prompt di comando riapparirà!
Ed ora possiamo veramente addentrarci nella configurazione del kernel, la via senza ombra di dubbio preferibile è “menuconfig”, una sorta di interfaccia grafica minimale che ci aiuterà nella scelta di cosa e come fare. Quindi, lanciamo il comando:
make menuconfig

Dopo qualche secondo ecco cosa apparirà nella nostra finestra di terminale:

Spostatevi con le freccette verso “Load an Alternate Configuration File” e selezionate quello precetendemente importato, così partirete dalla configurazione del vostro kernel di default.
Vi invito a studiarvelo bene, c’è molto da imparare e gia qui, anche l’utente medio può scremare qualcosa, ad esempio:

La mia è una macchina AMD, con processore Phenom, scheda video AMD/ATI: viene da sé (e non richiede conoscenze specifiche) che è possibile eliminare la voce “Intel MCE features” o, se avessi un single core senza hypertreading, potrei spuntare anche il “symmetric multi-processing support”.
Un cenno importante è l’uso o meno del ramdisk, l’initramfs e l’uso dei moduli/integrazioni.
Di norma il kernel dovrebbe contenere quanto necessario per avviare il sistema, dovrebbero quindi essere integrati il supporto al filesystem scelto, il supporto alla scheda video ecc. UDEV poi si occuperà di caricare dinamicamente i moduli necessari al resto del sistema (ad esempio, è vitale che il sistema sappia leggere la partizione EXTx dove risiede, quindi ha priorità assoluta ed il supporto a quel filesystem deve essere integrato, mentre non è necessario che sappia leggere fin da subito una chiavetta USB in FAT; quindi il supporto al “dosfs” può essere compilato come modulo).
Questo approccio è quello “classico”, anche se in realtà ad oggi va per la maggiore l’uso di“initramfs”.
Questo approccio permette più flessiblità e leggerezza; in pratica utilizzandolo si può fare un uso intensivo dei moduli, lasciando il kernel snello e leggero (un esempio può essere questo: il kernel di Arch Linux, che utilizza l’initramfs, il supporto a gran parte del parco hardware è sotto forma di modulo), ma il rischio è di farsi prendere troppo la mano, generando moduli per tutto; anche per periferiche che non avremo mai (opppure qualcuno vuol farmi credere che sta scrivendo da un PC con interfaccia dischi “pre ide”?)
Questo ci porta a dover capire “come non abusare dei moduli”.
In primis, dobbiamo identificare tutto l’hardware, infine capire i moduli caricati con il kernel di default durante il boot.
Itendificare l’hardware è semplice, i comandi “lshw” (mostra tutto l’hardware) “lspci” (dispositivi con interfaccia PCI) “lsusb” (dispositivi con interfaccia USB) “lscpu” (dettagli approfonditi del processore), ci vengono agevolmente incontro: il loro output ci aiuterà a capire ciò di cui non abbiamo bisogno; né come modulo, né build-in.
Un ulteriore aiuto ci viene offerto da “lsmod”, il comando mostrerà un listato dei moduli caricati da UDEV durante il boot, che certamente sono quelli essenziali per il funzionamento della vostra macchina e che quindi dovrete compilare come modulo.
IMPORTANTE: STAMPANTI USB, WEBCAM E DISPOSITIVI VARI DEVONO ESSERE COLLEGATI ED OPERATIVI QUANDO LANCERETE “LSMOD”!
Quindi in sintesi, i vari comandi “lsxxx” ci aiuteranno ad identificare l’hardware, “lsmod” a capire chi e cosa usa un detemrinato modulo. Se dai listati dai comandi “lsxxx” rapportati a “lsmod”, ci dovesse essere qualche periferica non elencata, non potete sbagliare; sarà necessario inserire il suo supporto come buid-in.
Una volta compreso quanto detto e configurato il compilatore, potrete finalmente salvare il vostro .config e uscire dal menu; il kernel che ne uscirà sarà esattamente ciò di cui avete bisogno per la vostra macchina e le vostre esigenze.
In conclusione, la compilazione del kernel non è un’operazione che porta con sé una difficoltà intinseca insormontabile, ma richiede solo un po’ di pazienza ed un’ottima conoscenza della macchina. Non vi resta che provare e gustarvi i risultati!