Capitolo successivo Capitolo precedente Indice

12. Kernel

Il kernel è il ``nocciolo'' del sistema operativo. I programmi utilizzano le funzioni fornite dal kernel, e in questa maniera sono sollevati dall'agire direttamente con la CPU.

Il kernel è costituito normalmente da un unico file il cui nome è solitamente vmlinuz (oppure zImage, zbImage e altri), ma può comprendere anche moduli aggiuntivi per la gestione di componenti hardware specifici che devono poter essere attivati e disattivati durante il funzionamento del sistema.

12.1 Kernel monolitico o modulare

Il kernel può essere predisposto in un unico file, oppure può utilizzare qualche modulo aggiuntivo attivabile e disattivabile a piacere durante il funzionamento. Nel primo caso si parla di kernel monolitico e nel secondo di kernel modulare.

Il kernel monolitico ha il vantaggio di avere tutto in un file, ma nello stesso modo è rigido e non permette di liberare risorse quando le unità periferiche gestite non servono.

Il kernel modulare ha il vantaggio di poter disattivare e riattivare i moduli a seconda delle esigenze, in particolare quando moduli diversi gestiscono diversamente lo stesso tipo di unità periferica. A causa della frammentazione in diversi file, l'uso dei moduli può essere fonte di errori.

In generale, l'uso dei kernel modulari dovrebbe essere riservato agli utilizzatori che hanno già una esperienza sufficiente nella gestione dei kernel monolitici.

Ci sono situazioni in cui l'uso di un kernel modulare è praticamente indispensabile. L'esempio tipico è la gestione simultanea da parte del kernel della stampa e di un collegamento PLIP sulla stessa porta parallela (verrà descritto più avanti).

12.2 Ricompilazione del kernel

Le distribuzioni di Linux tendono a fornire agli utilizzatori un kernel modulare per usi generali. Anche se questo si adatterà sicuramente alla maggior parte delle configurazioni, ci sono situazioni particolari dove è preferibile costruire un proprio kernel, monolitico o modulare che sia.

