LKN: Personalizzare un Kernel: differenze tra le versioni

Vai alla navigazione Vai alla ricerca
m (categoria)
m (copyright)
Riga 1: Riga 1:
''Torna all'indice: [[Linux Kernel in a Nutshell]]''
''Torna all'indice: [[Linux Kernel in a Nutshell]]''
__TOC__


Uno dei punti più delicati e difficili nella creazione della propria versione del kernel Linux è quello di determinare esattamente quali driver e quali opzioni di configurazione sono richiesti per il corretto funzionamento dalla macchina su cui viene installato.
I precedenti capitoli hanno mostrato come scaricare e compilare il kernel. Ora che si ha un file eseguibile -- con tutti i moduli compilati -- � ora di installare il kernel e provare a fare il boot. In questo capitolo, a differenza dei precedenti, tutti i comandi necessitano di essere eseguiti come utente root. Questo pu� essere fatto anteponendo ad ogni comando ''sudo'', usando il comando ''su'' per diventare root, oppure accedendo come ''root''.
Questo capitolo guiderà il lettore attraverso questo processo di selezione e scelta dei driver corretti.


==Usare un Kernel di una Distribuzione==
Per vedere se si ha ''sudo'' installato e gli appropriati diritti di accesso, lanciate:


Uno dei metodi più semplici, per determinare quali moduli siano necessari, è quello di partire dalla configurazione che viene installata dal pacchetto del kernel della distribuzione che si sta usando. È infatti molto più semplice determinare di quali driver si ha bisogno basandosi su quelli installati in un sistema in funzione, in cui i driver corretti sono già associati all'hardware in utilizzo.
<pre>
  $ sudo ls ~/linux/linux-2.6.17.11/Makefile
  Password:
  Makefile
</pre>


Se invece si sta personalizzando un kernel per una macchina sulla quale non è installata una distribuzione Linux, allora conviene partire dalla versione LiveCD di una distribuzione. Questo consente all'utente di far partire Linux sulla macchina in oggetto e di determinare in maniera semplice le opzioni di configurazione del kernel e che consentono il funzionamento ottimale della macchina stessa.
Inserite la vostra password personale al prompt di password, o la password del system administrator (root). La scelta dipende da come il comando di ''sudo'' � stato impostato. Se non ci sono problemi, e si vede una linea che contiene:


===Dove si Trova la Configurazione del Kernel?===
<pre> Makefile </pre>


Quasi tutte le distribuzioni prevedono i files di configurazione del kernel quale parte del pacchetto del kernel. Si consiglia di leggere la documentazione relativa alla Distribuzione stessa per sapere dove sono installati i files di configurazione. Solitamente si trova in una subdirectory attaccata a /usr/src/linux/.
allora potete passare alla prossima sezione.


Se avete difficoltà a trovare la configurazione del kernel, allora guardate nel kernel stesso. Molte distribuzioni implementano i files di configurazione nel kernel stesso, che è incluso nella directory /proc. Potete verificare se state usando una di queste distribuzioni digitando in command-line il seguente comando:
Se ''sudo'' non � installato o non si hanno i diritti appropriati, si provi ad usare il comando ''su'':
<pre>$ ls /proc/config.gz
/proc/config.gz</pre>


Se il file ''/proc/config.gz'' è presente, allora copiatelo nella directory del sorgente kernel ed estraetelo:
<pre>
  $ su
  Password:
  # exit
  exit
  $
</pre>


<pre>$ cp /proc/config.gz -/linux/
Al prompt della password, inserite la password del system administrator (''root''). Quando ''su'' accetta con successo la password, si � trasferiti ad eseguire ognicosa con i pieni privilegi di root. State molto attenti mentre siete ''root'', e fate solo il minimo necessario; dopodich� uscite dal programma per tornare con il vostro utente normale.
$ cd -/linux
$ gzip -dv config.gz
config.gz:      74.9% - - replaced with config</pre>
Copiate questo file di configurazione nella vostra directory del kernel e rinominatelo in ''.config''.
Ora potrete utilizzare questo file come base di partenza nella personalizzazione della configurazione del kernel così come descritto nel [[LKN:_Configurare_e_Compilare|Capitolo 4]].


