Compiliamo i kernel Mandriva

Dom, 15/07/2007 - 12:20

Compiliamo i kernel Mandriva

Inviato da Moreno 11 commenti
1) Introduzione

La compilazione del kernel di Linux è da sempre considerata una operazione da Hacker, in realtà è solo un operazione lunga ma alquanto banale anche se nasconde insidie alquanto pericolose.
I veri Hacker sono quelli che sanno scrivere/applicare patch al kernel e lo sanno configurare con senno e ottenere alla fine un kernel funzionante.

Mentre è relativamente facile applicare patch ad un kernel vanilla rilasciato da http://kernel.org/ questa operazione diventa quasi impossibile con i kernel Mandriva che già di per se hanno un centinaio di patch applicate.
L'ultima patch che sono riuscito ad applicare ad un kernel Mandriva risale ai tempi di Mandrake 9.1 con la patch RTAI per applicazioni RealTime e ricordo la cosa ancora con terrore.

Naturalmente non esiste solo il kernel ufficiale di Mandriva, se volete cimentarvi potete partire installando il pacchetto kernel-linus che non sono altro che il kernel vanilla impacchettato per Mandriva.

Se non possiamo applicare patch quello che ci rimane da fare quindi è solo l'operazione di configurazione del kernel.
Questa guida non ha la minima velleità di essere una guida alla configurazione ma esclusivamente alla sua compilazione.
Se mi verranno in mente cose interessanti da fare a livello di configurazione (vedi kernel a bassa latenza) scriverò piccole guide su misura.

Prima di proseguire è consigliabile leggersi questa guida http://www.mandrakeitalia.org/modules/wfsection/article.php?articleid=261 che da alcune informazioni utili sul kernel ed i suoi aggiornamenti
Questa guida è sconsigliabile per i newbie, si possono commettere errori che possono risultare catastrofici.
Prima di cimentarvi con la compilazione del kernel è necessario una buona dose di sano ed intenso studio.
Per la compilazione del kernel è indispensabile avere installato il pacchetto del kernel-source e di tutti i pacchetti necessari per effettuare una compilazione.
Se avete installato il kernel-source-stripped dovete rimuoverlo con urpme e successivamente installare il kernel-source
Io ho proceduto ad effettuare la compilazione a partire dal kernel kernel-2.6.21.4mdv-1-1mdv2008.0 è molto probabile che voi abbiate un kernel differente Es. kernel-2.6.17.14mdv-1-1mdv2007.1.i586.rpm.
Ricordatevi quindi di sostituire tutte le ricorrenze di 2.6.21.4mdv con quelle del vostro kernel es. 2.6.17.14mdv.
2.1)Operazioni preliminari
2.1.1) Aprire un terminale e diventare root

Innanzi tutto occorre aprire un terminale con Menu Stella -> Sistema -> Terminali -> konsole

2.1.2) Diventare root

$ su
Password: LaPasswordDiRoot
#

2.2)Verifiche preliminari
2.2.1) Verifica kernel in Uso

Per prima cosa verifichiamo con che kernel abbiamo fatto il boot

# uname -r
 
2.6.21-4mdv
#

2.2.2) Verifica pacchetti kernel

Ora verifichiamo se ci sono tutti i pacchetti di questo kernel

# rpm -qa | grep kernel
 
kernel-2.6.21.4mdv-1-1mdv2008.0
kernel-latest-2.6.21-4mdv
kernel-doc-2.6.21.4mdv-1-1mdv2008.0
kernel-doc-latest-2.6.21-4mdv
kernel-source-latest-2.6.21-4mdv
kernel-source-2.6.21.4mdv-1-1mdv2008.0
#

2.3)Messa in sicurezza

Visto che si possono combinare facilmente disastri è saggio fare alcuni backup dei dati più significativi.

2.3.1) Backup cartella /boot

# cd /
 
# tar -cz boot > bkboot.tgz
 
#

2.3.2) Backup cartella /etc

# cd /
 
# tar -cz etc > etc.tgz
 
#

2.3.3) Backup cartella sorgenti kernel /usr/src/linux-2.6.21-4mdv

