Di seguito sono elencati con una breve spiegazione i passi necessari per la compilazione di base di un nuovo kernel serie 2.6.x , nello specifico, la distro di riferimento è Slackware.
NB: Indifferentemente dalla distro, i comandi utili risultano essere sempre gli stessi, come da esempio seguente.
I vari kernel sono disponibili dal Link Ufficiale nel formato che si desidera.
Scarichiamo il kernel scelto:
~$ wget linux-2.6.30.tar.bz2
Spostiamo i sorgenti nella directory di riferimento generica per i sorgenti del kernel **/usr/src/ :
**
~$ su Password: ~# cp linux-2.6.30.tar.bz2 /usr/src/
Ci spostiamo nella directory di riferimento e decomprimiamo il file contenente il kernel scelto:
~# cp /usr/src/ ~# tar jxvf linux-2.6.30.tar.bz2
Estratto il kernel avremo la directory /usr/src/linux-2.6.versione. Provvederemo per comodità a cancellare e ricreare il link simbolico puntandolo alla versione prescelta:
~# rm linux ; ln -s linux-2.6.x linux
NB: la “x” chiaramente indica la versione (18-19-20-21…30) che cambierà in base al kernel scelto.
Creato il link prepariamo l’ambiente:
~# cd /usr/src/linux ~# make mrproper
NB: make mrproper pulità l’albero dei sorgenti del kernel da qualunque file di configurazione. E’ buona norma prima di startare la compilazione del kernerl ricordarsi di questo comando.
A questo punto dobbiamo cominciare scegliendo cosa abilitare e cosa no nel nostro nuovo kernel. Questa fase viene fatta richiamando un menù di opzioni che registrerà i cambiamenti fatti da noi su un file .config . Prima di questo però è possibile scegliere la configurazione partendo da 0 “default” oppure utilizzando un file di config preesistente del kernel che stiamo usando attualmente.
NB: è buona norma scegliere di utilizzare un pre .config per assicurarsi che cmq, anche in casi particolari, siano avviati i moduli necessari con il kernel preesistente. Questo comportamento ci garantirà salvo casi “spiacevoli” l’avvio del riconoscimento hardware e di tutti i servizzi necessari per poter tornare a riportare modifiche. E’ chiaro che in caso di kernel panic, l’alternativa sarà quella obbligata del chroot di ripristino (articolo presente e consultabile nel blog).
Nel caso default partendo da 0 saltate il prossimo punto, altrimenti, assodato che utilizzeremo un config esistente a cui si aggiungeranno in ogni caso le modifiche fatte da noi procediamo copiandolo nella directory del kernel source:
~# cp /boot/config-generic-2.6.24.5 /usr/src/linux/.config ~# make oldconfig
NB: questo comando si occuperà di settare le opzioni presenti nel config preesistente che era allocato nella directory /boot/config-versione e di applicarle al nuovo kernel.
Finita la fase 1, sceglieremo di startare l’interfaccia testuale o grafica scelta per controllare le opzioni da abilitare e/o disabilitare in maniera Statica,Dinamica e/o modulare. Si può scegliere il make in metodo testuale tramite menuconfig oppure il metodo grafico mediante xconfig e/o gconfig. La differenza sostanziale è che menuconfig usa ncurses, mentre xconfig e gconfig richiedono l’uso di X (server grafico) ed usano rispettivamente le librerie QT e GTK.
Supponiamo di scegliere il metodo classico da shell:
~# make menuconfig
Abiliteremo e disabiliteremo i moduli prescelti mediante Y-N oppure in base alle esigenze sceglieremo di applicare a delle opzioni il caricamento modulare M , che richiamerà il modulo solo in caso di necessità. Completata la scelta di cosa abilitare e cosa no, usciamo
A questo punto compiliamo:
~# make
NB: Si può scegliere di passare l’opzione -j2 e/o -j3 al make . Questa opzione non fà altro che lanciare un numero di processi espresso numericamente in parallelo. In sostanza velocizza il processo di compilazione e creazione dell’immagine kernel. Questo avviene perchè normalmente un singolo processo di “make” non dovrebbe occupare tutta la CPU, per evitare di sovraccaricare la macchina. Lanciando invece 2 o 3 processi assieme la CPU risulterà interamente occupata con carico 100% e il tempo di compilazione diminuirà.
Dopo un tempo indefinito, che solitamente dipende dalla macchina che si sta utilizzando, l’immagine kernel sarà stata creata e si troverà nella directory /usr/src/linux/arch/i386/boot/ con il nome bzImage.
Creata l’immagine che ci servirà dopo, procederemo con l’installazione dei moduli annessi all’immagine creata:
~# make modules_install
NB: il comando provvede ad installare i moduli scelti nella directory /lib/modules/versione-kernel.
Installati anche i moduli il processo è terminato. I file di riferimento adesso sono tre:
1) /usr/src/linux/arch/i386/boot/bzImage => l'immagine kernel creata 2) /usr/src/linux/System.map => Mappatura locazioni di memoria del kernel 3) /usr/src/linux/.config => config relativo al kernel compilato
Non dobbiamo fare altro che spostare i file e l’immagine kernel nella directory di sistema dedicata all’avvio: /boot/ ,tenendo presente che non ci siamo mai spostati dalla directory /usr/src/linux/ :
~# cp arch/i386/boot/bzImage /boot/vmlinuz-nome_che_preferiamo_dare_al_nostro_kernel ~# cp System.map /boot/System.map-versione_compilata ~# cp .config /boot/config_versione_compilata
NB: i nomi sono chiaramente una scelta soggettiva dell’utente. Il file immagine è necessario per l’avvio al boot del nuovo kernel. Il config è da conservare per una ricompilazione successiva. Il file System.map è da conservare in caso di errata mappatura della locazione di memoria kernel.
Ultimo passo è la configurazione del boot manager “LILO - GRUB” con le direttive della nuova immagine del kernel.
~# vi /etc/lilo.conf
modifichiamo o creiamo la nuova voce boot in lilo come da esempio:
# Image kernel 2.6.x image = /boot/vmlinuz-nome_dato_precedentemente_allimmagine_kernel => nome e percorso dell'immagine kernel root = "/dev/hdaX" => device corrispondente alla partizione radice / label = "Kernel2.6.x" => nome che apparirà al boot lilo vga = 791 => modalità di framebuffer della console scelto read-only # Image kernel 2.6.x end
Riavviamo lilo in verbose per salvare le modifiche e controllare gli eventuali errori:
~# lilo -v
Riavviamo la macchina e bootiamo con il nuovo kernel.
# End