Se si usa il file di configurazione in oggetto, allora quale buona norma, si dovrebbe anche sempre creare un'immagine del kernel operativo (funzionante) per la vostra macchina. Lo svantaggio derivante dall'utilizzo di questa immagine è il fatto che si dovrà configurare quasi ogni modulo del kernel e driver che si trova nel sorgente del kernel stesso. Infatti un kernel standard copre un gran numero di macchine e di hardware, questo ci consente di disattivare molti drivers ed opzioni che non vengono utilizzati nel nostro sistema. Si raccomanda comunque di disattivare solo quelle opzioni di cui siamo sicuri al 100% che non vengono utilizzate, ci possono essere infatti elementi del sistema che hanno necessitano di specifiche alla sola apparenza superflue.


===Determinare quali Moduli Siano Necessari===
== Usare uno script di installazione di una distribuzione ==


Il tempo di compilazione del file di configurazione, implementato in una distribuzione, è molto lungo, datosi che tutti i diversi driver vengono inizializzati. Si dovrebbe cercare di inizializzare solo i driver per l'hardware presente nel sistema, così da ridurre i tempi di compilazione del kernel, inoltre la selezione di alcuni o di tutti i driver nel kernel, consente una riduzione di memoria utilizzata ed in alcune architetture un funzionamento del sistema più veloce. Per escludere i driver dal kernel è necessario però determinare quali moduli sono indispensabili per il funzionamento dell'hardware installato. Attraverso l'utilizzo di due esempi, cercheremo di spiegare come determinare quali driver siano indispensabili al controllo dell'hardware.


Le informazioni che mettono in relazione i dispositivi ai driver presenti nel kernel sono conservate in vari spazi del sistema. Uno degli elementi più importanti dove sono salvate queste informazioni è il file di sistema ''sysfs''. All'inizializzazione di Linux ''sysfs'' normalmente dovrebbe essere caricato nella directory ''/sys''. ''sysfs'' consente di dare un'occhiata a come le varie parti del kernel sono legate l'un l'altra, questo lo si deduce grazie ai vari symlink che puntano all'interno dell'intero file di sistema.
Quasi tutte le distribuzioni hanno uno script chiamato ''installkernel'' che pu� essere usato dal sistema di creazione del kernel per installarne uno pronto automaticamente nel giusto posto e per modificare il bootloader cos� che nulla di pi� debba essere fatto dallo sviluppatore *.


In tutti gli esempi di seguito, saranno riportati listati reali di ''sysfs'' e saranno indicati tipi di hardware. La vostra macchina sarà certamente diversa, ma i luoghi relativi dove sono salvate le informazioni sono gli stessi. Non ci si deve allarmare se i nomi di file nel ''sysfs'' non sono i medesimi, rientra nelle aspettative.
<pre>
Le distribuzioni offrono installkernel solitamente in un package chiamato mkinitrd, provate ad installare
questo package se non trovate lo script sulla vostra macchina.
</pre>


Inoltre, la struttura interna del file di sistema ''sysfs'' cambia costantemente, questo dovuto sia alla riorganizzazione dei dispositivi sia alle revisioni del kernel tese a migliorare l'adattamento delle strutture interne del kernel allo spazio utilizzato. A causa di questo, col tempo, alcuni dei symlink, precedentemente menzionati in questo capitolo, possono non essere presenti. Tuttavia, le informazioni sono ancora tutte presenti, al massimo sono state spostate di qualche riga.
Se avete compilato qualsiasi modulo e volete usare questo metodo per installare un kernel, inserite:


====Esempio: Come Determinare il Driver di Rete====
'''# make modules_install'''


