<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> <HEAD> <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9"> <TITLE>The Linux Kernel HOWTO: Panoramica veloce - Compilazione del Kernel</TITLE> <LINK HREF="Kernel-HOWTO-3.html" REL=next> <LINK HREF="Kernel-HOWTO-1.html" REL=previous> <LINK HREF="Kernel-HOWTO.html#toc2" REL=contents> </HEAD> <BODY> <A HREF="Kernel-HOWTO-3.html">Avanti</A> <A HREF="Kernel-HOWTO-1.html">Indietro</A> <A HREF="Kernel-HOWTO.html#toc2">Indice</A> <HR> <H2><A NAME="s2">2. Panoramica veloce - Compilazione del Kernel</A></H2> <P>Questa sezione è stata scritta da <A HREF="mailto:alavoor[AT]yahoo.com">Al Dev (alavoor[AT]yahoo.com)</A> <B>(Gli ultimi aggiornamenti di questo documento sono reperibili a <A HREF="http://www.milkywaygalaxy.freeservers.com">http://www.milkywaygalaxy.freeservers.com</A>. Controllare lì eventuali cambiamenti).</B> Siti mirror su - <A HREF="http://www.angelfire.com/country/aldev0">angelfire</A>, <A HREF="http://www.geocities.com/alavoor/index.html">geocities</A>. Questi siti contengono molti consigli e chicche per linux. <P>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. <H2><A NAME="precautions"></A> <A NAME="ss2.1">2.1 Precauzioni</A> </H2> <P>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 <A HREF="http://24.221.230.253">BRS Backup-Recovery-Software</A> (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. <H2><A NAME="impatient"></A> <A NAME="ss2.2">2.2 Per quelli impazienti</A> </H2> <P> <OL> <LI> Decomprimere (spacchettare) i sorgenti</LI> <LI> make clean</LI> <LI> make xconfig</LI> <LI> make dep</LI> <LI> make</LI> <LI> make bzImage</LI> <LI> make modules</LI> <LI> make install</LI> <LI> make modules_install</LI> <LI> configurare LILO o GRUB.</LI> </OL> Per i dettagli, ci si riferisca alla sezione successiva. <H2><A NAME="steps"></A> <A NAME="ss2.3">2.3 Compilazione del Kernel - Spiegazione delle varie fasi</A> </H2> <P><B>Spiegazione dettagliata delle fasi accennate nella sezione precedente: </B> <P><B>Nota: </B>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. <P> <OL> <LI> <B>Nota: </B> 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 <B>molto sicuri</B> e il kernel attualmente in uso rimarrà intatto e non sarà toccato. <P> <P> </LI> <LI>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. <HR> <PRE> 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 </PRE> <HR> (I pacchetti "bin86*.rpm" e "as86" sono necessari solo per i sistemi Linux <B>meno recenti</B>, come Redhat 5.x. Si può ottenere l'assemblatore per sistemi Intel "as86" da dev86*.rpm sul cdrom o da <A HREF="http://rpmfind.net/linux/RPM/mandrake/7.1/Mandrake/RPMS/bin86-0.4-12mdk.i586.html">bin86-mandrake</A> , <A HREF="http://rpmfind.net/linux/RPM/kondara/jirai/i586/bin86-0.4-8k.i586.html">bin86-kondara</A> ). <P> <P> </LI> <LI> <UL> <LI> Avviare X-window con "startx". Se non si riesce ad avviare X-window, si salti al passaggio successivo. <HR> <PRE> bash# man startx bash# startx bash# cd /usr/src/linux bash# make xconfig </PRE> <HR> </LI> <LI> Se non si riesce ad avviare X-window , si provi: <HR> <PRE> bash# export TERM=xterm bash# make menuconfig Se appare una schermata indecifrabile, allora bisogna usare emulatori di terminali diversi, come vt100, vt102, vt220 o ANSI. Lo schermo sarà un po' incasinato e mostrerà caratteri spazzatura in caso si usi telnet per collegarsi al sistema remoto. In tali casi si dovranno usare emulatori di terminale come vt100, vt220. Per esempio: bash# export TERM=vt220 bash# export TERM=ansi Ad un livello più basso, adoperare: bash# export TERM=vt100 bash# make menuconfig Se il comando menuconfig fallisce, allora si provi: bash# make config </PRE> <HR> </LI> </UL> <B>"make xconfig" o "make menuconfig"</B> forniscono una interfaccia GUI amichevole. <B>"make config"</B>, invece, presenta un'interfaccia a riga di comando. Si può caricare il file di configurazione da <I>/usr/src/linux/.config</I> (notare il punto prima di "config"). <P> <P> </LI> <LI> All'interno di "make xconfig" si deve fare così per evitare problemi: <UL> <LI> Scegliere il tipo di CPU appropriato: Pentium 3, AMD K6, Cyrix, Pentium 4, Intel 386, DEC Alpha, PowerPc, altrimenti il kernel non si avvierà!!</LI> <LI> Scegliere il supporto SMP: se CPU singola o CPU multiple</LI> <LI> Filesystem: selezionare Windows95 Vfat, MSDOS, NTFS come parte del kernel e non come moduli caricabili. (Questa è una mia preferenza personale, ma ognuno è libero di scegliere quel che gli pare).</LI> <LI> Attivare il supporto per i moduli caricabili del kernel! Con questa opzione si potranno caricare e scaricare i device driver al volo mentre il sistema linux sta girando. Si consultino queste pagine di man <HR> <PRE> bash# rpm -i /mnt/cdrom/Redhat/RPMS/modutils*.rpm bash# man lsmod bash# man insmod bash# man rmmod bash# man depmod bash# man modprobe </PRE> <HR> </LI> </UL> <P> <P> </LI> <LI> Salvare e uscire da "make xconfig". Tutte le opzioni scelte verranno adesso salvate nel file di configurazione in <I>/usr/src/linux/.config</I>. Ora si dia: <HR> <PRE> bash# make dep bash# make clean </PRE> <HR> <P> <P> </LI> <LI> Leggere il seguente file (per acquisire alcune conoscenze sulla compilazione del kernel). Suggerimento: si usi l'editor a colori <A HREF="http://www.linuxdoc.org/HOWTO/Vim-HOWTO.html">gvim</A> per una maggiore leggibilità. <HR> <PRE> 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ù. </PRE> <HR> <P> <P> </LI> <LI> Adesso, bisogna dare il comando make: <HR> <PRE> 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 </PRE> <HR> <P> <P> </LI> <LI> 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 <B>NON</B> 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 <A HREF="http://www.linuxdoc.org/HOWTO/LILO-crash-rescue-HOWTO.html">http://www.linuxdoc.org/HOWTO/LILO-crash-rescue-HOWTO.html</A>) e il file di esempio <A HREF="#liloconf">sample lilo.conf</A>. Si aggiunga sempre una data in coda al nome del file, per ricordare quando è stato costruito il kernel, come mostrato qui sotto: <HR> <PRE> bash# cp /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage.myker.26mar2001 bash# man lilo bash# man lilo.conf </PRE> <HR> Si inseriscano queste righe nel file /etc/lilo.conf <HR> <PRE> image=/boot/bzImage.myker.26mar2001 label=myker root=/dev/hda1 read-only </PRE> <HR> Si può controllare il device fornito a "root=" con il comando: <HR> <PRE> bash# df / </PRE> <HR> <P> <P> </LI> <LI> A questo punto dare: <HR> <PRE> bash# lilo bash# lilo -q </PRE> <HR> Si deve rilanciare lilo anche se la voce "myker" esiste già, ogni volta che viene creata una nuova bzImage. <P> <P> </LI> <LI> 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 <B>è ancora INTATTO e al SICURO</B>, per dire potrebbe chiamarsi <I>/boot/vmlinuz-2.0.34-0.6</I>. <P> <P>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: <HR> <PRE> bash# cd /usr/src/linux bash# make bzdisk </PRE> <HR> <P>Si dia anche un'occhiata a mkbootdisk: <HR> <PRE> bash# rpm -i mkbootdisk*.rpm bash# man mkbootdisk </PRE> <HR> <P> <P> </LI> <LI> <B>MODULI CARICABILI: </B> Questo passo è necessario <B>SOLO</B> 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. <HR> <PRE> bash# cd /usr/src/linux bash# make modules bash# make modules_install </PRE> <HR> Questo copierà i moduli nella directory /lib/modules. Per esempio, per caricare il modulo <CODE>/lib/modules/2.4.2-2/kernel/drivers/block/loop.o</CODE>, si dovrà fare: <HR> <PRE> bash# man insmod bash# modprobe loop bash# insmod loop bash# lsmod </PRE> <HR> Si può impostare il percorso secondo cui insmod effettua la ricerca in /etc/modules.conf</LI> </OL> <H2><A NAME="ss2.4">2.4 Come risolvere alcuni dei problemi più comuni</A> </H2> <P> <H3>Il sistema si blocca all'avvio di LILO</H3> <P><B>Sintomo: </B> Dopo che è stato compilato il kernel e riavviato il sistema, si blocca prima di LILO. <P><B>Motivo: </B> Probabilmente i dischi fissi IDE non sono stati impostati correttamente nel BIOS. <P><B>Soluzione: </B> 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. <H3>"No init found"</H3> <P>Un problema riferito comunemente dai nuovi utenti. <P>Se il proprio nuovo kernel non si avvia e si ottiene: <HR> <PRE> Warning: unable to open an initial console Kernel panic: no init found. Try passing init= option to kernel </PRE> <HR> <P>Il problema è che <B>non</B> è 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. <P>Il kernel cerca il comando init, che si trova in /sbin/init, e la directory /sbin sta sulla partizione di root. Per dettagli: <HR> <PRE> bash# man init </PRE> <HR> <H3>"depmod" dà messaggi d'errore "Unresolved symbols"</H3> <P>Quando si fa partire <CODE>depmod</CODE>, questo dà "Unresolved symbols". Riporto un esempio di messaggi d'errore per dare una dimostrazione: <HR> <PRE> 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 </PRE> <HR> <P><B>Motivo: </B> Non è stato fatto "make modules" e non sono stati installati i moduli dopo aver compilato il nuovo kernel con <CODE>"make bzImage"</CODE>. <P><B>Soluzione: </B> Dopo aver fatto il nuovo kernel, si deve fare: <HR> <PRE> bash$ su - root bash# cd /usr/src/linux bash# make modules bash# make modules_install </PRE> <HR> <H3>Il kernel non carica i moduli; si ricevono messaggi d'errore: "Unresolved symbols"</H3> <P>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 <B>make clean</B> e compilare i moduli, nell'ordine. L'ordine corretto è: <HR> <PRE> 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 </PRE> <HR> <H3>Il kernel fallisce nel caricare un modulo</H3> <P>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><B>i moduli caricabili NON funzionano</B></I> 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. <H3>I moduli caricabili</H3> <P>Come installare i moduli caricabili predefiniti. <P>I passi seguenti non sono necessari ma lo diventano <B>SOLO IN CASO D'EMERGENZA</B>, 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]. <P>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: <HR> <PRE> 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 </PRE> <HR> <P>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: <HR> <PRE> bash# rpm -i /mnt/cdrom/contrib/kernel-modules*.rpm ....(Per vecchi sistemi Linux che non hanno preinstallato insmod) </PRE> <HR> <P> <H2><A NAME="postkernel"></A> <A NAME="ss2.5">2.5 Dopo la compilazione del kernel</A> </H2> <P>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). <P><B>Configurazione della scheda video e del monitor: </B> <UL> <LI> È consigliabile consultare il manuale della scheda video, solitamente fornito con il PC. Si deve guardare nelle specifiche tecniche.</LI> <LI> È consigliata anche la consultazione del manuale del monitor, sempre nella sezione delle specifiche tecniche.</LI> </UL> Si può configurare la scheda video e il monitor utilizzando questi comandi: <HR> <PRE> 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 </PRE> <HR> 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". <P><B>Configurazione della scheda audio: </B> <UL> <LI> Connettere le casse alla porta della scheda audio.</LI> <LI> Connettere il cavo audio del CDROM alla presa a 4 pin della scheda audio. (Altrimenti il proprio lettore CD non suonerà la musica dei CD audio - NdT non vale per i nuovi cavi 80 poli).</LI> <LI> Per maggiori informazioni si possono consultare gli HOWTO relativi presso <A HREF="http://www.linuxdoc.org">http://www.linuxdoc.org</A> - NdT o le traduzioni italiane, ove presenti, presso <A HREF="http://ildp.linux.it/HOWTO">http://ildp.linux.it/HOWTO</A>.</LI> </UL> <HR> <PRE> bash$ su - bash# man sndconfig bash# /usr/sbin/sndconfig </PRE> <HR> 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. <P><B>Configurazione della scheda di rete: </B> <UL> <LI> Usare /sbin/linuxconf</LI> <LI> Oppure si può adoperare il pannello di controllo KDE</LI> <LI> Per maggiori informazioni si possono consultare gli HOWTO relativi presso <A HREF="http://www.linuxdoc.org">http://www.linuxdoc.org</A>.</LI> </UL> <P><B>Configurare il Firewall e l'IP Masquerading: </B> 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 <A HREF="http://www.BoingWorld.com/workshops/linux/iptables-tutorial">script Firewall-IPMasq</A>, , l'home page di NetFilter è su <A HREF="http://netfilter.samba.org">http://netfilter.samba.org</A>. Materiale al riguardo è disponibile su <A HREF="http://www.linuxsecurity.com/feature_stories/kernel-netfilter.html">firewalling-matures</A> e <A HREF="http://netfilter.filewatcher.org/netfilter-faq.html">Netfilter-FAQ</A>. [NdT alcune traduzioni sono disponibili presso <A HREF="http//digilander.iol.it/amilinux/netfilter.html">http//digilander.iol.it/amilinux/netfilter.html</A>]. <P>Per versioni del kernel precedenti la 2.4, si deve installare l'rpm del firewall da <A HREF="http://rpmfind.net/linux/rpm2html/search.php?query=firewall">rpmfind.net</A> o <A HREF="http://rpmfind.net/linux/RPM/contrib/noarch//SRPMS//firewall-2.2-3.src.html">firewall.src.rpm</A>. <P><B>Configurazione per altri dispositivi: </B> consultare l'HOWTO relativo su <A HREF="http://www.linuxdoc.org">http://www.linuxdoc.org</A><H2><A NAME="liloconf"></A> <A NAME="ss2.6">2.6 Un esempio di lilo.conf </A> </H2> <P>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: <HR> <PRE> 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 </PRE> <HR> <HR> <A HREF="Kernel-HOWTO-3.html">Avanti</A> <A HREF="Kernel-HOWTO-1.html">Indietro</A> <A HREF="Kernel-HOWTO.html#toc2">Indice</A> </BODY> </HTML>