Per poter comprendere il procedimento di compilazione descritto in questo capitolo, occorre sapere come si compila e installa un tipico programma distribuito in forma sorgente, come descritto nel capitolo `Installazione di programmi distribuiti in forma sorgente o compilata.

12.3 Kernel monolitico

Il procedimento descritto nelle sezioni seguenti serve per generare un kernel monolitico, cioè un kernel in un unico file.

Materiale necessario

Per poter procedere alla compilazione del kernel è necessario avere installato gli strumenti di sviluppo software, cioè il compilatore, e i sorgenti del kernel.

I sorgenti del kernel possono anche essere reperiti attraverso vari FTP. In tal caso si può fare una ricerca per i file che iniziano per linux-x.y.z.tar.gz, dove x.y.z sono i numeri della versione.

Versioni del kernel

Il numero di versione del kernel è strutturato in tre livelli: x.y.z, dove il primo, x, rappresenta il valore più importante, mentre l'ultimo, z, rappresenta quello meno importante. Quello che conta, è porre attenzione al valore intermedio: y. Se si tratta di un numero pari, la versione si riferisce a un kernel ritenuto sufficientemente stabile, mentre un numero dispari rappresenta una versione destinata agli sviluppatori e non ritenuta sufficientemente sicura per l'utilizzo normale.

Collocazione dei sorgenti e link simbolici

Se i sorgenti sono stati installati attraverso un disco (un CD-ROM) di una distribuzione, questi si troveranno al loro posto, altrimenti occorre provvedere a installarli manualmente. La posizione in cui devono trovarsi i sorgenti del kernel è la directory /usr/src/linux. Se si utilizza un altra posizione è necessario utilizzare un link simbolico che permetta di raggiungere i sorgenti nel modo prestabilito.

Occorre inoltre verificare che tre link simbolici contenuti nella directory /usr/include/ siano corretti.

È evidente che il primo, asm, dipende dal tipo utilizzato di piattaforma hardware.

Configurazione

La prima cosa da fare è quella di posizionarsi nella directory dei sorgenti. La seconda è leggere il contenuto del file README.

In linea di massima si procede nel modo seguente per definire una nuova configurazione.

# cd /usr/src/linux

La directory corrente deve essere quella a partire dalla quale si diramano i sorgenti del kernel.

# make mrproper

Serve a eliminare file e collegamenti vecchi che potrebbero interferire con una nuova compilazione.

# make config

È l'operazione più delicata attraverso la quale si definiscono le caratteristiche e i componenti del kernel che si vuole ottenere. Ogni volta che si esegue questa operazione viene riutilizzato il file .config contenente la configurazione precedentemente impostata, e alla fine la nuova configurazione viene salvata nello stesso file. Di conseguenza, ripetendo il procedimento make config, le scelte predefinite corrisponderanno alle scelte effettuate precedentemente.

<!>   Il comando make mrproper elimina il file .config, quindi si deve fare attenzione a non eseguire questo comando se non è questa l'intenzione.

Se si dispone di un kernel recente, in alternativa a make config che è un metodo piuttosto spartano di configurare il sistema, si possono utilizzare:

# make menuconfig

un sistema di configurazione a menu basato su testo;

# make xconfig

un sistema di configurazione a menu grafico per X Window System.


Il menu principale della configurazione del kernel attraverso il comando make menuconfig.


Uno dei menu della configurazione del kernel attraverso il comando make xconfig.

Compilazione

La compilazione può essere ottenuta utilizzando la sequenza di comandi seguente.

# make dep ; make clean ; make zImage

Si tratta di tre operazioni che si possono tranquillamente avviare in questo modo perché non richiedono nessun tipo di interazione con l'utente. Al termine della compilazione, se questa ha avuto successo, il nuovo kernel si trova nella directory /usr/src/linux/arch/i386/boot con il nome zImage (questo naturalmente vale nel caso si utilizzi l'architettura PC ovvero i386).

<!>   Se il kernel che si genera è troppo grande, potrebbe non funzionare l'istruzione make zImage. In tal caso si deve sostituire con make bzImage e alla fine si otterrà un file con quel nome, cioè bzImage.

Naturalmente, per fare in modo che il kernel possa essere utilizzato, andrà collocato dove è necessario che si trovi perché il sistema che si occupa del suo avvio possa trovarlo. Se si usa LILO, occorrerà copiarlo sulla directory radice o in /boot/ e rinominarlo vmlinuz (come di consueto), oltre che ripetere l'installazione del sistema di caricamento LILO.

Verifica del kernel

Il modo migliore (nel senso che è meno pericoloso) per verificare il funzionamento di un nuovo kernel è quello di farne una copia in un dischetto di boot.

# cp /usr/src/linux/arch/i386/boot/zImage /dev/fd0

Per utilizzare correttamente questo dischetto di boot è molto probabile che si debba utilizzare il programma rdev ( rdev).

12.4 Kernel modulare

Il procedimento per la creazione di un kernel modulare inizia nello stesso modo di quello monolitico e giunge alla creazione di un file che in più ha dei riferimenti a moduli esterni che vengono compilati a parte. Questi moduli, per poter essere gestiti correttamente, necessitano di programmi di utilità che si occupano della loro attivazione e disattivazione.

Materiale necessario

Oltre che dei sorgenti del kernel, sono necessari i programmi per la gestione dei moduli. Questi si trovano normalmente in pacchetti il cui nome è organizzato in modo simile a quello dei sorgenti kernel: modules-x.y.z.tar.gz. La struttura della versione rappresentata dai numeri x.y.z rispecchia lo stesso meccanismo utilizzato per i sorgenti del kernel, però non ne vengono prodotte altrettante versioni: si dovrà badare a utilizzare la versione più vicina a quella del kernel che si utilizza.

Questo pacchetto si trova normalmente nella stessa directory del sito FTP dal quale si ottengono i sorgenti del kernel.

Anche i programmi contenuti nel pacchetto modules-x.y.z.tar.gz sono in forma sorgente e per poter essere utilizzati devono essere compilati e installati.

<!>   Se si sta ricompilando il kernel attraverso i sorgenti della distribuzione Linux che si ha installato, è ragionevole supporre che questi programmi di gestione dei moduli siano già stati installati correttamente.

Compilazione e installazione dei moduli

Dopo la preparazione del file principale del kernel attraverso lo stesso procedimento visto nel caso di un kernel monolitico, si devono compilare i moduli.

# make modules ; make modules_install

Quello che si ottiene sono una serie di file oggetto, il cui nome ha una estensione .o, raggruppati ordinatamente all'interno di directory discendenti da /lib/modules/x.y.z/, dove x.y.z rappresenta il numero della versione dei sorgenti del kernel. La posizione di questi file non deve essere cambiata.

12.5 Gestione dei moduli

I moduli vengono attivati e disattivati durante il funzionamento del sistema attraverso un daemon, kerneld, che esegue le operazione automaticamente ed in modo trasparente, o attraverso i programmi insmod e rmmod.

Quando si fa riferimento ai file dei moduli, spesso si omette l'indicazione dell'estensione .o.

Nelle sezioni seguenti si analizzano alcuni programmi per la gestione dei moduli e viene in particolare trascurata l'analisi di modprobe(1) e depmod(1).

# kerneld

kerneld [debug] [keep] [delay=<secondi>] [type=<numero-messaggio>]

kerneld è il daemon che si occupa di gestire automaticamente i moduli del kernel, sempre che quest'ultimo sia stato compilato in modo da includere questa possibilità di gestione automatizzata.

kerneld viene normalmente attivato attraverso la procedura di avvio del sistema.

Vedere kerneld(1).

# insmod

insmod [<opzioni>] <file-oggetto> [<simbolo>=<valore>... ]

insmod permette di caricare un modulo nel kernel. Il nome del modulo può essere indicato specificando il nome del file completo di estensione ed eventualmente di percorso (path), oppure semplicemente specificando il nome del file del modulo senza l'estensione: in quest'ultimo caso, insmod cerca il file (con la sua naturale estensione) all'interno delle directory standard per i moduli.

Quando nel kernel è attivato il supporto del kernel daemon e il daemon kerneld è in funzione, non dovrebbe essere necessario l'utilizzo di insmod per caricare i moduli.

Esempi

# insmod /lib/modules/2.0.30/net/plip.o

Attiva il modulo plip rappresentato dal file /lib/modules/2.0.30/net/plip.o.

# insmod plip

Come nell'esempio precedente, ma si lascia a insmod il compito di cercare il file.

Vedere insmod(1).

# rmmod

rmmod [-r] <modulo>...

rmmod permette di scaricare uno o più moduli dal kernel, sempre che questi non siano in uso e non ci siano altri moduli caricati che vi fanno riferimento.

Nella riga di comando vengono indicati i nomi dei moduli e non i nomi dei file dei moduli.

Se vengono indicati più moduli nella riga di comando, questi vengono scaricati nell'ordine in cui appaiono.

Se viene usata l'opzione -r, viene tentata una rimozione ricorsiva di tutti i moduli utilizzati da quelli indicati nella riga di comando.

Quando nel kernel è attivato il supporto del kernel daemon e il daemon kerneld è in funzione, non dovrebbe essere necessario l'utilizzo di rmmod per scaricare i moduli.

<!>   rmmod è in realtà solo un link a insmod che quindi cambia il suo comportamento quando viene avviato utilizzando quel nome.

Esempi

# rmmod plip

Scarica il modulo plip.

$ lsmod

lsmod permette di visualizzare la situazione sull'utilizzo dei moduli. Le stesse informazioni ottenibili da lsmod si possono avere dal contenuto del file /proc/modules.

Utilizzando lsmod si ottiene una tabellina di tre colonne:

Esempi

Supponendo di avere appena caricato il modulo plip si può ottenere quanto segue.

# lsmod [Invio]

Module:        #pages:  Used by:
plip               3            0

12.6 Elementi della configurazione

Gli elementi richiesti per la configurazione del kernel prima della sua compilazione, dipendono molto dalla versione che si possiede. Nelle sezioni seguenti è riportata la descrizione delle voci più importanti.

Code maturity level options
Loadable module support
General setup
Floppy, IDE, and other block devices
Networking options
SCSI support
Network device support
ISDN subsystem
CD-ROM drivers (not for SCSI or IDE/ATAPI drives)
Filesystems
Character devices
Sound
Kernel hacking

Code maturity level options

Loadable module support

Questa sezione della procedura di configurazione permette di attivare il sistema di gestione dei moduli. I moduli sono blocchetti di kernel precompilati che possono essere attivati e disattivati durante il funzionamento del sistema. Solo alcune parti del kernel possono essere gestite in forma di modulo.

<!>   Conviene riservare l'utilizzo dei moduli alle situazioni in cui ciò è indispensabile o almeno di sicura utilità.

General setup

Floppy, IDE, and other block devices

Un dispositivo a blocchi è quello che utilizza una comunicazione a blocchi di byte di dimensione fissa e si contrappone al dispositivo a caratteri con cui la comunicazione avviene byte per byte. Il tipico dispositivo a blocchi è una unità a disco.

Networking options

La configurazione dei servizi di rete è importante anche se il proprio computer è isolato.

SCSI support

Network device support

ISDN subsystem

CD-ROM drivers (not for SCSI or IDE/ATAPI drives)

Se si dispone di un lettore CD-ROM diverso dagli standard SCSI o IDE/ATAPI, se ne deve selezionare il modello esatto.

Filesystems

Character devices

Un dispositivo a caratteri è quello che utilizza una comunicazione byte per byte e si contrappone a quello a blocchi con cui la comunicazione avviene attraverso l'uso di blocchi di byte di dimensione fissa.

Sound

Kernel hacking

Questa parte della configurazione è strettamente riservata agli esperti nella gestione del kernel e in generale serve per attivare un sistema di registrazione del comportamento del kernel stesso, allo scopo di ottenerne la sua ottimizzazione.

12.7 PLIP e stampa

Per poter creare un kernel adatto alla gestione della porta parallela sia per la stampa che per un collegamento PLIP, occorre necessariamente attivare la gestione dei moduli ( `Modules support') e indicare che il supporto al PLIP ( `PLIP support') e alla stampante parallela ( `Printer support') avvengano attraverso moduli.

 

1997.10.26 - Scritto da Daniele Giacomini   daniele@calion.com   (vedi copyright: Appunti Linux).


Capitolo successivo Capitolo precedente Indice