Uno degli elementi più comuni ed importanti in un sistema è la carta-interfaccia di rete. È essenziale capire quale driver la controlla ed attivarlo nella configurazione in maniera da consentire un corretto funzionamento delle connessioni di rete.
Questo installer� tutti i moduli che avete compilato e li metter� nelle appropriate locazioni del filesystem per farli trovare correttamente dal nuovo kernel. I moduli sono posti in ''/lib/modules/kernel_version'', dove per ''kernel_version'' si intende la versione del nuovo kernel che state preparando.


Primo: partendo dalle connessioni di rete si risale ai device PCI
Dopo che i moduli sono stati installati con successo, l'immagine principale del kernel deve essere installata:
<pre>$ ls /sys/class/net/
eth0  eth1  eth2  lo</pre>


La directory ''lo'' rappresenta il dispositivo di rete loopback, e non è dipendente da nessun dispositivo di rete realmente installato. Invece si dovrebbe riservare particolare attenzione alle directory ''eth0'', ''eth1'' e ''eth2'', datosi che si riferiscono a dispositivi realmente esistenti
'''# make install'''


Per determinare approfonditamente di quali dispositivi ci si deve occupare, si utilizza il comando ''ifconfig'':
Questo causer�:


<pre>$ /sbin/ifconfig -a
1. Il sistema di creazione del kernel verificher� che il kernel sia stato correttamente costruito.
eth0 Link  encap:Ethernet  HWaddr 00:12:3F:65:7D:C2
inet  addr:192.168.0.13  Bcast:192.168.0.255  Mask:255.255.255.0
UP BROADCAST NOTRAILERS RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:2720792 errors:0 dropped:0 overruns:0 frame:0
TX packets:1815488 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:3103826486 (2960.0 Mb) TX bytes:371424066 (354.2 Mb)
Base address:0xdcc0 Memory:dfee0000-dff00000
eth1 Link  encap:UNSPEC  HWaddr 80-65-00-12-7D-C2-3F-00-00-00-00-00-00-00-00
BROADCAST MULTICAST  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
eth2 Link  encap:UNSPEC  HWaddr 00-02-3C-04-11-09-D2-BA-00-00-00-00-00-00-00
BROADCAST MULTICAST  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
lo Link  encap:Local Lookback
        inet addr:127.0.0.1  Mask:255.0.0.0
UP  LOOPBACK  RUNNING  MTU:16436  Metric:1
RX packets:60 errors:0 dropped:0 overruns:0 frame:0
TX packets:60 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:13409 (13.0 Kb) TX bytes:13409 (13.0 Kb)</pre>


Da questo listato si può riconoscere nel dispositivo di rete <tt>eth0</tt>, quello attivo e funzionante, infatti nelle righe;
2. Il sistema di creazione copier� la parte statica nella directory ''/boot'' e rinominer� l'eseguibile sulla base della versione del kernel.


<pre>eth0 Link  encap:Ethernet  HWaddr 00:12:3F:65:7D:C2
3. Qualsiasi immagine di ramdisk iniziale necessaria verr� creata automaticamente, usando i moduli che sono appena stati installati durante la fase di ''modules_install''.
inet  addr:192.168.0.13  Bcast:192.168.0.255  Mask:255.255.255.0</pre>


4. Al programma di bootloader verr correttamente notificato che un nuovo kernel presente, e verr aggiunto nel giusto menu cos che l'utente possa selezionarlo la prossima volta che la macchina verr avviata.


5. Dopo questo ha finito, il kernel installato con successo, si pu tranquillamente riavviare e provare la nuova immagine di kernel. Notare che questa installazione non sovrascrive nessuna vecchia immagine dei kernel, cos se c' un problema con la vostra nuova immagine del kernel, il vecchio kernel potr essere selezionato al boot time.


Questo risultato dimostra che il dispositivo Ethernet si vede assegnato un indirizzo IP valido (<tt>inet</tt>).
<pre>
* Eccezioni da riportare a questa regola sono Gentoo e altre distribuzioni tipo "from scratch", le quali si
aspettano che l'utente sappia come installare i kernels da solo. Questi tipi di distribuzoni includono la
documentazione su come installare un nuovo kernel, si consulti quest'ultima per l'esatto metodo richiesto.
</pre>