# cd /usr/src/
 
# tar -cz linux-2.6.21-4mdv > kernelsrc.tgz
 
#

Se doveste fare qualche disastro per esempio nella cartella source basta rimuovere tutta la vecchia cartella e decomprimere il file del suo backup.

# cd /usr/src/
 
# rm -rf linux-2.6.21-4mdv
 
# tar xzf kernelsrc.tgz
 
#

In alternativa si può usare il mitico filemanager mc.

2.4)Ancora un po' di fasi preliminari

Ci sono ancora un po' di cose da fare prima di partire con la compilazione.

2.4.1) Andare nella cartella contenente i files src del kernel

# cd /usr/src/linux-2.6.21-4mdv/
#

2.4.2) Verificare che esista il file .config

# ls .config*
 
.config
#

Se il file .config non dovesse esistere si può tranquillamente copiare dalla cartella /boot che contiene il file .config attualmente in uso.

# cp /boot/config .config
 
# ls .c*
 
.config
#

2.4.3) Fare una copia di sicurezza del file .config

# cp .config .config.save
#

2.4.4) Fare una copia di sicurezza del file Makefile

# cp Makefile Makefile.save
#

2.4.5) Modificare il file Makefile

Dopoiamo ora dare un nome al nostro kernel modificandolo all'interno del file Makefile

# kwrite Makefile

Le prime righe del file dovrebbero essere simili a queste:

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 21
EXTRAVERSION = -4mdvcustom
NAME = Nocturnal Monster Puppy

A noi interessa il campo EXTRAVERSION che ora è -4mdvcustom e lo modifichiamo per esempio in -4mdvMoreno.

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 21
EXTRAVERSION = -4mdvMoreno
NAME = Nocturnal Monster Puppy

Salviamo ed usciamo da KWrite.

2.5)Configurazione del Kernel

Qui comincia la parte più misteriosa della compilazione del kernel.
Come già detto non cercherò neanche di spiegare cosa modificare nella configurazione anche perché non lo so neanche io.
Consiglio però di usare il comando make xconfig al posto degli altri possibili perché in basso a destra viene mostrato, per ogni voce della configurazione, un breve testo d'aiuto che può salvare la vita.

2.5.1) Configurare il kernel

# make xconfig

Quando make xconfig parte apparirà una maschera simile a questa

Nella parte si sinistra abbiamo l'albero generale delle opzioni, nella parte in alto a destra abbiamo le opzioni configurabili ed infine in basso a destra il testo d'aiuto ovviamente in inglese.

2.6)Finalmente compiliamo il kernel

Eccoci finalmente arrivati al dunque.

2.6.1) Compilare il kernel

# make 2>err && make modules_install 2>>err && make install 2>>err && echo "VITTORIA"

A questo punto andate a mangiare o fatevi un giretto per un paio d'ore dopo di che tornate e sperate di vedere la scritta VITTORIA

Il Comando && serve a serializzare i comandi cioè il comando successivo viene eseguito solo se quello precedente ha successo, quindi il messaggio VITTORIA apparirà soltanto se tutto è andato bene sino in fondo.
Dopo ogni comando c'è 2>err o 2>>err essi servono a reindirizzare i messaggi d'errore generati dai vari comandi nel file err, 2>err crea il file err e ci scrive dentro mentre 2>>err aggiunge i dati in fondo al file.
Il motivo della creazione di questo file è che durante una compilazione vengono generati due tipi di messaggio, quelli normali di avviso e quelli di errore diretti a due output differenti (lo standard output e lo standard error).
Su display questi messaggi vengono mischiati e quindi si ha difficoltà a trovare gli errori in mezzo ad un mare di messaggi.

Quindi se non vediamo apparire il messaggio VITTORIA ci basterà lanciare il comando kwrite err per leggerci con calma l'elenco degli errori generati.
Bisogna stare attenti comunque a distinguere gli errori dai messaggi d'avviso che finiscono anch'essi in questo file e che in genere non sono pericolosi.

2.7)Verifiche finali

Se avete visto la magica scritta VITTORIA dovreste essere a posto perchèémake install si occupa di tutti i lavori sporchi comunque conviene verificare.

