Linux: compilare il Kernel
COSA E' IL KERNEL
Si può immaginare il kernel come una specie di cuore del
sistema operativo.
Esso, infatti, non è altro che una una sorta di
"programma a basso livello", che si prende cura dei
processi (ovvero dei programmi in esecuzione) e che funge da
interfaccia tra il livello delle applicazioni e l'hardware
sottostante; i suoi compiti principali, oltre a filtrare le
richieste dei processi verso l'hardware, sono quelle di
mantenere traccia degli stessi, di riservare a ciascuno uno
spazio nella memoria e di gestire quello che in termini
informatici viene definito come "scheduling", una
funzione atta a garantire che tutti i programmi in esecuzione
possano fruire della CPU per le elaborazioni.
IL KERNEL DI LINUX
Il kernel di Linux, sviluppato dall'ormai
ultraosannato Linus Torlvalds e da altri volontari, viene
innanzitutto distribuito come sorgente in linguaggio C, ed è
proprio per questo motivo che deve essere compilato
"personalmente" per poterlo utilizzare (un listato
in linguaggio C non può infatti essere eseguito direttamente
dal computer... deve venire prima trasformato in un formato
fruibile direttamente - il formato eseguibile - attraverso una
fase che viene detta "compilazione"). Esistono varie
versioni del kernel, in quanto questo viene costantemente
aggiornato per migliorarne le prestazioni e/o correggere Bug
presenti nelle versioni precedenti.
VERSIONI DI KERNEL:
Esistono in contemporanea due versioni differenti dei
sorgenti del kernel, una assolutamente stabile per gli utenti
"normali" e una più "sperimentale" (ma
comunque altamente stabile in linea di massima) per gli
sviluppatori e gli smanettoni: attualmente le versioni stabili
sono quelle contraddistinte con il numero di versione 2.0.X,
mentre quelle per gli sviluppatori hanno il numero di versione
2.1.X. Per capire se una versione del kernel è stabile o meno
si osserva il secondo numero di versione (quello in mezzo):
numeri pari = stabile, numeri dispari = sperimentale (infatti
2.0.X è stabile, 2.1.X è sperimentale).
Per conoscere quali siano le release più recenti del kernel
occorre digitare al prompt dei comandi, una volta collegati
alla rete:
finger @ftp.kernel.org
Questo è quanto appare a me in questo
momento:
gnomix:~> finger @ftp.kernel.org
[linux.kernel.org]
The latest stable version of the Linux kernel is: 2.0.35
The latest *beta* version of the Linux kernel is: 2.1.126
gnomix:~>
(gnomix è il nome della mia macchina).
COSA SERVE
Oltre all'ultima versione di kernel scaricato (possibilmente
stabile...), vi servirà il compilatore gcc e una conoscenza
per lo meno approssimativa del hardware del proprio Pc: tipo
di hard disk che si utilizza (IDE o SCSI), il CD-ROM
(oggigiorno dovrebbero essere tutti IDE o SCSI, tuttavia
alcuni rimasugli del passato utilizzavano un controller
proprietario), ma anche i dati inerenti alla scheda sonora,
come ad esempio i numeri di DMA o IRQ. Queste informazioni le
possiamo ottenere "a scrocco" dal caro e amato
Windows 9X semplicemente premendo il pulsante destro su
"risorse del computer".
ED ORA LA COMPILAZIONE
Una volta determinato i vari componenti hardware con
i relativi indirizzi, bisogna entriare come root nel Pc e
spostarsi innanzitutto nella directory /usr/src (comando
"cd /usr/src"); dovremmo a questo punto trovare per
lo meno due directory (utilizzate il comando "ls"
per mostrare il contenuto della directory in questione): una
si chiama linux-2.0.X (la versione del kernel, sempre che
l'abbiate installata, contenuta nella distribuzione da voi
utilizzata e quasi sicuramente non la più recente
disponibile), mentre l'altra è un link a detta directory
(ovvero scrivendo "cd linux-2.0.X" o "cd linux"
si entra in pratica nella stessa directory). Visto che si è
in possesso di una versione più recente fare in modo di
sostituire i sorgenti obsoleti con quelli nuovi. L'operazione
in questione è eseguita dai seguenti comandi (da eseguire
ovviamente in /usr/src):
-
mkdir linux-2.2.5 (crea la directory che
andrà a contenere la versione del kernel 2.2.5)
-
rm linux (cancella il link simbolico che
punta alla vecchia directory dei sorgenti linux-2.0.X
-
ln -s linux-2.2.5 linux (crea un nuovo
link simbolico di nome linux che punta alla directory
2.2.5)
-
tar xzvf /percorso/linux-2.2.5.tar.gz (al
posto di percorso va sostituito il percorso in cui avete
scaricato i sorgenti; questa operazione estrae
dall'archivio compresso i sorgenti del kernel e li mette
nella directory linux-2.2.5 creata in precedenza).
-
rm -rf linux-2.0.X (cancella la vecchia
directory dei sorgenti 2.0.X; -rf aggiunto al comando rm (remove)
serve a dire "ricorsivo e forzato", in quanto il
comando in questione solitamente non cancella directory
che non sono vuote).
A questo punto occorre entrare nella directory
linux con un bel "cd linux" al fine di eseguire la
fase di messa a punto del kernel, che permetterà di scegliere
quali componenti dello stesso includere in quello che sarà il
nuovo cuore del Pc. A seconda del gusto personale sono
disponibili tre differenti comandi per compiere questa
operazione; la differenza sta esclusivamente nell'interfaccia
che si vuole utilizzare:
-
make config (modalità ascii: verrà
visualizzato un elenco in cui selezionare i componenti con
Y (yes), N (no) e M.
-
make menuconfig (sempre modalità testo ma
che si caratterizza per dei comodi menu in cui effettuare
la selezione con il tasto spazio).
-
make xconfig (da utilizzare se si ha
attivo X Window. Permetterà di selezionare i componenti
del kernel con pratici click del mouse).
Esistono 3 tipi di scelte da attribuire ai
vari componenti : è possibile includerne uno con yes
(asterisco se avete usato menuconfig), escluderlo con no (e in
questo caso non verrà compilato nel Kernel), ma è anche
possibile renderlo un "modulo" con la lettera
"M". Uno si chiederà: cosa significa
"modulo".È presto detto: sempre per alleggerire il
kernel e non includere al suo interno componenti che non si
utilizzano spesso, è possibile rendere questi ultimi
modulari; in questo caso sarà possibile caricarli e
scaricarli dalla memoria a seconda della necessità (se
utilizzate i moduli vi consiglio vivamente di dire yes al
supporto di kerneld che troverete tra le varie opzioni: esso
fa in modo che queste operazioni siano automatiche e
trasparenti all'utente; in caso contrario dovrete farle a
mano!).
N.B. Aggiungere elementi che non servono al kernel non
comporta nulla di particolare, se non aumentarne la dimensione
e/o renderlo un po' più "pesante".
UN PO' DI AIUTO!!!
Code maturity level options: conviene lasciare questa
voce così com'è, ovvero con la sola voce presente non
selezionata
Loadable module support: aggiungete al supporto dei
moduli nel kernel (voce Enable loadable module support) anche
kernel deamon support: serve a far caricare al kernel i moduli
in automatico.
General setup: in questo menu si seleziona il tipo di
processore, si abilita l'emulazione del coprocessore
matematico virtuale (per chi non ce lo avesse perché è ad
esempio in possesso di un processore 486SX) e si limita la
memoria a meno di 16 mega (l'opzione serve per alcune scheda
madri bacate del passato che non riuscivano bene a gestire la
memoria). Per un processore Pentium o superiore coviene
lasciare le cose così come stanno (a meno di non possedere un
PPro: in questo caso è possibile specificare questo tipo di
CPU).
Floppy, IDE and other block devices: questa sezione
è abbastanza lunga, ma per fortuna c'è ben poco da
cambiare... Innanzitutto, a meno di non essere in possesso di
una scheda madre che monta il chipset CMD640 o RZ1000,
conviene eliminare queste 2 voci (il 90% delle schede madri
montano in genere un chipset Intel, per lo meno per ora). Per
il resto lasciare tutto così com'è.
Networking options: è una buona scelta lasciare le
impostazioni così come stanno!
SCSI support: stessa cosa per questo menu... Se non
disponete di un controller SCSI o non intendete accedere a un
eventuale masterizzatore EIDE attivando l’emulazione
SCSI-ATAPI, lasciate tutto disabilitato (scelta di default).
Network device support: nel caso di una macchina che
si collega ad Internet mediante un modem selezionate come
modulo la voce "ppp"; opzionalmente selezionate
anche, sempre come modulo, la voce "plip": potrebbe
tornare utile per creare connessioni TCP/IP tra due computer
con un cavo null-modem parallelo. Infine, a meno che non
possediate una scheda di rete ethernet, consiglio di
deselezionare la voce "ethernet" e lasciare tutto il
resto così come è.
ISDN subsystem: se non si possiede di una connessione
ISDN lasciare tutto così come sta, ovvero con niente
selezionato.
CD-ROM drivers: questa voce serve ad includere nel
kernel il supporto per CD-ROM non ATAPI (quelli insomma che
fanno uso di controller proprietario). Se si possiede un
CD-ROM ATAPI lasciare tutto deselezionato.
Filesystems: seleziona i tipi di filesystem che il
kernel supporterà una volta compilato... Suggerisco di
mettere come modulo il filesystem "minix" e l'"extended"
(non si sa mai, potrebbero anche servirvi!), di lasciare
selezionato il "second extended" (se lo
deselezionate non riuscirete più a fare il boot della
macchina: è quello che utilizza Linux per le sue
partizioni!!), e di selezionare con "yes" le voci
"native language support", "ISO9660" (il
filesystem dei CD-ROM!), "DOS FAT", "MSDOS",
"FVAT" (i nomi lunghi nelle partizioni di Windows
95), "codepage 423", "NLS ISO 8859-1"
"proc". Se si pensa di aver bisogno di NFS (network
filesystem, serve per importare ed esportare il proprio
filesystem in rete) selezionarlo come modulo. Lasciare il
resto con le impostazioni di default.
Character devices: lasciare pure le cose come stanno,
a meno che non possesiate una stampate; in quest'ultimo caso
consiglio di selezionare il "parallel printer support"
come modulo, in quanto l'utilizzo della stampante non è cosa
indispensabile. NB: se si è in possesso di un mouse diverso
da quello seriale (ad esempio PS/2) sarà necessario
selezionare anche la voce "mouse support" e
scegliere il proprio mouse dall'elenco sottostante.
Sound card support: se si è in possesso di una
scheda sonora abilitare il supporto al sonoro.
Kernel hacking: queste due voci... per ora conviene
deselezionarle.
La procedura di configurazione è conclusa!!! Ora occore
quindi salvare la configurazione corrente con l'apposita
opzione e uscire dal programma.
E ORA I COMANDI!!!
Una volta eseguite le procedure precedenti occorre
eseguire questi 5 comandi:
make dep; make clean; make bzImage;
make modules; make modules_install
Questa operazione potrebbe richiedere diverso
tempo e, come al solito, ciò viene notevolemente influenzato
dal tipo di macchina che si sta utilizzando.
-
make dep; make clean: servono a
ripulire i sorgenti di compilazioni precedenti; se si ha
appena installato dei nuovi sorgenti, si possono anche
evitare questi passaggi, ma in ogni caso è buona
abitudine eseguirli (non si sa mai...).
-
make zImage: compila il nucleo
del kernel
-
make modules; make modules_install:
compilano ed installano i moduli al posto giusto.
Le ulrime operazioni da eseguire sono:
-
Rinominare il vecchio kernel (solitamente
si chiama vmlinuz) con estensione Old (non si sa mai,
potrebbe sempre servire, almeno fino a quando non sie è
sicuri che il nuovo kernel funzioni correttamente. In
questo caso cancellarlo).
N.b. Se non trovi la directory in cui è situato il kernel
vecchio edita il file lilo.conf situato nella directory
etc...
-
cp /usr/src/linux/arch/i386/boot/bzImage /vmlinuz
(copia il nuovo kernel, contenuto in /usr/src/linux/arch/i386/boot/
- ... il comando bzImage - nella root directory e lo
chiama vmlinux, proprio come quello vecchio).
-
lilo (serve ad aggiornare il LInux LOader
per fargli caricare il nuovo kernel).
-
shutdown -r now (fa il reboot della
macchina)
Se dopo il riavvio il Pc non ha dato messaggi
anomali e si è sicuri della stabilità del nuovo kernel,
conviene eliminare la vecchia directory di linux, ovvero la
2.0.x. Si noti che in fase di avvio potrebbero scorgere alcuni
messaggi di errore che reclamano la presenza dei moduli
"char-major-10", "net-pf-4" e
"net-pf-5". Si possono tranquillamente ignorarli, ma
se vi danno fastidio editate il file /etc/conf.modules ed
aggiungere le seguenti linee:
alias char-major-10 off
alias net-pf-4 off
alias net-pf-5 off
Al prossimo reboot tutto sarà sistemato...