Ora, dopo che abbiamo individuato il dispositivo <tt>eth0</tt> e ci siamo accertati di volerlo implementare nel nostro nuovo kernel, dobbiamo individuare quale driver lo controlla. Ciò si realizza con una semplice procedura, che è quella si seguire i link nel file di sistema sysfs, basta digitare un comando di una sola riga:
== Installazione manuale ==


<pre>$ basename `readlink /sys/class/net/eth0/device/driver/module`
e1000</pre>


Il risultato mostra che il modulo <tt>e1000</tt> controlla il dispositivo di rete <tt>eth0</tt>. Il comando ''basename'' racchiude in un'unica linea di comando i seguenti passaggi:
Se la distribuzione non � provvista del comando ''installkernel'', o si desidera semplicemnete fare il lavoro a mano per capire i passi che servono, eccoli qua:


: 1. Individua il symlink ''/sys/class/net/eth0/device'' contenuto all'interno della directory ''/sys/device/'', la quale contiene le informazioni relative al dispositivo che controlla ''eth0''. Fate attenzione al fatto che nelle nuove versioni del kernel la directory ''/sys/class/net/eth0'' potrebbe essere un symlink.
I moduli devono essere installati:


: 2. All'interno della directory che descrive il dispositivo in sysfs, c'è un symlink che punta al driver relativo a questo dispositivo. Questo symlink è nominato ''driver'', pertanto si segue questo collegamento.
<pre>  # make modules_install </pre>


: 3. All'interno della directory che descrive il driver in sysfs, c'è un symlink che punta al modulo che si trova all'interno del driver in oggetto. Questo symlink è chiamato <tt>module</tt>. Noi cerchiamo l'oggetto a cui punta questo symlink, per ottenerlo ci serviamo del comando ''readlink'', il quale produce un risultato simile a questo:
L'immagine statica del kernel deve essere copiata nella directory /boot. Per un kernel basato su piattaforma i386, fare:
<pre>$ readlink /sys/class/net/eth0/device/driver/module
../../../../module/e1000</pre>


: 4. Datosi che a noi interessa solo il nome del modulo e ci disinteressiamo del resto del risultato ottenuto con il comando ''readlink'', tenendo solo la parte più a destra del risultato. Questo è appunto ciò che il comando ''basename'' realizza. Esercitandolo direttamente sull'intero percorso, questo comando ci ritorna quanto segue:
<pre>
<pre>$ basename ../../../../module/e1000
  # make kernelversion
e1000</pre>
  2.6.17.11
</pre>


Così abbiamo inserito il lungo risultato del symlink, ottenuto da ''readlink'', quale parametro nel programma ''basemane'', permettendo così l'intero processo di essere realizzato in una sola riga.
Notare che la versione del kernel probabilmente sar� differente da quella del vostro. Usate questo valore al posto del testo KERNEL_VERSION nei seguenti passaggi:
Ora che abbiamo identificato il nome del modulo, si dovrebbe trovare l'opzione della configurazione del kernel che lo controlla. Si può cercare nei vari menu di configurazione dei dispositivi di rete oppure cercare nel codice sorgente del kernel stesso per essere sicuri di avere l'opzione giusta.
<pre>$ cd ~/linux/linux-2.6.17.8
$ find -type f -name Makefile | args grep e1000
./drivers/net/Makefile:obj-$(CONFIG_E1000) += e1000/
./drivers/net/e1000/Makefile:obj-$(CONFIG_E1000) += e1000.o
./drivers/net/e1000/Makefile:e1000-objs := e1000_main.o e1000_hw.o e1000_ethtool.o e1000_param.o</pre>


Si precisa che "e1000'', usato in questo esempio, deve essere sostituito con il nome del modulo che state analizzando.
<pre>
  # cp arch/i386/boot/bzImage /boot/bzImage-KERNEL_VERSION
  # cp System.map /boot/System.map-KERNEL_VERSION
</pre>


