PROBLEMATICA
|
configurazione e ricompilazione del kernel.
|
COSA SONO I SORGENTI DEL KERNEL
|
I sorgenti del kernel sono l'insieme dei files, scritti nel linguaggio c, che permettono di creare un kernel, ossia il file principale per un sistema Linux. I sorgenti del kernel non devono, quindi, essere confusi con il kernel che si sta utilizzando su una macchina Linux.
Per fare un'analogia culinaria, i sorgenti del kernel sono gli ingredienti e la ricetta per una torta, il kernel è la torta!
Configurare il kernel significa "scegliere e modificare la ricetta" a seconda di cio' che ci piace: possiamo scegliere di fare la torta con le mele o con le noci, metterci la marmellata o il cioccolato.
Compilare il kernel significa "eseguire la ricetta", ossia mescolare gli ingredienti e mettere l'impasto nel forno, in modo da ottenere la torta.
|
DOVE TROVARE I SORGENTI DEL KERNEL
|
Il kernel puo' essere trovato:
a) nei CD relativi alla propria distribuzione;
b) sul sito (e ftp) relativo alla propria distribuzione;
c) sul sito (e ftp) www.kernel.org.
a) le distribuzioni, se complete, contengono i sorgenti del kernel (relativi al kernel di default che viene installato su PC) come pacchetto installabile. Alcune distribuzioni installano i sorgenti anche nell'installazione standard, altre lasciano la scelta all'utente. Se installati, di solito i sorgenti si trovano nella directory /usr/src/linux.
|
FONTE PRINCIPALE DEL DOCUMENTO
|
Le informazioni seguenti sono state tratte leggendo il manuale Reference Guide di RedHat 7. Il manuale è reperibile su www.redhat.com. Attenzione: non è la traduzione del documento, è solo una nostra descrizione di come si possa ricompilare il kernel dopo aver letto la Reference Guide.
|
COMPILATORE DA UTILIZZARE IN VECCHIE DISTRIBUZIONI
|
In alcune vecchie distribuzioni per ricompilare il kernel c'è bisogno di kgcc (compilatore C). La versione RedHat 7 lo contiene e lo installa subito. Chi non lo avesse, dovrebbe installarlo. Bisogna poi eseguire l'istruzione
export CC=kgcc
in modo che il make usi tale compilatore. Io eseguivo questa istruzione dopo aver eseguito make mrproper.
|
FASI
|
1) entrata in directory di ricompilazione;
2) creazione disco di boot di emergenza;
3) inizializzazione dell'albero dei sorgenti;
4) utilizzo di kgcc;
5) configurazione del kernel;
6) indicazione della EXTRAVERSION;
7) creazione di bzImage;
8) creazione dei moduli;
9) installazione dei moduli;
10) copia di bzImage in directory /boot;
11) creazione di una immagine initrd;
12) modifica di LILO;
13) attivazione di LILO con le modifiche;
14) boot di Linux con la nuova configurazione.
|
FASE 1: ENTRATA IN DIRECTORY DI RICOMPILAZIONE
|
Bisogna eseguire
cd /usr/src/local
per entrare nella directory dove risiedono i file necessari per la ricompilazione.
|
FASE 2: CREAZIONE DISCO DI BOOT DI EMERGENZA
|
Se non è stato fatto in fase di installazione, è necessario creare un dischetto di boot di emergenza. L'istruzione per crearlo è simile alla seguente:
mkbootdisk --device /dev/fd0 2.2.16
dove /dev/fd0 identifica il lettore di dischetti e al posto di 2.2.16 è necessario mettere la versione del kernel installata sul proprio pc. Per sapere la versiona installata di Linux, digitare uname -r Dopo la creazione del disco di boot, è necessario provarlo (ossia, riavviare la macchina con il dischetto inserito!!!). Se linux parte, eseguire il reboot senza dischetto e tornare nella directory /usr/src/local.
|
FASE 3: INIZIALIZZAZIONE DELL'ALBERO DEI SORGENTI
|
Si puo' reinizializzare l'installazione in modo da partire da una configurazione conosciuta (salvata in precedenza con make oldconfig), che in generale è quella corrispondente all'installazione iniziale. Per reinizializzare occorre eseguire il comando
make mrproper
|
FASE 4: UTILIZZO DI kgcc
|
Affinchè venga utilizzato il compilatore kgcc, è necessario eseguire il comando
export CC=kgcc
(questa indicazione non è segnalata sul reference Guide di RedHat 7). Come prima indicato, RedHat 7 installa kgcc. Se kgcc non è presente nel sistema, occorre installarlo.
|
FASE 5: CONFIGURAZIONE DEL KERNEL
|
Attraverso il comando
make menuconfig
è possibile configurare il kernel. In alternativa si puo' usare make xconfig in ambiente XWindow, o make config. Si dovrà abilitare con Y (Yes) o M (modulo) i moduli necessari alla configurazione voluta. Alla fine si dovrà salvare la configurazione.
|
FASE 6: INDICAZIONE DELLA EXTRAVERSION
|
E' necessario indicare una EXTRAVESION univoca per la versione del kernel compilata. L'extraversion è accodata alla versione del kernel. Ad esempio, se il mio kernel ha version=2.2.16 e extraversion=-ric01, la versione del kernel ricompilata sarà identificata da 2.2.16-ric01. Per modificare l'extraversion, occorre editare nel file Makefile (in /usr/src/local) la riga
EXTRAVERSION=-ric01
(dove -ric01 è un esempio: immettere qualsiasi valore voluto di extraversion).
|
FASE 7: CREAZIONE DI bzImage
|
La compilazione del kernel avviene attraverso i seguenti comandi (da eseguire nell'ordine indicato):
make dep make clean make bzImage
|
FASE 8: CREAZIONE DEI MODULI
|
Occorre ricreare i moduli con la configurazione indicata in make menuconfig (o in make xconfig, make config). Per far questo, occorre eseguire il comando
make modules
|
FASE 9: INSTALLAZIONE DEI MODULI
|
I nuovi moduli vengono installati con il comando
make modules_install
Nel nostro esempio, i moduli vengono installati nella directory /lib/modules/2.2.16-ric01, indicata in nel file Makefile.
|
FASE 10: COPIA DI bzImage IN DIRECTORY /boot
|
Occorre copiare nella directory di /boot e rinominare il file bzImage, immagine del kernel, che è stato creato dal comando make bzImage nella directory /usr/src/linux/arch/i386/boot/. Attraverso il comando
cp -p /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.2.16-ric01
si copia tale file nella directory di boot e lo si rinomina come vmlinuz-2.2.16-ric01. Tale file dovrà essere indicato nel file /etc/lilo.conf come indicato nella fase modifica di LILO (di seguito in questo documento).
|
FASE 11: CREAZIONE DI UNA IMMAGINE initrd
|
Solo se si ha un adattatore SCSI (o, come indicato da Crazy Rubens, dei controller che pur non essendo SCSI si spacciano per tali come, ad esempio, i ctrl ata100 e raid): se non si hanno adattatori SCSI, saltare questa fase!!!
Se si hanno adattatori SCSI, occorre creare un'immagine initrd. Le precondizioni indicate da RedHat per la creazione di initird sono le seguenti: a) deve essere disponibile la loopback block device; b) nel file /etc/conf.modules (o modules.conf) deve essere presente una riga del tipo alias scsi_hostadapter BusLogic per l'adattaore SCSI.
Per creare una nuova immagine initrd occorre eseguire il comando
/sbin/mkinitrd /boot/initrd-2.2.16-ric01 2.2.16-ric01
dove 2.2.16-ric01 è sempre indicato come esempio, come lo è il nome del file newinird-image! La nuova immagine initrd sarà contenuta nel file /boot/initrd-2.2.16-ric01 Attenzione: mentre si puo' indicare qualsiasi nome per il file immagine (invece di /boot/initrd-2.2.16-ric01, potevo mettere /boot/pongo), il parametro relativo alla versione e extraversion del kernel deve corrispondere a quello indicate nei passi precedenti, in quanto deve essere presente, nel nostro caso, la dirctory /lib/modules/2.2.16-ric01.
Il file creato dovrà poi essere indicato nel file /etc/lilo.conf, nella parte relativa alla configurazione da lanciare per il suo utilizzo. Vedere la fase modifica di LILO (di seguito in questo documento) per ulteriori spiegazioni.
|
FASE 12: MODIFICA DI LILO
|
Per eseguire il boot di Linux con la configurazione creata, occorre modificare il file /etc/lilo.conf, indicando i nuovi files creati in una nuova sezione. Chiamando come LinuxRic01 la nuova sezione, si dovranno aggiungere le linee indicate come parte da aggiungere a /etc/lilo.conf (le altre linee di seguito riportate variano a seconda della configurazione precedente, e quindi sono indicate solo a scopo di esempio) :
# modifiche /etc/lilo.conf
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
message=/boot/message
linear
default=linux
image=/boot/vmlinuz-2.2.16-12
label=linux
initrd=/boot/initrd-2.2.16-12.img
read-only
root=/dev/hda8
# da qui inizia la parte da aggiungere
image=/boot/vmlinuz-2.2.16-ric01 # nome file come indicato in fase 'copia di bzImage in directory /boot'
label=LinuxRic01 # nuova label indicata da LILO all'avvio del PC
initrd=/boot/initrd-2.2.16-ric01 # ATTENZIONE: aggiungere questa riga solo se è stata creata la nuova immagine initrd!
read-only
root=/dev/hda8 # come già indicato nella parte precedente (label 'linux')
# qui finisce la parte da aggiungere
other=/dev/hda1
label=dos
|
FASE 13: ATTIVAZIONE DI LILO CON LE MODIFICHE
|
Per rendere attiva la nuova configurazione di LILO, occorre eseguire il comando
/sbin/lilo
|
FASE 14: BOOT DI LINUX CON LA NUOVA CONFIGURAZIONE
|
Eseguire il reboot e scegliere LinuxRic01. In questo modo si utilizzerà la nuova configurazione.
|
RIFERIMENTI
|
www.redhat.com
|
CAMBIAMENTI
|
--. 26 febbraio 2002 15.00: precisazioni su initrd indicate da Crazy Rubens.
--. 26 febbraio 2001 17.40: creazione documento
|