LKN: Personalizzare un Kernel: differenze tra le versioni

(→‎Determinare quali Moduli Siano Necessari: correzioni e immagini fino a "Come determinare il driver di rete")
Riga 1: Riga 1:
Questa pagina ha lo scopo di raccogliere una lista dei [[repository]] non ufficiali pi� frequentemente usati dagli utenti Debian.
''Torna all'indice: [[Linux Kernel in a Nutshell]]''


Un elenco pi� completo presente sul sito: http://www.apt-get.org.
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==


__TOC__
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.


= Marillat Repository =
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.
* '''Home page''': http://www.debian-multimedia.org/
* '''Release Supportate''': Debian stable, testing, unstable, experimental
* '''Architetture''': i386, ppc, amd64, sparc
* '''Pacchetti importanti''': MythTv, w32codecs, Hugin, mplayer, transcode, dvdrip


===Dove si Trova la Configurazione del Kernel?===


Repository principali:
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/.
<pre>
## Binari per Etch (stable) Architetture: i386, sparc
deb http://www.debian-multimedia.org etch main


## Binari per Lenny (testing) Architetture: amd64, i386, sparc
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:
deb http://www.debian-multimedia.org lenny main
<pre>$ ls /proc/config.gz
/proc/config.gz</pre>


## Binari per Sid (unstable) Architetture: i386, sparc
Se il file ''/proc/config.gz'' � presente, allora copiatelo nella directory del sorgente kernel ed estraetelo:
deb http://www.debian-multimedia.org sid main


## Binari per experimental. Architetture: amd64, i386, sparc
<pre>$ cp /proc/config.gz -/linux/
## Per adesso contiene solo la nuova generazione GTK2 di dvdrip
$ cd -/linux
deb http://www.debian-multimedia.org experimental main
$ gzip -dv config.gz
</pre>
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]].


: ''Per installare la chiave GPG per l'autenticazione dei pacchetti scaricare ed installare manualmente il pacchetto:
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.
:*<tt>'''[http://www.debian-multimedia.org/pool/main/d/debian-multimedia-keyring/debian-multimedia-keyring_2007.02.14_all.deb debian-multimedia-keyring_2007.02.14_all.deb]'''</tt>.