La cosa che più ci interessa nel risultato del comando ''find'' che abbiamo appena eseguito è l'identificazione di ogni singola linea dove compaia il termine <tt>CONFIG_</tt>. Questa è l'opzione di configurazione che il kernel deve aver attivato per poter caricare il modulo. Nell'esempio precedente l'opzione di configurazione che c'interessa è pertanto <tt>CONFIG_E1000</tt>.
Modificate il bootloader in modo che conosca il nuovo kernel. Questo implica modificare il file di configurazione per il bootloader che si usa, � spiegato pi� avanti in "Modificare il bootloader per il nuovo kernel" in GRUB e LILO.


Adesso si dispone dell'informazione necessaria per poter configurare il kernel. Si esegue lo strumento menu di configurazione:
Se il processo di avvio non funziona, solitamente � perch� una immagine iniziale di ramdisk (initial ramdisk) �  necessaria. Per crearla correttamente, si usino i passi all'inizio di questo capitolo per installare un kernel automaticamente, poich� lo script di installazione della distribuzione sa come creare adeguatamente il ramdisk usando gli scripts e gli strumenti necessari. Dato che ogni distribuzione fa questo in maniera differente, � oltre lo scopo di questo libro ricoprire tutti i differenti metodi di costruzione dell'immagine di ramdisk.
: <pre>$ make menuconfig</pre>
Dopodiché si prema il tasto / (slash) (che ha il compito di far partire una ricerca), e si digita l'opzione di configurazione, senza la parte di testo <tt>CONFIG_</tt>. Questo processo è mostrato nella figura 7-1.


Qui c' uno script agevole che pu essere usato per installare un kernel automaticamente invece di dover digitare tutti i precedenti comandi ogni volta:


''Figura 7-1. Ricerca in menuconfig''
<pre>
  #!/bin/sh
  #
  # installs a kernel
  #
  make modules_install


Il sistema di configurazione del kernel vi dirà ora esattamente dove selezionare l'opzione per abilitare questo modulo. Vedi figura 7-2.
  # find out what kernel version this is
  for TAG in VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION ; do
    eval `sed -ne "/^$TAG/s/ //gp" Makefile`
  done
  SRC_RELEASE=$VERSION.$PATCHLEVEL.$SUBLEVEL$EXTRAVERSION


  # figure out the architecture
  ARCH=`grep "CONFIG_ARCH " include/linux/autoconf.h | cut -f 2 -d "\""`


''Figura 7-2. Risultato della ricerca in menuconfig''
  # copy the kernel image
  cp arch/$ARCH/boot/bzImage /boot/bzImage-"$SRC_RELEASE"


La prima parte della schermata evidenzia quello che stavate cercando. Le informazioni mostrate dalla schermata vi dicono che per attivare il modulo <tt>E1000</tt> nel kernel, e che la seguente opzione di configurazione deve essere abilitata:
  # copy the System.map file
  cp System.map /boot/System.map-"$SRC_RELEASE"


: <tt>Device Drivers</tt>
  echo "Installed $SRC_RELEASE for $ARCH"
: : <tt>Network device support</tt>
</pre>
: : : <tt>[*] Network device support</tt>
: : : : <tt>Ethernet (1000 Mbit)</tt>
: : : : <tt>[*] Intel(R) PRO/1000 Gigabit Ethernet support</tt>


Queste procedure funzionano per ogni tipo di dispositivo attivo nel kernel.


==  Modificare il bootloader per il nuovo kernel ==


====Esempio: Un Dispositivo USB====


Come secondo esempio, esaminiamo ora un convertitore USB-seriale che è presente nel nostro sistema preso ad esempio. Attualmente il convertitore è collegato alla porta ''/dev/ttyUSB0'', pertanto si deve prendere in esame la sezione tty del ''sysfs''.
Esistono due bootloader comuni per i kernel Linux: GRUB e LILO. GRUB � quello maggiormente usato nelle distribuzioni moderne, e fa' alcune cose un po' pi� facilmente di LILO, ma LILO � tuttora anch'esso utilizzato. Li vedremo entrambi in questa sezione.
<pre>$ ls /sys/class/tty/ | grep USB
ttyUSB0</pre>
Potete ora eseguire una ricerca di questo dispositivo nel ''sysfs'' allo scopo di trovare il modulo che lo gestisce, utilizzando la stessa procedura mostrata nella sezione precedente:


