Avanti Indietro Indice

2. Panoramica veloce - Compilazione del Kernel

Questa sezione è stata scritta da Al Dev (alavoor[AT]yahoo.com) (Gli ultimi aggiornamenti di questo documento sono reperibili a http://www.milkywaygalaxy.freeservers.com. Controllare lì eventuali cambiamenti). Siti mirror su - angelfire, geocities. Questi siti contengono molti consigli e chicche per linux.

La ricompilazione del kernel è necessaria per rendere il kernel più leggero e si traduce in maggiore VELOCITA` del sistema operativo. È anche necessaria per supportare nuove periferiche.

2.1 Precauzioni

Prima di generare il kernel, è buona abitudine fare un backup del sistema. Se non si è fatto il backup del proprio sistema recentemente, è il momento di farlo. Si possono usare tool commerciali come BRS Backup-Recovery-Software (in questa pagina è facile trovare strumenti open-source o freeware elencati sotto "Backup and Restore Utility"). Il backup è consigliato, non è obbligatorio ai fini della compilazione del kernel Linux.

2.2 Per quelli impazienti

  1. Decomprimere (spacchettare) i sorgenti
  2. make clean
  3. make xconfig
  4. make dep
  5. make
  6. make bzImage
  7. make modules
  8. make install
  9. make modules_install
  10. configurare LILO o GRUB.
Per i dettagli, ci si riferisca alla sezione successiva.

2.3 Compilazione del Kernel - Spiegazione delle varie fasi

Spiegazione dettagliata delle fasi accennate nella sezione precedente:

Nota: Più avanti "bash#" indica il prompt della bash, si devono digitare i comandi che appaiono dopo il prompt "bash#". Seguono i comandi testati con il Kernel Redhat Linux 2.4.7-10, ma dovrebbero funzionare anche per le altre distribuzioni, con piccole differenze, ed anche con le vecchie versioni del kernel, 2.2, 2.0 e 1.3.

  1. Nota: Si possono avere più immagini del kernel sul proprio sistema. Seguendo i passaggi sottoindicati non si sovrascriverà o danneggerà il kernel già esistente. I passaggi sono molto sicuri e il kernel attualmente in uso rimarrà intatto e non sarà toccato.

  2. Si faccia il login come "root" per eseguire tutti questi passaggi. Si monti il cdrom di Linux Redhat e s'installino i pacchetti dei sorgenti del kernel.
    bash$ su - root
    bash# cd /mnt/cdrom/Redhat/RPMS
    bash# rpm -i kernel-headers*.rpm
    bash# rpm -i kernel-source*.rpm
    bash# rpm -i dev86*.rpm
    bash# rpm -i bin86*.rpm
    

    (I pacchetti "bin86*.rpm" e "as86" sono necessari solo per i sistemi Linux meno recenti, come Redhat 5.x. Si può ottenere l'assemblatore per sistemi Intel "as86" da dev86*.rpm sul cdrom o da bin86-mandrake , bin86-kondara ).

  3. "make xconfig" o "make menuconfig" forniscono una interfaccia GUI amichevole. "make config", invece, presenta un'interfaccia a riga di comando. Si può caricare il file di configurazione da /usr/src/linux/.config (notare il punto prima di "config").

  4. All'interno di "make xconfig" si deve fare così per evitare problemi:

  5. Salvare e uscire da "make xconfig". Tutte le opzioni scelte verranno adesso salvate nel file di configurazione in /usr/src/linux/.config. Ora si dia:
    bash# make dep
    bash# make clean
    

  6. Leggere il seguente file (per acquisire alcune conoscenze sulla compilazione del kernel). Suggerimento: si usi l'editor a colori gvim per una maggiore leggibilità.
    bash# gvim -R   /usr/src/linux/arch/i386/config.in
    bash# man less
    bash# less   /usr/src/linux/arch/i386/config.in
    Digitare "h" per aiuto, per navigare premere "i", "j", "k", "l", "h" o i tasti freccia e PagSu/Giù. 
    

  7. Adesso, bisogna dare il comando make:
            bash# cd /usr/src/linux
            bash# man nohup
            bash# nohup make bzImage &
            bash# man tail
            bash# tail -f nohup.out     (.... per monitorare la progressione)
    Questo metterà il kernel in /usr/src/linux/arch/i386/boot/bzImage
    

  8. Se tutto è andato bene, copiare l'immagine del kernel nella directory /boot. Si deve copiare la nuova immagine del kernel in /boot, altrimenti il nuovo kernel NON si avvierà. Sotto Redhat Linux ci sono due possibili boot loader: Lilo e (2) GRUB. Quindi è meglio leggere le pagine di man su lilo (ed anche http://www.linuxdoc.org/HOWTO/LILO-crash-rescue-HOWTO.html) e il file di esempio sample lilo.conf. Si aggiunga sempre una data in coda al nome del file, per ricordare quando è stato costruito il kernel, come mostrato qui sotto:
    bash# cp /usr/src/linux/arch/i386/boot/bzImage     /boot/bzImage.myker.26mar2001
    bash# man lilo
    bash# man lilo.conf
    

    Si inseriscano queste righe nel file /etc/lilo.conf
            image=/boot/bzImage.myker.26mar2001
            label=myker
            root=/dev/hda1
            read-only
    

    Si può controllare il device fornito a "root=" con il comando:
            bash# df   /
    

  9. A questo punto dare:
    bash# lilo
    bash# lilo -q
    

    Si deve rilanciare lilo anche se la voce "myker" esiste già, ogni volta che viene creata una nuova bzImage.

  10. Riavviare la macchina e, quando appare lilo, premere il tasto TAB e digitare "myker". Se il boot va a buon fine allora è stato fatto un buon lavoro! Altrimenti al prompt di lilo di selezioni il vecchio kernel, si faccia il boot e si riprovi tutto dall'inizio. Il vecchio kernel è ancora INTATTO e al SICURO, per dire potrebbe chiamarsi /boot/vmlinuz-2.0.34-0.6.

    Se il nuovo kernel, contrassegnato con "myker", si avvia e funziona bene, si può creare il disco di boot. Inserire un dischetto vuoto nel lettore e dare:


    bash# cd /usr/src/linux
    bash# make bzdisk
    

    Si dia anche un'occhiata a mkbootdisk:


    bash# rpm -i mkbootdisk*.rpm
    bash# man mkbootdisk
    

  11. MODULI CARICABILI: Questo passo è necessario SOLO se si è abilitato il supporto per i moduli caricabili nella fase 3. I moduli caricabili si trovano in /lib/modules. Il passo è OBBLIGATORIO se è stato abilitato o disabilitato un qualsiasi modulo, altrimenti si otterrà l'errore "unresolved symbols" durante o dopo il boot del kernel. Si controlli il comando insmod, ampiamente usato per caricare i moduli.
    bash# cd /usr/src/linux
    bash# make modules
    bash# make modules_install
    

    Questo copierà i moduli nella directory /lib/modules. Per esempio, per caricare il modulo /lib/modules/2.4.2-2/kernel/drivers/block/loop.o, si dovrà fare:
    bash# man insmod
    bash# modprobe loop
    bash# insmod loop
    bash# lsmod
    

    Si può impostare il percorso secondo cui insmod effettua la ricerca in /etc/modules.conf

2.4 Come risolvere alcuni dei problemi più comuni

Il sistema si blocca all'avvio di LILO

Sintomo: Dopo che è stato compilato il kernel e riavviato il sistema, si blocca prima di LILO.

Motivo: Probabilmente i dischi fissi IDE non sono stati impostati correttamente nel BIOS.

Soluzione: Accendere il computer e premere DEL (CANC sulle tastiere italiane) per entrare nella configurazione del BIOS (Basic Input/Output System). Nelle impostazioni relative ai dischi IDE si impostino correttamente i dischi primari e secondari. All'avvio il sistema cerca il disco fisso IDE primario e il suo Master Boot Record, per ottenere la partizione da cui caricare il kernel Linux.

"No init found"

Un problema riferito comunemente dai nuovi utenti.

Se il proprio nuovo kernel non si avvia e si ottiene:


Warning: unable to open an initial console
Kernel panic: no init found. Try passing init= option to kernel

Il problema è che non è stato impostato correttamente il parametro "root=" in /etc/lilo.conf. Nel mio caso, ho usato root=/dev/hda1 per indicare la partizione su cui si trova la root ("/") del sistema. Si deve puntare in maniera corretta il device di root nel proprio lilo.conf, potrebbe essere qualcosa come /dev/hdb2 o dev/hda7.

Il kernel cerca il comando init, che si trova in /sbin/init, e la directory /sbin sta sulla partizione di root. Per dettagli:


bash# man init

"depmod" dà messaggi d'errore "Unresolved symbols"

Quando si fa partire depmod, questo dà "Unresolved symbols". Riporto un esempio di messaggi d'errore per dare una dimostrazione:


bash$ su - root
bash# man depmod
bash# depmod
depmod: *** Unresolved symbols in /lib/modules/version/kernel/drivers/md/linear.o
depmod: *** Unresolved symbols in /lib/modules/version/kernel/drivers/md/multipath.o
depmod: *** Unresolved symbols in /lib/modules/version/kernel/drivers/md/raid0.o
depmod: *** Unresolved symbols in /lib/modules/version/kernel/drivers/md/raid1.o
depmod: *** Unresolved symbols in /lib/modules/version/kernel/drivers/md/raid5.o

Motivo: Non è stato fatto "make modules" e non sono stati installati i moduli dopo aver compilato il nuovo kernel con "make bzImage".

Soluzione: Dopo aver fatto il nuovo kernel, si deve fare:


bash$ su - root
bash# cd /usr/src/linux
bash# make modules
bash# make modules_install

Il kernel non carica i moduli; si ricevono messaggi d'errore: "Unresolved symbols"

Quando si avvia il kernel, il sistema prova a caricare un qualsiasi modulo e restituisce "Unresolved symbol : __nome_di_qualche_funzione" allora significa che non si è dato "make clean". È obbligatorio dare make clean e compilare i moduli, nell'ordine. L'ordine corretto è:


        bash# cd /usr/src/linux
        bash# make dep
        bash# make clean
        bash# nohup make bzImage &
        bash# tail -f nohup.out     (.... per monitorare la progressione)
        bash# make modules
        bash# make modules_install

Il kernel fallisce nel caricare un modulo

Se il kernel non riesce a caricare un modulo (intendendo moduli caricabili per schede di rete o altri dispositivi), allora si potrebbe provare a compilare i device driver direttamente nel kernel. A volte i moduli caricabili NON funzionano e c'è bisogno di compilare i driver direttamente all'interno del kernel. Per esempio i device driver di alcune schede di rete non possono essere caricati come moduli e devono essere PER FORZA compilati nel kernel. Per questo motivo, in "make xconfig" NON SI DEVONO selezionare tali moduli come caricabili.

I moduli caricabili

Come installare i moduli caricabili predefiniti.

I passi seguenti non sono necessari ma lo diventano SOLO IN CASO D'EMERGENZA, quando i file in /lib/modules sono danneggiati. In caso esista già la directory /lib/modules e si vogliano rimpiazzare i file, si usi --force per sostituire il pacchetto e selezionare l'architettura della CPU appropriata [NdT sta parlando degli rpm].

Per versioni nuove di Redhat Linux 6.0 e successive, i moduli del kernel sono inclusi nel file kernel-2.2*.rpm. Installare i moduli caricabili e il kernel con:


        Questo elencherà i pacchetti già installati.
bash# rpm -qa | grep -i kernel

bash# rpm -U --force  /mnt/cdrom/Redhat/RPMS/kernel-2.2.14-5.0.i686.rpm
(o)
bash# rpm -U --force  /mnt/cdrom/Redhat/RPMS/kernel-2.2.14-5.0.i586.rpm
(o)
bash# rpm -U --force  /mnt/cdrom/Redhat/RPMS/kernel-2.2.14-5.0.i386.rpm

Questo vale solo per vecchie versioni di Redhat Linux 5.2 e precedenti. Avviare il nuovo kernel e installare i moduli caricabili dal cdrom "contrib" di Redhat Linux:


bash# rpm -i /mnt/cdrom/contrib/kernel-modules*.rpm
....(Per vecchi sistemi Linux che non hanno preinstallato insmod)

2.5 Dopo la compilazione del kernel

Dopo aver creato ed avviato con successo il kernel Linux, si potrebbe aver bisogno di fare queste operazioni per permettere ad alcune periferiche di lavorare correttamente con Linux. (I passi seguenti sono stati testati su Redhat Linux ma dovrebbero funzionare altrettanto correttamente con altre distribuzioni).

Configurazione della scheda video e del monitor:

Si può configurare la scheda video e il monitor utilizzando questi comandi:
bash$ su - root
bash# man Xconfigurator
bash# /usr/bin/X11/Xconfigurator --help
bash# /usr/bin/X11/Xconfigurator
bash# /usr/bin/X11/Xconfigurator --expert

Guardare anche:
bash# man xf86config
bash# /usr/bin/X11/xf86config

Se la scheda non viene rilevata automaticamente, allora si può utilizzare l'opzione --expert e selezionare "Unlisted card" ("scheda non elencata"). Se il monitor che si possiede non è elencato, allora selezionare il tipo di monitor "SVGA 1024x768".

Configurazione della scheda audio:


bash$ su -
bash# man sndconfig
bash# /usr/sbin/sndconfig

Quindi avviare il desktop KDE per X-window con il comando "startx". Cliccare su "K Start->Centro di controllo->Suono->Server sonoro->Generale->Prova suono". Questo dovrebbe produrre il suono di test. Infine cliccare su "K Start->MultiMedia->Suono->Mixer sonoro" e aggiustare il volume del suono.

Configurazione della scheda di rete:

Configurare il Firewall e l'IP Masquerading: Per il kernel Linux versione 2.4 e successive, il firewall e l'IP Masquerading sono implementati dal pacchetto NetFilter. Per cui nella configurazione del kernel si deve abilitare Netfilter e far partire lo script Firewall/IPMasq. Si possono scaricare gli script Firewall-IPMasq, , l'home page di NetFilter è su http://netfilter.samba.org. Materiale al riguardo è disponibile su firewalling-matures e Netfilter-FAQ. [NdT alcune traduzioni sono disponibili presso http//digilander.iol.it/amilinux/netfilter.html].

Per versioni del kernel precedenti la 2.4, si deve installare l'rpm del firewall da rpmfind.net o firewall.src.rpm.

Configurazione per altri dispositivi: consultare l'HOWTO relativo su http://www.linuxdoc.org

2.6 Un esempio di lilo.conf

Quello che si troverà qui sotto è un modello di file /etc/lilo.conf. Si dovrebbe usare la convenzione sui nomi come ker2217 (per il kernel 2.2.17), ker2214 (per il kernel 2.2.14). Si possono avere diverse immagini del kernel nella stessa /boot. Nella mia macchina ho qualcosa tipo:


boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
default=firewall

image=/boot/vmlinuz-2.2.14-5.0
        label=ker2214
        read-only
        root=/dev/hda9

image=/boot/vmlinuz-2.2.17-14
        label=ker2217
        read-only
        root=/dev/hda9

#image=/usr/src/linux/arch/i386/boot/bzImage
#       label=myker
#       root=/dev/hda7
#       read-only

image=/boot/bzImage.myker.11feb2001
        label=myker11feb
        root=/dev/hda9
        read-only

image=/boot/bzImage.myker.01jan2001
        label=myker01jan
        root=/dev/hda9
        read-only

image=/boot/bzImage.myker-firewall.16mar2001
        label=firewall
        root=/dev/hda9
        read-only


Avanti Indietro Indice