LKN: Installare ed Avviare con un Kernel: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 1: Riga 1:
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.
Questo capitolo guider il lettore attraverso questo processo di selezione e scelta dei driver corretti.


==Usare un Kernel di una Distribuzione==
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.
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.
===Dove si Trova la Configurazione del Kernel?===
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/.
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:
<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>$ cp /proc/config.gz -/linux/
$ 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 Cap. 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.
Se il file ''/proc/config.gz'' presente, allora copiatelo nella directory del sorgente kernel ed estraetelo:
<pre>$ cp /proc/config.gz -/linux/
$ 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 Cap. 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===
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.
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.
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.
====Esempio: Come Determinare il Driver di Rete====
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.
Primo: partendo dalle connessioni di rete si risale ai device PCI
<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
Per determinare approfonditamente di quali dispositivi ci si deve occupare, si utilizza il comando ''ifconfig'':
<pre>$ /sbin/ifconfig -a
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;
<pre>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</pre>
Questo risultato dimostra che il dispositivo Ethernet si vede assegnato un indirizzo IP valido (<tt>inet</tt>).
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:
<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:
: 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.
: 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.
: 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:
<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>$ basename ../../../../module/e1000
e1000</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.
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.

Versione delle 10:13, 8 feb 2007