<pre>$ basename `readlink /sys/class/tty/ttyUSB0/device/driver/module`
Per determinare quale bootloader il vostro sistema usa, guardate nella directory ''/boot/''. Se esiste una sottodirectory ''grub'':
pl2303</pre>
Dopodiché, per poter individuare l'opzione di configurazione che si deve abilitare, si cerca nell'albero del codice sorgente del kernel:
<pre>$ cd ~/linux/linux-2.6.17.8
$ find -type f -name Makefile | xargs grep pl2303
./drivers/usb/serial/Makefile:obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o</pre>


Si utilizzi lo strumento di configurazione del kernel, come indicato in figura 7-3, per trovare l'opzione adeguata da abilitare relativa al settaggio dell'opzione CONFIG_USB_SERIAL_PL2303.
<pre>
  $ ls -F /boot | grep grub
  grub/
</pre>


allora si sta utilizzando GRUB come programma per fare il boot. Se questa directory non presente, si guardi se presente il file ''/etc/lilo.conf'':


''Figura 7-3. Ricerca per USB_SERIAL_PL2303''
<pre>
  $ ls /etc/lilo.conf
  /etc/lilo.conf
</pre>


Nel nostro caso il risultato è mostrato nella figura 7-4.
se � presente, state usando LILO come programma per fare il boot.
I passi che implicano l'aggiunta del nuovo kernel a ognuno di questi programmi sono differenti, per cui si segua solo la sezione che corrisponde al programma che si sta usando.


==='''GRUB'''===


''Figura 7-4. Risultato della ricerca di USB_SERIAL_PL2303''
Per fare in modo che GRUB sappia che un nuovo kernel � presente, tutto ci� che dovete fare � modificare il file ''/boot/grub/menu/lst''. Per i dettagli completi della struttura di questo file, e tutte le differenti opzioni disponibili, consultate le pagine di info di GRUB:


Ciò mostra esattamente dove trovare l'opzione <tt>USB Profilic 2303 Single Port Serial Driver</tt> che è necessaria alla corretta gestione di questo dispositivo.


====Riassunto: Alla scoperta del dispositivo====
'''$ info grub'''


Riassumendo, ecco i vari passaggi che servono per identificare il driver funzionante di un dispositivo ad esso collegato:
: 1. Trovate la corretta classe ''sysfs'' del dispositivo a cui è collegato. I dispositivi di rete sono elencati in ''/sys/class/net'', mentre i dispositivi tty sono elencati in ''/sys/class/tty''. Gli altri vari dispositivi si possono trovare nelle altre sub-directory di ''/sys/class''.
: 2. Ricercate nell'albero di ''sysfs''  il nome del modulo che controlla il dispositivo in oggetto. Lo si trova in ''/sys/class/class_name/device_name/device/driver/module'', la ricerca è agevolata se si utilizzano i comandi ''readlink'' e ''basename''.
<pre>$ basename `readlink /sys/class/class_name/device_name/device/driver/module`</pre>
: 3. Ricercate nei file Makefile le definizioni di <tt>CONFIG_</tt> che costituiscono i nomi del modulo, usando i comandi ''find'' e ''grep''.
<pre>$ find -type f -name Makefile | xargs grep ''module_name''</pre>
: 4. Ricercate i valori di configurazione nel sistema di configurazione del kernel, dopodiché andate dove indicato dal menu per attivare il driver in oggetto.


Il metodo pi veloce per aggiungere una nuova voce kernel a ''/boot/grub/menu.lst'' quello di copiare una voce gi esistente. Per esempio, considerate il seguente ''menu.lst'' da un sistema Gentoo:


<pre>
  timeout 300
  default 0