2.7.1) Controllare la cartella /lib/modules

# ls -l /lib/modules
 
totale 4
drwxr-xr-x 3 root root 1024 2007-07-10 08:06 2.6.21-4mdv/
drwxr-xr-x 3 root root 1024 2007-07-14 13:56 2.6.21-4mdvMoreno/
#

Bene c'è la cartella dei moduli 2.6.21-4mdvMoreno

2.7.2) Controllare la cartella /boot

# ls -l /boot/
 
totale 6729
lrwxrwxrwx 1 root root      18 2007-07-14 10:00 config -> config-2.6.21-4mdv
-rw-r--r-- 1 root root   82864 2007-07-06 16:16 config-2.6.21-4mdv
-rw-r--r-- 1 root root   82870 2007-07-14 13:58 config-2.6.21-4mdvMoreno
-rw-r--r-- 1 root root  530944 2007-07-01 09:32 gfxmenu
drwxr-xr-x 2 root root    1024 2007-07-14 13:58 grub/
-rw-r--r-- 1 root root  800023 2007-07-07 07:27 initrd-2.6.21-4mdv.img
-rw-r--r-- 1 root root  800017 2007-07-14 13:58 initrd-2.6.21-4mdvMoreno.img
lrwxrwxrwx 1 root root      22 2007-07-07 07:27 initrd.img -> initrd-2.6.21-4mdv.img
lrwxrwxrwx 1 root root      26 2007-07-14 10:00 kernel.h -> /boot/kernel.h-2.6.21-4mdv
-rw-r--r-- 1 root root    1493 2007-07-14 10:00 kernel.h-2.6.21-4mdv
lrwxrwxrwx 1 root root      22 2007-07-07 07:51 System.map -> System.map-2.6.21-4mdv
-rw-r--r-- 1 root root  691360 2007-07-06 16:16 System.map-2.6.21-4mdv
-rw-r--r-- 1 root root  691360 2007-07-14 13:58 System.map-2.6.21-4mdvMoreno
lrwxrwxrwx 1 root root      19 2007-07-07 07:27 vmlinuz -> vmlinuz-2.6.21-4mdv
-rw-r--r-- 1 root root 1583064 2007-07-06 16:16 vmlinuz-2.6.21-4mdv
-rw-r--r-- 1 root root 1583064 2007-07-14 13:58 vmlinuz-2.6.21-4mdvMoreno
#

Bene ci sono tutti i files *-2.6.21-4mdvMoreno.img

2.7.3) Controllare il file /boot/grub/menu.lst

# cat /boot/grub/menu.lst
 
timeout 10
color black/cyan yellow/cyan
gfxmenu (hd0,4)/boot/gfxmenu
default 1
 
title linux
kernel (hd0,4)/boot/vmlinuz BOOT_IMAGE=linux root=/dev/sda5 resume=/dev/sda6 splash=silent vga=788
initrd (hd0,4)/boot/initrd.img
 
title linux-nonfb
kernel (hd0,4)/boot/vmlinuz BOOT_IMAGE=linux-nonfb root=/dev/sda5 resume=/dev/sda6
initrd (hd0,4)/boot/initrd.img
 
title failsafe
kernel (hd0,4)/boot/vmlinuz BOOT_IMAGE=failsafe root=/dev/sda5 failsafe
initrd (hd0,4)/boot/initrd.img
 
title 2.6.21-4
kernel (hd0,4)/boot/vmlinuz-2.6.21-4mdv BOOT_IMAGE=2.6.21-4 root=/dev/sda5 resume=/dev/sda6 splash=silent vga=788
initrd (hd0,4)/boot/initrd-2.6.21-4mdv.img
 
title Moreno 2.6.21-4
kernel (hd0,4)/boot/vmlinuz-2.6.21-4mdvMoreno BOOT_IMAGE=Moreno_2.6.21-4 root=/dev/sda5 resume=/dev/sda6 splash=silent vga=788
initrd (hd0,4)/boot/initrd-2.6.21-4mdvMoreno.img
#

