Compilare un kernel su misura


Spesso e volentieri, girovagando nel mondo GNU/Linux, abbiamo sentito citare più volte il termine "compilare" e spesso lo abbiamo trovato affiancato a sorgenti di programmi da installare sui nostri PC. Facciamo un passo indietro: tutte le distribuzioni possiedono dei repository suddivisi in categorie e piattaforme. La piattaforma che va per la maggiore oggigiorno è ovviamente il processore 64bit. Le principali distribuzioni organizzano i vari software in pacchetti precompilati pronti all'uso. Ma, essendo GNU/Linux un sistema basato sull'opensource, noi abbiamo sempre disponibili i file sorgente dei software. Ecco quindi che scende in campo la compilazione.

La prima domanda su cui è doveroso soffermarsi è: perché dovrei compilare un software anziché installare il pacchetto pre-compilato? La risposta è abbastanza banale: un file pre-compilato ha l'obiettivo di esser compatibile con il maggior numero di casistiche hardware e quindi avrà delle opzioni (flags) generiche pre-impostate; un file compilato dall'utente invece viene ottimizzato per il proprio hardware oltre al fatto che siamo noi, in fase di configurazione, che decidiamo quali features attivare e quali disattivare.

Lo stesso concetto è riconducibile al Kernel Linux, ovvero al cuore software che gestisce le nostre macchine. Un Kernel derivante dai repository di una qualsiasi distribuzione ha l'obiettivo di funzionare sempre, dovunque e comunque. Un Kernel ottimizzato, e quindi compilato da noi, ci permetti di attivare solo i moduli e le features di nostro interesse e delle quali necessita il nostro specifico hardware. Questo porta ad un Kernel sicuramente più snello.

Nella seguente guida verrà mostrato quindi come scaricare i sorgenti di un Kernel Linux e come procedere con la configurazione/installazione. Inutile dire che prima di continuare dovete esser consapevoli di ciò che state compiendo: attivare/disattivare flags a caso nella configurazione non vi porterà ad avere un kernel migliore. Anzi, più probabilmente vi porterà ad avere un Kernel non funzionante.
 
Per le prove che seguiranno viene utilizzato un sistema Fedora e il Kernel Linux Vanilla 4.10.1.

NB. Un Kernel compilato e funzionante su di una macchina virtuale non per forza funzionerà nel momento in cui lo andrete ad utilizzare su di una macchina fisica.

Prima di tutto abbiamo bisogno di alcuni pacchetti di supporto. Per verificare la presenza, ed installare i pacchetti mancanti su Fedora, procediamo con il seguente comando da terminale (privilegi di amministratore):

# dnf install fedpkg fedora-packager rpmdevtools ncurses-devel pesign qt3-devel libXi-devel gcc-c++ qt-devel openssl-devel

Una volta verificato ed installato i pacchetti di supporto appena citati possiamo procedere con il download dei sorgenti del kernel che meglio preferiamo dal sito http://kernel.org

Una volta scaricato il kernel in formato tar.xz è necessario decomprimerlo sfruttando il comando da terminale:

# tar Jxvf linux-4.10.1.tar.xz

Ovviamente adattando il comando alla versione del kernel da voi scaricata.

Ora si può procedere attraverso due strade: xconfig oppure menuconfig. Sono due interfacce che permettono di abilitare/disabilitare le opzioni e moduli del Kernel in esame. Xconfig è una finestra con interfaccia grafica a tutti gli effetti (personalmente la sfrutto su DE quali KDE LXDE e simili), mentre menuconfig è un'interfaccia basata sul terminale (personalmente la sfrutto sui sistemi che possiedono come DE GNOME).

Arrivati a questo punto possiamo procedere alla configurazione del nostro Kernel Linux ottimizzandolo per la nostra macchina.

Le macro voci che abbiamo a disposizione sono:

  • 64-bit Kernel
  • General setup
  • Enable loadable module support
  • Enable the block layer
  • Processor type and features
  • Power management and ACPI options
  • Bus options (PCI etc.)
  • Executable file formats / Emulations
  • Networking support
  • Device Drivers
  • Firmware Drivers
    • EFI Support
    • Tegra firmware driver
  • File systems
  • Kernel hacking
  • Security options
  • Cryptographic API
  • Virtualization
  • Library

Se notiamo vi sono già alcune voci attivate (spuntate). Spesso e volentieri corrispondono al minimo sindacabile per un corretto funzionamento. Ora non vi resta che ricercare le voci (specialmente quelle riguardanti networking e device drive) di cui realmente necessitate. Una volta terminata la configurazione è importantissimo procedere con il salvataggio.

Salvato il file .config contenente le informazioni di configurazione del nostro Kernel Custom possiamo procedere alla compilazione vera e propria e all'installazione sul sistema con i comandi:

# make                                                    
# make modules
# make modules_install
# make install

Al termine della compilazione (ci può impiegare dalle decine di minuti all'oretta... dipende dalla potenza di calcolo dei PC) ci basterà riavviare per poter trovare, in fase di boot, la possibilità di selezionare il nostro nuovo Kernel custom.

Il mio consiglio è di salvarsi sempre un file configurazione .config funzionante, e partire a configurare sempre da quello in modo tale da identificare facilmente possibili errori o incompatibilità nelle flags selezionate/deselezionate.