Costruzione di un kernel modulare

Questo paragrafo ha l'obiettivo di fornirvi le istruzioni per usufruire delle potenzialità del kernel modulare. Se non volete sfruttare i vantaggi del kernel modulare, consultate la la sezione Costruzione di un kernel monolitico per maggiori chiarimenti sui differenti aspetti nella costruzione ed installazione di un kernel monolitico.

I passaggi seguenti vi guideranno attraverso la costruzione di un kernel personalizzato facendo riferimento all'architettura x86.

NotaNota Bene
 

In questo esempio utilizzeremo la 2.4.2-0.1.21 come versione di kernel, ma la vostra versione può risultare differente. Per determinare la versione del vostro kernel, digitate il comando uname -r. Durante la lettura quindi sostituite 2.4.2-0.1.21 con la vostra attuale versione di kernel.

  1. È fondamentale accertarsi di avere un dischetto di emergenza funzionante in caso di eventuali errori. Se non ne avete creato uno in fase di installazione, utilizzate il comando mkbootdisk nel seguente modo: mkbootdisk --device /dev/fd0 2.4.x sostituendo 2.4.x con la versione del kernel installata sul vostro calcolatore. Una volta terminato, provate il disco di emergenza per assicurarvi che funzioni.

  2. Per procedere con la compilazione accertatevi di avere installato i pacchetti kernel-headers e kernel-source. Digitate i comandi rpm -q kernel-headers e rpm -q kernel-source per determinarne la loro versione, se sono installati. Se non sono stati installati, installateli dal CD 1 di Red Hat Linux oppure dal sito FTP di Red Hat: ftp://ftp.redhat.com. Sul sito http://www.redhat.com/mirrors.html potete trovare un elenco di mirror. Per maggiori informazioni sulla gestione dei pacchetti RPM, fate riferimento al Capitolo 17.

  3. Aprite un prompr di shell e spostatevi nella directory /usr/src/linux-2.4. Tutti i comandi che andrete a digitate da questo punto in avanti devono essere inviati da questa directory.

  4. È importante iniziare la ricompilazione del kernel con l'albero delle sottodirectory dei sorgenti il più "pulito" possibile. Pertanto, è consigliabile eseguire prima di tutto il comando make mrproper. Questo rimuove qualsiasi file di configurazione lasciato da eventuali precedenti ricompilazioni. Se già avete un file di configurazione (/usr/src/linux-2.4/.config) che volete utilizzare, salvatelo in una directory di backup prima di lanciare questo comando e poi ricopiatelo nella sua posizione originaria. Se desiderate utilizzare un file di configurazione preesistente andate al passo successivo.

  5. Adesso dovete creare un file di configurazione che andrà a determinare quali componenti includere nel vostro kernel.

    Se state lavorando in ambiente grafico X, il metodo raccomandato prevede l'utilizzo del comando make xconfig. I componenti vengono elencati in differenti livelli di menu e vengono selezionati utilizzando un mouse. Potete scegliere una delle seguenti opzioni: Y (yes) cioè compiliamo all'interno del kernel il driver, N (no) cioè non lo inseriamo nel kernel, oppure M (module) cioè compiliamo il driver come modulo. Dopo aver selezionato tutti i componenti, cliccate sul pulsante Save and Exit per generare il file /usr/src/linux-2.4/.config e uscire dalla fase di Configurazione del Kernel di Linux.

    Di seguito sono riportati altri metodi per la configurazione del kernel:

    • make config -- avvia un programma di testo interattivo. I componenti da includere nel kernel sono presentati sequenzialmente. Questo metodo non richiede il sistema X Window System e non vi permette di modificare le risposte alle domande immediatamente precedenti.

    • make menuconfig -- avvia un programma di configurazione tramite menu grafici. I componenti sono raggruppati e presentati in menu ordinati per categorie. Selezionate quelli desiderati nello stesso modo utilizzato durante il programma di installazione di Red Hat Linux. Selezionate gli elementi corrispondenti digitando un asterisco [*] per compilare il driver nel kernel, [ ] per escludere il supporto dal kernel, <M> oppure < > per inserire i supporti come moduli. Questo metodo non richiede il sistema X Window System.

    • make oldconfig -- Questo è uno script non interattivo che crea i Makefile necessari con la configurazione di default. Se state usando un kernel modificato, Red Hat Linux effettua un set up della configurazione di default. Ciò è utile per configurare il vostro kernel e averne quindi uno di default funzionante, per poi escludere le caratteristiche che non desiderate.

    NotaNota Bene
     

    Per poter utilizzare kmod (vedere la la sezione Caricamento dei moduli del kernel per maggiori dettagli) e i suoi moduli, dovete rispondere Yes a kmod support e a module version (CONFIG_MODVERSIONS) support.

  6. Dopo aver creato il file /usr/src/linux-2.4/.config, lanciate il comando make dep per risolvere correttamente tutte le dipendenze.

  7. Lanciate il comando make clean per preparare i sorgenti per la compilazione.

  8. Il passo successivo consiste semplicemente nel modificare il file /usr/src/linux-2.4/Makefile per non sovrascivere il kernel preesistente. Il metodo qui descritto è il più facile per evitare inconvenienti. Ulteriori approfondimenti sono riportati all'indirizzo http://www.redhat.com/mirrors/LDP/HOWTO/Kernel-HOWTO.html oppure nel Makefile nel vostro sistema Linux.

    Modificate il file /usr/src/linux-2.4/Makefile alla linea EXTRAVERSION = per ottenere un nome "univoco" (per esempio aggiungendo le vostre iniziali alla fine della stringa: EXTRAVERSION = -2.5.0sjs). Per esempio, se state compilando un kernel la cui versione è 2.4.2-0.1.21 potete inserire qualcosa del tipo EXTRAVERSION = -0.1.21-bet2001). Questo vi permette di avere i due kernel, quello vecchio e quello che vi accingete a compilare, contemporaneamente sul vostro sistema.

  9. Generate ora il kernel con il comando make bzImage.

  10. Costruite eventuali moduli che avete configurato con il comando make modules.

  11. Installate i nuovi moduli (anche se non ne avete ricompilati o modificati) con make modules_install. Assicuratevi di digitare l'underscore (_). Verrano installati nella directory /lib/modules/ usando il percorso specificato nel file Makefile. Nel nostro esempio diventa /lib/modules/2.4.2-0.1.21-12bet2001/.

  12. Se possedete un controller SCSI e avete ricompilato il driver SCSI come modulo, create una nuova immagine initrd (vedere la la sezione Creazione di un'immagine initrd). Tenete presente che ci sono diverse ragioni pratiche per impostare un driver SCSI modulare in un kernel personalizzato. A meno che non abbiate un motivo specifico per creare un'immagine initrd, vi consigliamo di non farlo e quindi di non modificare il file lilo.conf.

  13. Digitate il comando make install per copiare il vostro kernel e i file a esso associati nelle rispettive directory.

  14. Per avere a disposizione un modo sicuro per riavviare la macchina con un kernel funzionante, nel caso ci possa essere qualche errore nella configurazione del nuovo kernel, dovete conservare il kernel originale. Potete realizzare un sistema dual boot semplicemente aggiornando il file /etc/lilo.conf e poi scriverne il contenuto nell'MBR lanciando il comando /sbin/lilo.

    Il file di configurazione /etc/lilo.conf viene sotto riportato:
    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=50
    message=/boot/message
    linear
    default=linux
    
    image=/boot/vmlinuz-2.4.2-0.1.21
    	label=linux
            initrd=initrd-2.4.2-0.1.21.img
    	read-only
    	root=/dev/hda5
    Per aggiungere il vostro nuovo kernel a LILO, dupilicate la "stanza" esistente e modificatene la copia in modo tale da poter eseguire all'avvio l'immagine del vostro nuovo kernel. Rinominate anche l'etichetta del vecchio kernel, per esempio linux-old. Il vostro file /etc/lilo.conf assomiglia ora all'esempio seguente:
    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=50
    message=/boot/message
    linear
    default=linux
    	
    image=/boot/vmlinuz-2.4.2-0.1.21-12feb2001
    label=linux
    initrd=initrd-2.4.2-0.1.21-12feb2001.img
    read-only
    root=/dev/hda5
    		
    image=/boot/vmlinuz-2.4.2-0.1.21
    label=linux-old
    initrd=initrd-2.4.2-0.1.21.img
    read-only
    root=/dev/hda5

  15. Per rendere esecutive le modifiche appena compiute lanciate il comando /sbin/lilo. Se tutto funziona correttamente compare un output simile al seguente:
    Added linux *
    Added linux-old
    L'* dopo linux significa che la sezione etichettata linux è il kernel che LILO esegue per default.

  16. Da ora in avanti, quando il sistema esegue il processo di boot compare, tra le opzioni, linux linux-old.

    Per eseguire il nuovo kernel (linux), premete semplicemente Invio oppure attendete il timeout di LILO. Se volete eseguire il vecchio kernel, selezionate linux-old e premete Invio.

  17. Potete effettuare un test sul nuovo kernel eseguendo un riavvio del vostro sistema e controllando i messaggi durante la fase di avvio per verificare che l'hardware del vostro computer venga riconosciuto correttamente.