Bene c'è la nuova voce Moreno 2.6.21-4.

2.8)Riavviare la Macchina

Ebbene sì il cambio del kernel è praticamente l'unica operazione, a differenza di finestre, che richiede il riavvio della macchina.
Al boot dovrebbe presentarsi la voce Moreno 2.6.21-4 che noi selezioneremo facendo partire il processo di boot.

Se avete installato dei moduli DKMS questi verranno ricompilati per cui il boot procederà più lentamente del solito.
Verificate comunque che i moduli siano compilati correttamente non si sa mai.

Terminato il boot giusto per sfizio apriamo un terminale e

# uname -r
 
2.6.21-4mdvMoreno
#

Wow è proprio lui ce l'abbiamo fatta!!!!

3)Rimettere tutto in ordine

Una volta concluse le operazioni di compilazione del kernel è bene rimettere tutto in ordine caso mai volessimo compilarne un altro.

Per prima cosa ripetiamo le procedure spiegate nel punto 2.1)

3.1) Andare nella cartella contenente i file src del kernel

# cd /usr/src/linux-2.6.21-4mdv/
#

3.2) Cancellare tutti i files di compilazione e .config

# make mrproper
#

3.3) Recuperare .config

# cp .config.save .config
#

3.4) Recuperare Makefile

# cp Makefile.save Makefile
 