<!--
===Determinare quali Moduli Siano Necessari===
: ''La '''chiave GPG''' dei precedenti repository si pu� importare nel seguente modo (vedi [http://www.debian-multimedia.org/faq.html]):''
Il file di configurazione fornito dalla vostra distribuzione richiede un lungo tempo di compilazione,
# gpg --keyserver hkp://wwwkeys.eu.pgp.net --recv-keys 1F41B907
questo perch� tutti i possibili driver vengono abilitati. Si dovrebbe cercare di abilitare solo i driver per l'hardware presente nel sistema, cos� da ridurre i tempi di compilazione del kernel. Inoltre, compilando staticamente (invece che come moduli) alcuni o tutti i driver necessari, si riduce la memoria utilizzata ed in alcune architetture si velocizza il funzionamento del sistema. 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.
# gpg --armor --export 1F41B907 | apt-key add -
-->


Pacchetti PPC per Sid, di ''Guido Guenther'' (vedi [http://honk.sigxcpu.org/linux-ppc/debian/mplayer/ unstable-ppc]):
Le informazioni che mettono in relazione i dispositivi ai driver presenti nel kernel sono conservate in varie parti del sistema. Uno dei posti pi� importanti dove sono salvate queste informazioni � il
filesystem virtuale ''sysfs''. All'avvio di Linux, ''sysfs'', dovrebbe essere montato dagli script di inizializzazione della vostra distribuzione nella directory ''/sys''. ''sysfs'' consente di dare un'occhiata a come le varie parti del kernel sono legate l'una a l'altra, questo lo si deduce grazie ai vari link simbolici (''symlink'' NdT) che puntano all'interno dell'intero filesystem.


deb http://honk.sigxcpu.org/linux-ppc/debian/ mplayer/
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.
#deb-src http://honk.sigxcpu.org/linux-ppc/debian/ mplayer/


: ''Trovate [http://honk.sigxcpu.org/misc/sigxcpu-archive-key.gpg qui] la '''chiave gpg''' per il precedente repository.''
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====


Pacchetti AMD-64 per Sid:
Uno degli elementi pi� comuni ed importanti in un sistema � la scheda/interfaccia di rete. � essenziale capire quale driver la controlla ed attivarlo nella configurazione in maniera da consentire un corretto funzionamento delle connessioni di rete.


## Entrambe le linee sono obbligatorie
Primo: partendo dalle connessioni di rete si risale ai device PCI
deb http://spello.sscnet.ucla.edu/marillat/ sid main
<pre>$ ls /sys/class/net/
  deb http://www.debian-multimedia.org sid main
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


Pacchetti AMD-64 per Sarge (vedi [http://spello.sscnet.ucla.edu/marillat/dists/sarge/main/binary-amd64/ stable-amd64]):
Per determinare approfonditamente di quali dispositivi ci si deve occupare, si utilizza il comando ''ifconfig'':


  ## Entrambe le linee sono obbligatorie
<pre>$ /sbin/ifconfig -a
  deb http://spello.sscnet.ucla.edu/marillat/ sarge main
eth0 Link  encap:Ethernet HWaddr 00:12:3F:65:7D:C2
  deb http://www.debian-multimedia.org sarge main
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;


Sorgenti per i repository marillat:
<pre>eth0 Link  encap:Ethernet  HWaddr 00:12:3F:65:7D:C2
  deb-src http://www.debian-multimedia.org sid main
inet addr:192.168.0.13  Bcast:192.168.0.255  Mask:255.255.255.0</pre>


=MaXeR Repository=
Questo risultato dimostra che il dispositivo Ethernet si vede assegnato un indirizzo IP valido (<tt>inet</tt>).
* '''Home page''': http://repos.knio.it
* '''Release Supportate:''' Debian Stable, Testing, Unstable; Ubuntu Breezy
* '''Architetture''': i386
* '''Pacchetti importanti:''': k9copy, vamps, qvamps, keep, krecipes, kreetingkard, kleansweep


sources.list:
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>
deb http://repos.knio.it/ stable main contrib non-free
deb-src http://repos.knio.it/ stable main contrib non-free


deb http://repos.knio.it/ testing main contrib non-free
<pre>$ basename `readlink /sys/class/net/eth0/device/driver/module`
deb-src http://repos.knio.it/ testing main contrib non-free
e1000</pre>


deb http://repos.knio.it/ unstable main contrib non-free
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:
deb-src http://repos.knio.it/ unstable main contrib non-free


deb http://repos.knio.it/ breezy main contrib non-free
: 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.
deb-src http://repos.knio.it/ breezy main contrib non-free
</pre>


= Os-works =
: 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.


TODO
: 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 | xargs 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.


[[Categoria:Apt]][[Categoria:Repository]]
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>.
 
Adesso si dispone dell'informazione necessaria per poter configurare il kernel. Si esegue lo strumento menu di configurazione:
: <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.
 
 
''Figura 7-1. Ricerca in menuconfig''
 
Il sistema di configurazione del kernel vi dir� ora esattamente dove selezionare l'opzione per abilitare questo modulo. Vedi figura 7-2.
 
 
''Figura 7-2. Risultato della ricerca in menuconfig''
 
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:
 
: <tt>Device Drivers</tt>
: : <tt>Network device support</tt>
: : : <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.
 
====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''.
<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`
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.
 
 
''Figura 7-3. Ricerca per USB_SERIAL_PL2303''
 
Nel nostro caso il risultato � mostrato nella figura 7-4.
 
 
''Figura 7-4. Risultato della ricerca di USB_SERIAL_PL2303''
 
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====
 
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.
 
 
 
====Lasciate che il Kernel ci Dica di Cui Abbiamo Bisogno====
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).
 
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
questo:
<pre>$ find_all_modules.sh
8139cp.ko
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:
<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==
 
 
===Dispositivi PCI===
 
 
===Dispositivi USB===
 
===Root Filesystem===
 
 
====Controller di Disco====
 
===Un Aiuto dallo Script===
 
 
----
This is an indipendent translation of the book [http://www.kroah.com/lkn/ Linux Kernel in a Nutshell] by [http://www.kroah.com/log/ Greg Kroah-Hartman]. This translation (like the original work) is available under the terms of [http://creativecommons.org/licenses/by-sa/2.5/ Creative Commons Attribution-ShareAlike 2.5].
----
 
[[Categoria:Kernel]]
1 760

contributi