====Lasciate che il Kernel ci Dica di Cui Abbiamo Bisogno====
  splashimage=(hd0,0)/grub/splash.xpm.gz
Dopo che ci siamo infilati attraverso tutti i punti riguardanti gli ''sysfs'' e seguendo i symlinks ai nomi del modulo, ora riportiamo uno script molto semplice che farà tutto quel lavoro, in un modo differente:
<pre>#!/bin/bash
#
# find_all_modules.sh
#
for i in `find /sys/ -name modalias -exec cat {} \;`; do
    /sbin/modprobe --config /dev/null --show-depends $1 ;
done | rev | cut -f i -d '/' | rev | sort -u</pre>
Si può scaricare un file d'esempio, contenente questo script, dal web site del libro, riportato nella sezione Come contattarci che si trova nella prefazione.


Questo script cerca nel ''sysfs'' tutti  file chiamati ''modalias''. Il file ''modalias'' contiene gli alias dei moduli e comunica al comando ''modprobe'' quali moduli sono abbinati, e pertanto attivati, ai vari dispositivi. L'alias del modulo è composto da una combinazione di: produttore del dispositivo, ID, tipo di classe ed altri identificativi univoci per il tipo di dispositivo in questione. Tutti i moduli del driver del kernel hanno una lista interna dei dispositivi che supportano, che è generata automaticamente dalla lista dei dispositivi che il driver comunica al kernel di poter supportare. Il ''modprobe'' ricerca tutti i driver nella lista dei dispositivi e cerca di trovare i riscontri con gli alias che questa lista ha. Se ha un riscontro, allora provvede al caricamento del modulo (questa procedura è come la funzionalità di caricamento automatico dei driver lavora in Linux).
  title 2.6.16.11
    root (hd0,0)
    kernel /bzImage-2.6.16.11 root=/dev/sda2 vga=0x0305


Lo script prevede l'arresto del programma ''modprobe'' prima di caricare il modulo, e riporta in display solo le azioni che eseguirebbe. Questo ci da una lista di tutti i moduli che sono utilizzati nel controllo di tutti i dispositivi del sistema. Eseguendo una piccola pulizia della lista, ordinandola e sistemando i campi adeguati, ci da un risultato come
  title 2.6.16
questo:
    root (hd0,0)
<pre>$ find_all_modules.sh
    kernel /bzImage-2.6.16 root=/dev/sda2 vga=0x0305
8139cp.ko
</pre>
8139too.koo
ehci-hcd.ko
fimware_vlass.ko
i2c-i801.ko
ieee80211.ko
ieee80211_crypt.ko
ipw2200.ko
mii.ko
mmc_core.ko
pcmcia_core.ko
rsrc_nonstatic.ko
sdhci.ko
snd-hda-codec.ko
snd-hda-intel.ko
snd-page-alloc.ko
snd-pmc.ko
snd-timer.ko
snd.ko
soundcore.ko
uhci-hcd.ko
usbcore.ko
yenta_socket.ko</pre>
Questa è la lista di tutti i moduli che sono necessari alla gestione dell'hardware della macchina.


Lo scritto potrà egualmente ritornare alcuni messaggi di errore che possono essere del tipo:
La linea che comincia con la parola title definisce una nuova voce di kernel, in questo modo questo file contiene due voci. Copiate semplicemente un blocco di linee che cominciano con la linea title, come:
<pre>FATAL: Module pci:v00008086d00002592sv000010CFsd000012E0bc03sc00i00 not found.
FATAL: Module serio:ty01pr00id00ex00 not found.</pre>
Questo ci dice che non si trova un modulo che gestisce il dispositivo. Questo non deve comunque interessare più di tanto, poiché alcuni dispositivi non hanno driver nel kernel che lavorino per loro.


==Determinare il Modulo Corretto Partendo da Zero==
<pre>
  title 2.6.16.11
    root (hd0,0)
    kernel /bzImage-2.6.16.11 root=/dev/sda2 vga=0x0305
</pre>