cp: sovrascrivo `Makefile'? s
#

4)Cancellare il Kernel

Nel caso il nuovo kernel dia problemi o non ci soddisfi bisogna rimuoverlo, purtroppo qui non si può fare urpme ma bisogna cancellarsi a mano tutti i riferimenti al kernel.

Prima di rimuovere il tutto fate il boot con un altro kernel altrimenti succede un DISASTRO!!!
Per cercare le ricorrenze del vostro kernel nel disco può tornar utile il comando locate

# updatedb
 
# locate -4mdvMoreno

4.1) Rimuovere i moduli kernel

# cd /lib/modules
 
# rm -rf 2.6.21-4mdvMoreno
#

4.1) Rimuovere i files di boot

# cd /boot
 
# rm -f System.map-2.6.21-4mdvMoreno
 
# rm -f config-2.6.21-4mdvMoreno
 
# rm -f initrd-2.6.21-4mdvMoreno.img
 
# rm -f kernel.h-2.6.21-4mdvMoreno
 
# rm -f vmlinuz-2.6.21-4mdvMoreno
#

4.2) Cercare eventuali moduli dkms

# cd /var/lib/dkms
 
# ls -l
 
totale 3
-rw-r--r-- 1 root root    6 2007-05-17 06:02 dkms_dbversion
drwxr-xr-x 4 root root 1024 2007-07-14 14:06 fuse/
drwxr-xr-x 3 root root 1024 2007-07-14 14:07 nvidia97xx/
#

Ovviamente questo riguarda solo il mio caso, voi potreste avere altri moduli dkms o non averli affatto.
4.3) Rimuovere i moduli Fuse

# rm -rf fuse/2.7.0-1mdv2008.0/2.6.21-4mdvMoreno/
#
# rm -f fuse/kernel-2.6.21-4mdvMoreno-i586
#

4.4) Rimuovere i moduli NVidia

# rm -rf nvidia97xx/100.14.11-1plf2008.0/2.6.21-4mdvMoreno/
#
# rm -f nvidia97xx/kernel-2.6.21-4mdvMoreno-i586
#

4.5) Eliminare la voce dal boot

Per eliminare la voce dal boot si apre il file /boot/grub/menu.lst

# kwrite /boot/grub/menu.lst</div>

Si eliminano le righe corrispondenti al nostro ex kernel.

title Moreno 2.6.21-4
kernel (hd0,4)/boot/vmlinuz-2.6.21-4mdvMoreno BOOT_IMAGE=Moreno_2.6.21-4 root=/dev/sda5 resume=/dev/sda6 splash=silent vga=788
initrd (hd0,4)/boot/initrd-2.6.21-4mdvMoreno.img

Bene con questo si conclude la mia fatica, spero che questa guida vi sia d'aiuto e vi tolga eventuali sensi di inferiorità verso altre distro.
Ripeto che sono anni che non compilo più un kernel e non ne sento la mancanza, comunque sapere come si fanno le cose è sempre un miglioramento.

Ciao Ciao Moreno





Commenti

Ritratto di rob_mdvita
#1

Inviato da rob_mdvita il Lun, 16/07/2007 - 10:55.

C FLAGS di ottimizzazione

Grazie mille, grande!! finalmente (vabbè come sempre!) una bella guida che fa un po' di chiarezza sulla compilazione del kernel!
La domanda che volevo fare ora è, anche non toccando niente della configurazione (cioè usando lo stesso file .config), se si mettono un po' di FLAGS in make per ottimizzare la compilazione personalizzandola per il proprio processore, si può ottenere un qualche miglioramento?
Per esempio nel mio caso, io ho un acer travel mate della serie 250 e il mio processore è un pentium 4.
Questo è il mio /proc/cpuinfo :

processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 2
model name : Intel(R) Pentium(R) 4 CPU 2.60GHz
stepping : 9
cpu MHz : 2598.151
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe up cid xtpr
bogomips : 5201.43

Leggendo un pò il manuale di gcc (non tutto che è enorme) ho visto che ci sono un casino di FLAGS che si possono aggiungere nella compilazione per ottimizzare il tutto per il proprio processore, penso che per il mio (un pentium IV appunto) siano queste le più indicate

-O3 -mtune=pentium4 -march=pentium4 -mfpmath=sse -malign-double -m128bit-long-double -mmmx -msse -msse2 -maccumulate-outgoing-args -mno-push-args

e forse anche queste (ma qui devo studiare ancora un po' il manuale, non ne sono del tutto sicuro)

-ffast-math -fstrength-reduce -fexpensive-optimizations -funroll-loops -frerun-loop-opt -falign-loops

Quindi quello che vorrei fare io è proprio ricompilare lo stesso .config che c'è ora ma con queste FLAGS di ottimizzazione.. secondo te ne vale la pena? grazie, ciao!



Ritratto di Moreno
#2

Inviato da Moreno il Lun, 16/07/2007 - 12:10.

_CM_RE: C FLAGS di ottimizzazione

Ciao

Mi sa che non ti conviene giocare con i parametri di cpp, c'è una apposita voce nel menu di configurazione del kernel.
Stò giusto compilando un kernel Low Latency, appena pronto faccio una guida.

Ciao Ciao Moreno

Addio, e grazie per tutto il pesce.
Avatar by moonlight-dream.



Ritratto di inventore1
#3

Inviato da inventore1 il Lun, 16/07/2007 - 16:20.

_CM_RE: C FLAGS di ottimizzazione

modificare le cflags può sicuramente puo portare a miglioramenti delle prestazioni, ma potresti anche peggiorarle o addirittura non riuscire a compilare il kernel oppure se ci riesci potrebbe avere dei problemi. per esempio -ffast-math a quanto pare da molti problemi, inoltre alcune delle flag da te citate (-mmmx e altre) sono già abilitate con -march=pentium4, quindi in pratica le duplichi.

p.s. -O3 a mio parere è una cflag esagerata che spesso crea problemi (esperienza personale :-P )

ciao ciao

Notebook: Intel Core 2 Duo T7200, 2Gb ram, 160GB hd, Intel GMA 950 Big Grin
Server: Amd athlon Xp 2000+, 512Mb ram, 80*2 hd Wink
CERCATE PRIMA DI POSTARE



Ritratto di Moreno
#4

Inviato da Moreno il Lun, 16/07/2007 - 16:27.

_CM_RE: C FLAGS di ottimizzazione

Ciao

OK Pubblicata guida per kernel a bassa latenza http://www.mandrakeitalia.org/modules/wfsection/article.php?articleid=266

Funziona Benissimo.

Ciao Ciao Moreno

Addio, e grazie per tutto il pesce.
Avatar by moonlight-dream.



Ritratto di Tony_Evo
#5

Inviato da Tony_Evo il Mar, 17/07/2007 - 10:48.

Piccolo Problema

Raga mi sa che ho combinato un casino,dopo aver aggiornato il Kernel(ho seguito la guida per quello a"bassa Latenza")ma dopo aver installato tutto,mi è comparsa la scritta vittoria e sempre seguendo la guida ho riavviato il PC,ma al riavvio mi entra solo in modalita testuale(probabilmente un problema di driver dato che avevo su i drvier nvidia) con tutti i kernel che ho,e se digito startx mi dice che non trova lo schermo e altre boiate.Come risolvo?ora sto scrivendo da sVista e gia non ne posso più voglio rientrare in linux Help!!

Hp Pavillion Dv6346eu,nVidia Go 6150,2 Gb di Ram,160 Gb HD.

MIBlog - http://mib.pianetalinux.org
Forum MIB - http://mib.pianetalinux.org/forum/index.php



Ritratto di killer1987
#6

Inviato da killer1987 il Mar, 17/07/2007 - 10:57.

_CM_RE: Piccolo Problema

prova da root con drakconf a riconfigurare il server grafico con i driver generici. poi da gui reinstalli i driver nvidia e dkms-nvidia per questo kernel e riprovi a riconfigurare il tutto con i driver proprietari... ti conviene aprire un thread apposito

Alé Mageia, C'mon Mageia!!! - Wiki Italiano Mandriva - Acer Aspire 5633, intel GMA 950, stamp HP Laserjet 1018, scanner Epson



Ritratto di Moreno
#7

Inviato da Moreno il Mar, 17/07/2007 - 12:02.

_CM_RE: Piccolo Problema

Ciao

Se hai i driver dkms verifica che siano stati correttamente compilati ed eventualmente riavvia la macchina.
Se invece hai i driver originali devi ricompilarti manualmente il driver.

Se per finire hai i moduli precompilati hai fatto una stupidata per cui devi rimuoverli ed installare i moduli dkms.

Ciao Ciao Moreno

Addio, e grazie per tutto il pesce.
Avatar by moonlight-dream.



Ritratto di gdeber
#8

Inviato da gdeber il Sab, 21/07/2007 - 16:48.

Piccola aggiunta

make install genera anche il ramdisk iniziale attraverso l'uso di mkinitrd.

Se si ha la necessità di passare delle opzioni allo script suddetto, si può fare attraverso il file /etc/sysconfig/installkernel.

Ad Esempio:
# -*- Mode: shell-script -*-<br />#       $Id: installkernel.sysconfig 30419 2004-06-29 04:50:42Z prigaux $<br /># Configuration option when installing a kernel and initrscript.<br /><br /># Set this to yes if you never want link from /boot/vmlinuz to the<br /># kernel.<br />NOLINK=&quot;&quot;<br /><br /># Set this to yes if you don&#039;t want to add entry to your bootloader<br />NOENTRY=&quot;&quot;<br /><br /># If you want to pass options to the &quot;make-initrd&quot; helper script you<br /># can do it here.<br />INITRDOPTS=&quot;--dsdt&quot;

In questo caso si passa l'opzione --dsdt utile per quelli come me che devono aggiungere il bios Acpi modificato.

Ciao

Debe

***L'assembler è alla base dell'universo®***



Ritratto di Moreno
#9

Inviato da Moreno il Sab, 01/09/2007 - 14:59.

Compiliamo i kernel Mandriva Guida da rivedere per la 2008.0

Ciao

Con la Mandriva 2008.0 che uscirà fra breve hanno rivoluzionato per l'ennesima volta la gestione dei kernel ufficiali, dovrò quindi modificare opportunamente la guida in modo da considerare questa ristrutturazione.

Ciao Ciao Moreno

Addio, e grazie per tutto il pesce.
Avatar by moonlight-dream.



Ritratto di Astragalo
#10

Inviato da Astragalo il Sab, 01/09/2007 - 15:51.

Re: Compiliamo i kernel Mandriva Guida da rivedere per la...

Ciao visto che probabilmante molti terranno la 2007.1 per un po di tempo suggerirei di lasciare la guida attuale magari indicando la versione facendola affiancare con quella futura.

A presto.