Guida Pratica alla Compilazione del kernel - parte uno

Escludendo distribuzioni come gentoo o lfs oggi è raro dover necessariamente compilare un kernel per poter avviare la propria distribuzione , di fatto ubuntu, fedora ma anche slackware, arch e molte altre, a tutti i livelli, forniscono uno o più kernel di default .

 

Allora , perchè voler un kernel “ a 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 inusiale ( vedremo più avanti ) , o 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 ed una buona conoscenza della macchina ed un po' di pazienza , un invito che poi posso darvi è quello di compilare una versione diversa/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 cooscenza di queste poche cose possiamo iniziare a lavorare , un buon inizio e capire come è fatto un kernel , create una directory di compilazione ( 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 “assieme” al kernel darà vita a “linux3.2.13”), che andranno spacchettati in quella directory ; ora siete davanti ad un gruppo di tanti e “ inutili” al momento file di sorgenti .
“Inutili “ perchè così come sono la loro compilazione avrebbe effetti deleteri , bisogna prima di tutto “istruire” il compilatore su come e cosa deve fare , per farlo c'è bisogno di un file /.config .
NOTA:Questo file è reperibile ed esempio in ubuntu in /boot e sono chiamati config-2.6*
NOTA2 : ogni distro ha un approcco più o meno gestibile alla compilazione del kernel , in arch la vita è facilitata da abs , in ubuntu l'operazione è più complicata , quindi da qua in avanti il metodo che indicherò sarà quello “ all'antica”
spostiamoci nbella directory dei sorgenti e applichiamo la patch col comando


bzcat [NOME_DELLA_PATCH].bz2 | patch -p1

questa operazione potrebbe durare molto o poco, a seconda del vostro hardware , 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 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 da qua , anche l'utente medio può scremare qualcosa , ad esempio :

 

 

