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.
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.
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.
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
bash# man startx bash# startx bash# cd /usr/src/linux bash# make xconfig
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
bash# rpm -i /mnt/cdrom/Redhat/RPMS/modutils*.rpm bash# man lsmod bash# man insmod bash# man rmmod bash# man depmod bash# man modprobe
bash# make dep bash# make clean
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ù.
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
bash# cp /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage.myker.26mar2001 bash# man lilo bash# man lilo.conf
image=/boot/bzImage.myker.26mar2001 label=myker root=/dev/hda1 read-only
bash# df /
bash# lilo bash# lilo -q
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
bash# cd /usr/src/linux bash# make modules bash# make modules_install
/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
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.
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
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
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
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.
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)
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:
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
Configurazione della scheda audio:
bash$ su - bash# man sndconfig bash# /usr/sbin/sndconfig
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
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