Dopodich aggiungete il blocco alla fine del file, e modificate il numero di versione con la nuova versione del nuovo kernel che si appena installato. Il titolo non ha alcuna importanza, purch unico, ma visualizzato nel menu di boot, per cui si dovrebbe dargli qualcosa che abbia un significato. Nel nostro esempio, abbiamo installato il kernel 2.6.17.11, per tanto la copia finale del file assomiglier a:


===Dispositivi PCI===
<pre>
  timeout 300
  default 0


  splashimage=(hd0,0)/grub/splash.xpm.gz


===Dispositivi USB===
  title 2.6.16.11
    root (hd0,0)
    kernel /bzImage-2.6.16.11 root=/dev/sda2 vga=0x0305


===Root Filesystem===
  title 2.6.16
    root (hd0,0)
    kernel /bzImage-2.6.16 root=/dev/sda2 vga=0x0305


  title 2.6.17.11
    root (hd0,0)
    kernel /bzImage-2.6.17.11 root=/dev/sda2 vga=0x0305
</pre>


====Controller di Disco====
Dopo che si � salvato il file, riavviate il sistema e assicuratevi che il titolo della nuova immagine del kernel sia presente nel menu di boot. Usate la freccia verso il basso per evidenziare la versione del nuovo kernel, e premete enter per avviare la nuova immagine.


===Un Aiuto dallo Script===
==='''LILO'''===
 
Per fare in modo che LILO sappia che un nuovo kernel � presente, dovete modificare il file di configurazione ''/etc/lilo.conf'' ed eseguire il comando ''lilo'' per applicare le modifiche fatte al file di configurazione. Per i dettagli completi sulla struttura del file di configurazione di LILO, consultate la manpage di LILO:
 
'''$ man lilo'''
 
Il modo pi facile per aggiungere una nuova voce di kernel nel file ''/etc/lilo.conf'' � copiare una voce esistente. Per esempio, considerate il seguente file di configurazione di LILO di un sistema Gentoo:
 
<pre>
  boot=/dev/hda
  prompt
  timeout=50
  default=2.6.12
 
  image=/boot/bzImage-2.6.15
    label=2.6.15
    read-only
    root=/dev/hda2
 
  image=/boot/bzImage-2.6.12
    label=2.6.12
    read-only
    root=/dev/hda2
</pre>
 
La linea che comincia con la parola image= definisce una nuova voce kernel, quindi questo file contiene due voci. Copiate semplicemente un blocco di linee che cominciano con image=, come:
 
<pre>
  image=/boot/bzImage-2.6.15
    label=2.6.15
    read-only
    root=/dev/hda2
</pre>
 
Aggiungete dopo il blocco alla fine del file, e modificate il numero di versione per contenere quella del nuovo kernel appena installato. La label non ha alcuna importanza, purch� unica, ma � visualizzata nel menu di boot, per cui dovreste dargli qualcosa di sensato. Nel nostro esempio, abbiamo installato il kernel 2.6.17.11, per cui la copia finale del file sar�:
 
<pre>
  boot=/dev/hda
  prompt
  timeout=50
  default=2.6.12
 
  image=/boot/bzImage-2.6.15
    label=2.6.15
    read-only
    root=/dev/hda2
 
  image=/boot/bzImage-2.6.12
    label=2.6.12
    read-only
    root=/dev/hda2
 
  image=/boot/bzImage-2.6.17
    label=2.6.17
    read-only
    root=/dev/hda2
</pre>
 
Dopo aver salvato il file, lanciate il programma ''/sbin/lilo'' per salvare i cambiamenti del file di configurazione nella sezione di boot del disco:
 
<pre> # /sbin/lilo </pre>
 
Ora il sistema pu� essere riavviato in sicurezza. La scelta del nuovo kernel si pu� vedere tra le scelte disponibili a boot time. Usate la freccia verso il basso per evidenziare la versione del nuovo kernel, premete Enter per lanciare il boot della nuova immagine.




[[Categoria:Kernel]]
[[Categoria:Kernel]]