la mia è una macchina amd , processore phenom, scheda video amd/ati , viene da se ( e non richiede conoscenze specifiche) che posso eliminare la voce “ intel MCE features “ o se avessi in singlecore senza hypertreading potrei spuntare anche il “ symmetric multi-processing support”
Un cenno importante è l'uso o il non uso del ramdisk , l'initramfs e l'uso dei moduli/integrazioni
Di norma il kernel dovrebbe contenere quanto necessario per avviare il sistema , dovrebbero essere integrati quindi il supporto al filesystem scelto , il supporto alla scheda video ecc.. poi UDEV si occuperà di caricare dinamicamente i moduli necessari al resto del sistema ( esempio, è vitale che il sistema sappia leggere una partizione ext dove risiede , quindi ha priorità e 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 ai “dosfs” può essere compilato come modulo)
questo approccio è quello “ classico” , in realtà ad oggi va per la maggiore l'uso del “initramfs” .
Questo approccio permette più flessiblità e leggerezza , in pratica utilizzandolo si può fare un uso intensivo dei moduli , lasciando il kernel piccolo e leggero ( un esempio è questo: nel kernel di archlinux, che utilizza l'initramfs, il supporto a gran parte del parco hardware è sottoforma di modulo) , ma il rischio è di prenderci troppo la mano, generando moduli per tutto , anche per periferiche che non avremmo 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 pci) “lsusb” ( dispositivi usb) lscpu ( dettagli approfonditi del processore) ci vengono agevolmente incontro , il loro output ci aiuterà a capire cio di cui non abbiamo bisogno, ne come modulo ne build-in .
Un ulteriore aiuto viene 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 , DISPOSITIVI VARI DEVONO ESSERE COLLEGATI ED OPERATIVI QUANDO LANCERETE “LSMOD” !
Quindi , in sintesi, i vari comandi “ls***” ci aiuteranno ad identificare l'hardware , lsmod a capire chi e cosa usa un tetemrinato modulo , se dai listati dei comandi “ls***” rapportati a “lsmod” “avanza” qualche periferica non potete sbagliare, sarà necessario inserire il suo supporto come buid-in.
Capito quanto detto, configurato il compilatore potrete finalmente salvare il vostro .config e uscire dal menù ; il kernel che ne uscirà sarà esattamente cio di cui avete bisogno per la vostra macchina e le vostre esigenze .
In conclusione, la compilazione del kernel non è una operazione che porta con se una difficoltà intinseca insormontabile , richiede solo un po' di pazienza e una ottima conoscenza della macchina, non vi resta che provare e gustarvi i risultati !

Compilazione Kernel 3.3.1 su Ubuntu x86 e derivate - Wifi no problem


- Aggiornata al 10/04/2012 - Kernel Patch per problema Wi-Fi Atheros inclusa
 Ho aggiornato il link del sorgente del kernel perché punti ad una versione opportunamente modificata, buon divertimento.

Un saluto a tutti, come promesso eccovi la versione per sistemi a 32 bit della guida già pubblicata.
Successivi approfondimenti ed ulteriori ottimizzazioni saranno presenti in successivi post.
Le differenze tra l'architettura a 32 e a 64 Bit sono minime ma, poiché ho postato le istruzioni da seguire passo passo, era necessario aggiornare la guida con le opportune modifiche. 


Avviate il “Terminale” e digitate al prompt, nell'ordine così come vi appaiono, i comandi che via via troverete nel corso della lettura. Ogni comando è preceduto da una rapida spiegazione.
- Installazione librerie, compilatori e tutto il necessario. Ad ogni comando date “Invio”, inserite la vostra password ed attendete che il sistema faccia il resto.
sudo apt-get install fakeroot build-essential crash kexec-tools makedumpfile kernel-wedge libncurses5 binutils-dev libelf-dev libdw-dev libnewt-dev libncurses5-dev
sudo apt-get --no-install-recommends install asciidoc xmlto
sudo apt-get build-dep linux
- Creazione cartella contenente il sorgente del kernel e delle patch all'interno della nostra Home (al termine di tutte le operazioni essa conterrà anche il nostro kernel bello e compilato in singoli pacchetti).
mkdir ~/Kernel_3.3.1
cd ~/Kernel_3.3.1
- Download del kernel e delle patch.

wget -c http://dl.dropbox.com/u/56720744/linux-3.3.1.tar.bz2
Attendete il termine del download prima il dare il comando successivo (per ogni singolo comando).
wget -c http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.3.1-precise/0001-base-packaging.patch
wget -c http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.3.1-precise/0002-debian-changelog.patch
wget -c http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.3.1-precise/0003-default-configs.patch
- Scompattazione Kernel, creazione collegamento simbolico, accesso alla cartella.
tar xjvf linux-3.3.1.tar.bz2
ln -s linux-3.3.1 linux
cd linux
- Applicazione patch al Kernel
patch -p1 < ../0001-base-packaging.patch
patch -p1 < ../0002-debian-changelog.patch
patch -p1 < ../0003-default-configs.patch
- Assegnazione diritti accesso ed esecuzione ai vari scripts
chmod -Rv +x debian/rules
chmod -Rv +x debian/scripts/
- Creazione nuovo profilo di compilazione per Core i7
cp debian.master/config/i386/config.flavour.generic debian.master/config/i386/config.flavour.i7
- Pulizia ed aggiornamento dei file di configurazione
fakeroot debian/rules clean
fakeroot debian/rules updateconfigs
- Modifica del file di configurazione per adattare il Kernel alle nostre richieste: è un passaggio fondamentale da eseguire con estrema attenzione. All'esecuzione del comando il terminale farà apparire una serie di domande, RISPONDETE AFFERMATIVAMENTE SOLO ALLA SEGUENTE RICHIESTA: "Do you want to edit config: i386/config.flavour.i7? [Y/n]".

fakeroot debian/rules editconfigs
Ora siete entrati nella configurazione del kernel, procedete in questo modo (per selezionare intendo muoversi su e giù con le frecce del cursore e poi dare invio):

1 – Selezionare “Processor type and features”

2 – Selezionare “Processor family (Generic-x86-64)”

3 - Selezionare “Core 2/newer Xeon

4 – Scorrete tutte le voci in basso fino a trovare “Preemption Model ...”
(Questa voce determina come la vostra CPU si “dedicherà” alla gestione dei vari compiti/programmi in esecuzione nel vostro sistema unitamente alla voce “Timer frequency...”. È possibile privilegiare una più rapida risposta del sistema a scapito però dei tempi di esecuzione reali dei vari processi. Consiglio vivamente di lasciare “Desktop”).

5 - Scorrete tutte le voci in basso fino a trovare “Timer frequency ...”
(Ora se avete un fisso potete selezionare la voce 1000Hz, un portatile non superate soglia 300Hz. In rete ho trovato infinite differenti spiegazioni e consigli sull'uso di tale parametro, a meno che non utilizziate sul vostro sistema delle applicazioni professionali per la gestione di audio e video, settate tale valore su 300Hz).

6 – Tornate al menù precedente Selezionando la voce “Exit” presente nella parte bassa dello schermo

7 - Selezionate “Networking support ...”

8 – Selezionate “Networking options …”

9 - Scorrete tutte le voci in basso fino a trovare “The IPv6 protocol”, pigiate sulla vostra tastiera la lettera “M” (in fase di compilazione verrà creato un modulo del kernel per il protocollo IPv6 che sarà possibile bannare per impedirne l'uso da parte del sistema in maniera definitiva).

10 - Tornate al menù precedente Selezionando la voce “Exit” presente nella parte bassa dello schermo

11 - Tornate al menù precedente Selezionando la voce “Exit” presente nella parte bassa dello schermo

12 - Usciamo dal menù sempre Selezionando la voce “Exit” presente nella parte bassa dello schermo

13 – Rispondiamo “Yes” alla domanda che ci verrà posta all'uscita, salveremo le modifiche apportate alle configurazione base. Rispondete “N” alle successive domande presenti a schermo. 
- Copia delle impostazioni generiche ed impostazione della nostra configurazione come predefinita all'interno del processo di compilazione 

cp debian.master/abi/3.2.0-20.33/i386/generic debian.master/abi/3.2.0-20.33/i386/i7
cp debian.master/abi/3.2.0-20.33/i386/generic.modules debian.master/abi/3.2.0-20.33/i386/i7.modules
sed -i s/getall\ i386\ generic\ virtual/getall\ i386\ generic\ virtual\ i7/g debian.master/etc/getabis
sed -i s/\=\ generic\ virtual/\=\ generic\ virtual\ i7/g debian.master/rules.d/i386.mk
cp debian.master/control.d/vars.generic debian.master/control.d/vars.i7
sed -i s/supported\=\"Generic\"/supported\=\"Nehalem\"/g debian.master/control.d/vars.i7
sed -i s/target\=\"Geared\ toward\ x86_64/target\=\"Geared\ toward\ i7/g debian.master/control.d/vars.i7

- Ottimizzazione del kernel attraverso le variabili -mtune e -march, il compilatore si occuperà di produrre un kernel ottimizzato per architetture Intel Dual Core / Core i-xx
 
sed -i s/\=\ gcc/\=\ gcc\ -march\=corei7\ -mtune\=corei7/g Makefile
sed -i s/\=\ g++/\=\ g++\ -march\=corei7\ -mtune\=corei7/g Makefile
sed -i s/core2/corei7/g arch/x86/Makefile
sed -i s/core2/corei7/g arch/x86/Makefile_32.cpu

- Scrittura di tutte le modifiche sul disco

sync
- Pulizia prima dell'inizio della compilazione vera e propria
 
fakeroot debian/rules clean
- Compilazione delle dipendenze, sorgente e header
skipabi=true skipmodule=true fakeroot debian/rules binary-indep
- Avvio del processo di compilazione del kernel
time skipabi=true skipmodule=true no_dumpfile=yes fakeroot debian/rules binary-i7
- Pulizia di quello che non serve più e, infine, diamo il comando per l'installazione del nuovo kernel. 
cd ..
rm linux

rm -rf linux-3.3.1

sudo dpkg -i
linux-image-3.3.1-030301-i7_3.3.1-030301.201204021435_i386.deb linux-headers-3.3.1-030301-i7_3.3.1-030301.201204021435_i386.deb linux-headers-3.3.1-030301_3.3.1-030301.201204021435_all.deb

Riavviamo per utilizzare il nuovo Kernel.

Compilazione Kernel 3.3.1 su Ubuntu x64 e derivate - Wifi no problem

-- Aggiornata al 10/04/2012 - Kernel Patch per problema Wifi Atheros incluso
 Ho aggiornato il link del sorgente del kernel perchè punti ad una versione opportunamente modificata, buon divertimento.

La presente è una piccola guida per la compilazione e ottimizzazione del kernel su Ubuntu a 64 bit e derivate. L'ottimizzazione si limita solo alle selezione della tipologia del processore all'interno dei files di configurazione, ulteriori ottimizzazioni possono essere eseguite all'interno di tali files in relazione alla propria configurazione Hardware.
Il risultato del lavoro svolto è un kernel compatibile con tutti i processori Intel appartenenti alla famiglia Core2, Corei3, i5, i7 ecc.
Questa guida non è adatta alla compilazione del kernel su macchine dotate di Cpu Amd, presto ne posterò una dedicata a questi processori.
L'ottimizzazione garantisce una migliore velocità nell'esecuzione dei compiti che assorbono molte risorse del processore, Es. codifica/decodifica video, compressione/decompressione files ecc.
Se utilizziamo il nostro pc solo per navigare in rete e scrivere qualche riga di testo non noteremo grandi differenze.

Prima di iniziare con il lavoro vero proprio ringrazio quanti in rete pubblicando ogni giorno le loro esperienze migliorano le nostre competenze e accrescono la nostra cultura. Un particolare ringraziamento va a Sankaran Raman dal cui lavoro ho attinto a piene mani.
Avviate il “Terminale” e digitate al prompt, nell'ordine così come vi appaiono, i comandi che via via troverete nel corso della lettura. Ogni comando è preceduto da una rapida spiegazione.
- Installazione librerie, compilatori e tutto il necessario. Ad ogni comando date “Invio”, inserite la vostra password e attendete che il sistema faccia il resto.
sudo apt-get install fakeroot build-essential crash kexec-tools makedumpfile kernel-wedge libncurses5 binutils-dev libelf-dev libdw-dev libnewt-dev libncurses5-dev
sudo apt-get --no-install-recommends install asciidoc xmlto
sudo apt-get build-dep linux
- Creazione cartella contenente il sorgente del kernel e le patch all'interno della nostra Home (al termine di tutte le operazioni essa conterrà anche il nostro kernel bello e compilato in singoli pacchetti).

mkdir ~/Kernel_3.3.1
cd ~/Kernel_3.3.1
- Download del kernel e delle patch

wget -c http://dl.dropbox.com/u/56720744/linux-3.3.1.tar.bz2
Attendete il termine del download prima i dare il comando successivo (per ogni singolo comando).
wget -c http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.3.1-precise/0001-base-packaging.patch
wget -c http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.3.1-precise/0002-debian-changelog.patch
wget -c http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.3.1-precise/0003-default-configs.patch
- Scompattazione Kernel, creazione collegamento simbolico, accesso alla cartella.

tar xjvf linux-3.3.1.tar.bz2
ln -s linux-3.3.1 linux
cd linux
- Applicazione Patch al Kernel

patch -p1 < ../0001-base-packaging.patch
patch -p1 < ../0002-debian-changelog.patch
patch -p1 < ../0003-default-configs.patch
- Assegnazione diritti accesso ed esecuzione ai vari scripts
chmod -Rv +x debian/rules
chmod -Rv +x debian/scripts/
- Creazione nuovo profilo di compilazione per Corei7
cp debian.master/config/amd64/config.flavour.generic debian.master/config/amd64/config.flavour.i7
- Pulizia ed aggiornamento dei file di configurazione
fakeroot debian/rules clean
fakeroot debian/rules updateconfigs
- Modifica del file di configurazione per adattare il Kernel alle nostre richieste: è un passaggio fondamentale da eseguire con estrema attenzione. All'esecuzione del comando il terminale farà apparire una serie di domande, SOLO ALLA SECONDA RICHIESTA DOVETE RISPONDERE AFFERMATIVAMENTE.


fakeroot debian/rules editconfigs
Rispondete “n” alla prima domanda, “Y” alla seconda. Ora siete entrati nella configurazione del kernel procedete in questo modo (per selezionare intendo muoversi su e giù con le frecce del cursore e poi dare invio):

1 – Selezionare “Processor type and features”

2 – Selezionare “Processor family (Generic-x86-64)” 

3 - Selezionare “Core 2/newer Xeon

4 – Scorrete tutte le voci in basso fino a trovare “Preemption Model ...”
(Questa voce determina come la vostra cpu si “dedicherà” alla gestione dei vari compiti/programmi in esecuzione nel vostro sistema unitamente alla voce “Timer frequency...”. E' possibile privilegiare una più rapida risposta del sistema a scapito però dei tempi di esecuzione reali dei vari processi. Consiglio vivamente di lasciare “Desktop”).

5 - Scorrete tutte le voci in basso fino a trovare “Timer frequency ...”
(Ora se avete un fisso potete selezionare la voce 1000hz, un portatile non superate soglia 300hz. In rete ho trovato infinite differenti spiegazioni e consigli sull'uso di tale parametro, a meno che non utilizziate sul vostro sistema delle applicazioni professionali per la gestione di audio e video settate tale valore su 300hz).

6 – Tornate al menù precedente Selezionando la voce “Exit” presente nella parte bassa dello schermo

7 - Selezionate “Networking support ...”

8 – Selezionate “Networking options …”

9 - Scorrete tutte le voci in basso fino a trovare “The IPv6 protocol”, pigiate sulla vostra tastiera la lettera “M” 
(in fase di compilazione verrà creato un modulo del kernel per il protocollo IPv6 che sarà possibile bannare per impedirne l'uso da parte del sistema in maniera definitiva).

10 - Tornate al menù precedente Selezionando la voce “Exit” presente nella parte bassa dello schermo

11 - Tornate al menù precedente Selezionando la voce “Exit” presente nella parte bassa dello schermo

12 - Usciamo dal menù sempre Selezionando la voce “Exit” presente nella parte bassa dello schermo

13 – Rispondiamo “Yes” alla domanda che ci verrà posta all'uscita, salveremo le modifiche apportate alle configurazione base.

Rispondete “n” alla successive domanda presenti a schermo. 
- Copia delle impostazioni generiche e impostazione della nostra configurazione come predefinita all'interno del processo di compilazione 

cp debian.master/abi/3.2.0-20.33/amd64/generic debian.master/abi/3.2.0-20.33/amd64/i7
cp debian.master/abi/3.2.0-20.33/amd64/generic.modules debian.master/abi/3.2.0-20.33/amd64/i7.modules
sed -i s/getall\ amd64\ generic\ virtual/getall\ amd64\ generic\ virtual\ i7/g debian.master/etc/getabis
sed -i s/\=\ generic\ virtual/\=\ generic\ virtual\ i7/g debian.master/rules.d/amd64.mk
cp debian.master/control.d/vars.generic debian.master/control.d/vars.i7
sed -i s/supported\=\"Generic\"/supported\=\"Nehalem\"/g debian.master/control.d/vars.i7
sed -i s/target\=\"Geared\ toward\ x86_64/target\=\"Geared\ toward\ i7/g debian.master/control.d/vars.i7

- Ottimizzazione del kernel attraverso le variabili -mtune e -march, il compilatore si occuperà di produrre un kernel ottimizzato per architetture Intel Dual Core / Corei-xx
 
sed -i s/\=\ gcc/\=\ gcc\ -march\=corei7\ -mtune\=corei7/g Makefile
sed -i s/\=\ g++/\=\ g++\ -march\=corei7\ -mtune\=corei7/g Makefile
sed -i s/core2/corei7/g arch/x86/Makefile
sed -i s/core2/corei7/g arch/x86/Makefile_32.cpu

- scrittura di tutte le modifiche sul disco

sync
- pulizia prima dell'inizio della compilazione vera e propria
 
fakeroot debian/rules clean
- compilazione delle dipendenze, sorgente e header

skipabi=true skipmodule=true fakeroot debian/rules binary-indep
- avvio del processo di compilazione del kernel

time skipabi=true skipmodule=true no_dumpfile=yes fakeroot debian/rules binary-i7

uliamo quello che non serve più e, infine, diamo il comando per l'installazione del nuovo kernel.

cd ..
rm linux

rm -rf linux-3.3.1

sudo dpkg -i linux-image-3.3.1-030301-i7_3.3.1-030301.201204021435_amd64.deb linux-headers-3.3.1-030301-i7_3.3.1-030301.201204021435_amd64.deb linux-headers-3.3.1-030301_3.3.1-030301.201204021435_all.deb



Riavviamo per utilizzare il nuovo Kernel.
Sistema utilizzato Kubuntu 12.04 x64 - Cpu Corei3 2°Gen. - 6GB Ram.
Unico problema riscontrato: la mia scheda di rete al ritorno dalla ibernazione (in via di risoluzione) non riesce a riagganciarsi alla stessa rete wireless.