LKN: Configurare e Compilare: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
m (link)
 
(27 versioni intermedie di 9 utenti non mostrate)
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.
{{Template:LKN}}
Questo capitolo guider� il lettore attraverso questo processo di selezione e scelta dei driver corretti.
__TOC__


==Usare un Kernel di una Distribuzione==
Ora che avete scaricato i sorgenti della versione del kernel che avete scelto e che li avete installati in una cartella locale, è giunto il momento di compilare il codice. Il primo passo è di configurare il kernel con le opzioni appropriate; in seguito il kernel potrà essere compilato. Entrambe le operazioni sono portate a termine attraverso lo strumento standard ''make''.


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.
== '''Creare una configurazione''' ==
La configurazione del kernel risiede in un file chiamato ''.config'' nella cartella principale dell'albero dei sorgenti del kernel. Se avete appena estratto il codice sorgente del kernel, non vi sarà alcun file ''.config'', quindi dovrà essere creato. Il file può essere creato da zero, creato partendo dalla "configurazione predefinita", preso da una versione funzionante del kernel, o preso da quello rilasciato da una distribuzione. Copriremo i primi due metodi adesso, gli ultimi due metodi nel [[LKN:_Personalizzare_un_Kernel|Capitolo 7]].


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.
==='''Configurare dall'inizio'''===
Il modo più spartano per configurare un kernel è usare il metodo ''make config'':
<pre>
$ cd linux-2.6.17.10
$ make config
make config
scripts/kconfig/conf arch/i386/Kconfig
*
* Linux Kernel Configuration
*
*
* Code maturity level option
*
Prompt for development and/or incomplete code/drivers (EXPERIMENTAL) [Y/n/?]
Y


===Dove si Trova la Configurazione del Kernel?===
*
* General setup
*
Local version - append to kernel release (LOCALVERSION) []
Automatically append version information to the version string
(LOCALVERSION_AUTO) [Y/n/?] Y
...
</pre>
Il programma di configurazione del kernel procederà attraverso ogni opzione di configurazione e chiederà se la si vuole abilitare o meno. Tipicamente, le possibilità per ogni opzione sono presentate nella forma <code>[Y/m/n/?]</code>. La lettera maiuscola è la scelta predefinita, e può essere selezionata semplicemente premendo il tasto Invio. Le quattro scelte sono:
* <code>Y</code>  Compilare direttamente nel kernel.
* <code>n</code>  Lasciare completamente al di fuori del kernel.
* <code>m</code>  Compilare come modulo, da caricare se necessario.
* <code>?</code>  Stampa un breve messaggio descrittivo e ripropone il quesito.
Il kernel contiene quasi duemila opzioni di configurazioni differenti, quindi rispondere ad una domanda su ognuna di esse richiede un notevole dispendio di tempo. Fortunatamente, vi è un modo più facile di configurare un kernel: basare la configurazione su di un'altra precostituita.


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/.
==='''Opzioni della configurazione predefinita'''===
Ogni versione del kernel ha una configurazione "predefinita". Questa configurazione è in parte basata sulle scelte che il responsabile di quella architettura crede siano le opzioni migliori da essere usate. In alcuni casi, è la configurazione usata dal responsabile stesso sulle proprie macchine. Questo è vero per l'architettura i386, dove la configurazione predefinita corrisponde strettamente a quella che Linus Torvalds usa per la sua macchina di sviluppo principale.


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:
Per creare questa configurazione predefinita, eseguite:
<pre>$ ls /proc/config.gz
<pre>$ cd linux-2.6.17.10
/proc/config.gz</pre>
$ make defconfig</pre>
Un'enorme quantità di opzioni di configurazione scorrerà velocemente sullo schermo, e un file ''.config'' sarà creato e piazzato nella cartella del kernel. Il kernel è ora correttamente configurato, ma dovrebbe essere adattato alla vostra macchina per assicurarsi che funzioni correttamente.


Se il file ''/proc/config.gz'' presente, allora copiatelo nella directory del sorgente kernel ed estraetelo:
==='''Modificare la configurazione'''===
Ora che abbiamo un file di configurazione di base, dovrebbe essere modificato per supportare l'hardware presente nel vostro sistema. Per ulteriori dettagli su come individuare quali opzioni siano necessarie per ottenere ciò, potete leggere il [[LKN:_Personalizzare_un_Kernel|Capitolo 7]]. Qui mostreremo come selezionare le opzioni che potreste voler cambiare.


<pre>$ cp /proc/config.gz -/linux/
Ci sono tre differenti strumenti interattivi per la configurazione del kernel: uno basato su terminale chiamato ''menuconfig'', uno grafico basato sulle GTK+ chiamato ''gconfig'', e un altro grafico basato sulle QT chiamato ''xconfig''.
$ 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.
==='''Configurazione tramite terminale'''===
Il metodo chiamato '''menuconfig''' per configurare un kernel è un programma per terminale che dà modo di muoversi nella configurazione del kernel usando i tasti freccia della tastiera. Per avviare questa modalità di configurazione, digitate:
<pre>$ make menuconfig</pre>
Vi apparirà una schermata molto simile a quella di figura 4-1.


===Determinare quali Moduli Siano Necessari===
[[Immagine:Menuconfig_1.png|center|500px|thumb|''Figura 4-1. Schermata iniziale di menuconfig'']]


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 istruzioni per navigare attraverso il programma, e i significati dei diversi caratteri, sono mostrati in cima allo schermo. Il resto dello schermo contiene le diverse opzioni di configurazione.


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.
La configurazione del kernel è divisa in sezioni. Ogni sezione contiene opzioni che corrispondo ad argomenti specifici. Al loro interno possono esserci sottosezioni per vari argomenti specifici. Per esempio tutti i driver per le periferiche possono essere trovati sotto l'opzione del menu principale <code>Device Drivers ---></code>.


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.
[[Immagine:Menuconfig_2.png|center|500px|thumb|''Figura 4-2. Selezione dell'opzione Device Drivers'']]


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.
Per aprire questo menu, premete la freccia in basso nove volte, finché la riga <code>Device Drivers ---></code> non è sottolineata, come mostrato in figura 4-2.


====Esempio: Come Determinare il Driver di Rete====
Premete poi il tasto Invio. Vi porterà nel sotto-menu <code>Device Drivers</code> e lo mostrerà come mostrato nella figura 4-3.


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.
[[Immagine:Menuconfig_3.png|center|500px|thumb|''Figura 4-3. Sottomenu Device Drivers'']]


Primo: partendo dalle connessioni di rete si risale ai device PCI
Potete continuare a muovervi nella gerarchia dei menu allo stesso modo. Per visualizzare il sotto-menu <code>Generic Driver Options</code> premete Invio di nuovo, e vedrete se tre opzioni mostrate in figura 4-4.
<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
[[Immagine:Menuconfig_4.png|center|500px|thumb|''Figura 4-4. Sottomenu Generic Driver Options'']]


Per determinare approfonditamente di quali dispositivi ci si deve occupare, si utilizza il comando ''ifconfig'':
Le prime due opzioni hanno un simbolo <code>[*]</code> vicino a esse. Questo significa che quest'opzione è selezionata (perché il simbolo <code>*</code> sta al centro dei due caratteri <code>[]</code>), e che questa è un'opzione del tipo sì-o-no. La terza opzione ha un segno <code>< ></code>, che mostra che questa opzione può essere inserita nel kernel (<code>Y</code>), compilata come modulo (<code>M</code>), o esclusa del tutto (<code>N</code>).


<pre>$ /sbin/ifconfig -a
Se l'opzione è selezionata con <code>Y</code>, le parentesi ad angolo conterranno un <code>*</code>. Se è selezionata come modulo con una <code>M</code>, conterranno una lettera <code>M</code>. Se è disabilitata con <code>N</code>, mostreranno solo uno spazio bianco.
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;
Così, se desiderate cambiare queste tre opzioni per selezionare solo driver che non necessitano di firmware esterno in tempo di compilazione, disabilitate l'opzione per impedire che il firmware sia compilato, e compilate il caricatore del firmware in spazio utente come modulo, digitando <code>Y</code> per la prima opzione, <code>N</code> per la seconda e <code>M</code> per la terza, rendendo la schermata come quella in figura 4-5.


<pre>eth0 Link  encap:Ethernet  HWaddr 00:12:3F:65:7D:C2
[[Immagine:Menuconfig_5.png|center|500px|thumb|''Figura 4-5. Sottomenu Generic Driver Options cambiato'']]
inet  addr:192.168.0.13  Bcast:192.168.0.255  Mask:255.255.255.0</pre>


Quando avete completato le vostre modifiche in questa schermata, premete il tasto Esc o la freccia destra seguita dal tasto Invio per lasciare questo sottomenu. Tutte le opzioni del kernel possono essere esplorate in questa maniera.


Quando avete finito di fare tutte le modifiche che desideriate apportare alla configurazione del kernel, uscite dal programma premendo il tasto Esc quando siete nel menu principale.


Questo risultato dimostra che il dispositivo Ethernet si vede assegnato un indirizzo IP valido (<tt>inet</tt>).
[[Immagine:Menuconfig_6.png|center|500px|thumb|''Figura 4-6. Salvare le opzioni del kernel'']]


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:
Vi sarà mostrata la schermata in figura 4-6, che vi chiede se desiderate salvare la vostra modificata configurazione.


<pre>$ basename `readlink /sys/class/net/eth0/device/driver/module`
Premete Invio per salvare la configurazione, o, se volete eliminare ogni modifica fatta, digitate la freccia destra per selezionare la voce <code>< No ></code> e premete Invio.
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.  
==='''Metodi grafici di configurazione'''===
I metodi di configurazione del kernel ''gconfig'' e ''xconfig'' usano un programma grafico per permettervi di modificare la configurazione. I due metodi sono pressoché identici, l'unica differenza risiede nei diversi strumenti grafici attraverso i quali sono scritti. ''gconfig'' è scritto usando il toolkit GTK+ e ha uno schermo diviso in due regioni, come mostrato in figura 4-7.


: 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.
[[Immagine:Gconfig_1.png|center|500px|thumb|''Figura 4-7. Schermata di make gconfig'']]


: 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:
Il metodo ''xconfig'' è scritto usando il toolkit QT e ha uno schermo diviso in tre regioni, come in figura 4-8.
<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:
[[Immagine:Xconfig_1.png|center|500px|thumb|''Figura 4-8. Schermata di make xconfig'']]
<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.
Usate il mouse per navigare nei sottomenu e selezionare le opzioni. Per esempio, nella figura 4-8 potreste usarlo per selezionare il sottomenu <code>Generic Driver Options</code> del menu <code>Device Drivers</code>. Questo cambierà la schermata di ''xconfig'' e la farà diventare quella dell'immagine 4-9.  
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.
[[Immagine:Xconfig_2.png|center|500px|thumb|''Figura 4-9. Generic Driver Options in make xconfig'']]


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>.
La corrispondente immagine di ''gconfig'' è in figura 4-10.


Adesso si dispone dell'informazione necessaria per poter configurare il kernel. Si esegue lo strumento menu di configurazione:
[[Immagine:Gconfig_2.png|center|500px|thumb|''Figura 4-10. Generic Driver Options in make gconfig'']]
: <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.


Modificare questo sottomenu per disabilitare la seconda opzione e rendere la terza opzione compilata come modulo genera le schermate apparire come nelle figure 4-11 e 4-12.


Figura 7-1. Ricerca in menuconfig
[[Immagine:Xconfig_3.png|center|500px|thumb|''Figura 4-11. Generic Driver Options in make xconfig, modificato'']]
[[Immagine:gconfig_3.png|center|500px|thumb|''Figura 4-12. Generic Driver Options in make gconfig, modificato'']]


Il sistema di configurazione del kernel vi dir� ora esattamente dove selezionare l'opzione per abilitare questo modulo. Vedi figura 7-2.
Notate che nel metodo ''gconfig'' una Y significa che l'opzione sarà compilata nel kernel, una M l'opzione sarà compilata come modulo. Nel metodo ''xconfig'' un riquadro con il segno di visto significa che l'opzione sarà compilata nel kernel  ,un'opzione compilata come modulo sarà mostrata con un punto nel riquadro.


Entrambi questi metodi vi chiedono di salvare la configurazione quando uscite dal programma, e offrono la possibilità di scrivere quella configurazione in un altro file. Potete così creare molteplici, distinte configurazioni.


Figura 7-2. Risultato della ricerca in menuconfig
=='''Compilazione del kernel'''==
Ora che avete creato la configurazione che intendete usare, dovete compilare il kernel. Questo è semplice come digitare un comando di un parola:
<pre>$ make
CHK include/linux/version.h
UPD include/linux/version.h
SYMLINK include/asm -> include/asm-i386
SPLIT include/linux/autoconf.h -> include/config/*
CC arch/i386/kernel/asm-offsets.s
GEN include/asm-i386/asm-offsets.h
CC scripts/mod/empty.o
HOSTCC scripts/mod/mk_elfconfig
MKELF scripts/mod/elfconfig.h
HOSTCC scripts/mod/file2alias.o
HOSTCC scripts/mod/modpost.o
HOSTCC scripts/mod/sumversion.o
HOSTLD scripts/mod/modpost.o
HOSTCC scripts/kallsyms
HOSTCC scripts/conmakehash
HOSTCC scripts/bin2c
CC init/main.o
CHK include/linux/compile.h
UPD include/linux/compile.h
CC init/version.o
CC init/do_mounts.o
...</pre>


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:
Eseguire ''make'' fa sì che il sistema di compilazione del kernel usi il file di configurazione che avete selezionato per compilare un kernel e tutti i moduli necessari per supportare tale configurazione.<sup>*</sup> Mentre il kernel è in compilazione, ''make'' mostra cosa sta correntemente succedendo ai singoli file, insieme a tutti gli avvertimenti ("warnings", N.d.T.) e gli errori di compilazioni.


: <tt>Device Drivers</tt>
Se la compilazione del kernel termina senza errori, avete creato con successo l'immagine di un kernel. Comunque deve essere propriamente installata prima che proviate ad avviarla. Leggete il [[LKN:_Installare_ed_Avviare_con_un_Kernel|Capitolo 5]] per sapere come fare.
: : <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.
È molto raro avere errori di compilazione quando state compilando una versione del kernel rilasciata. Se vi capita, riportateli agli sviluppatori del kernel Linux cosicché possano essere corretti.


<small>Nota ('''<sup>*</sup>'''): versioni del kernel più vecchie, precedenti al rilascio 2.6 richiedevano l'ulteriore passo ''make modules'' per compilare tutti i moduli necessari. Questo non è più necessario.</small>


====Esempio: Un Dispositivo USB====
=='''Opzioni di compilazione avanzate'''==
Il sistema di compilazione del kernel consente di fare molte altre cose, oltre a compilare l'intero kernel e i relativi moduli. Il Capitolo 10 contiene l'intero elenco delle opzioni che il sistema di compilazione fornisce. In questa sezione discuteremo alcune di queste opzioni avanzate. Per avere una descrizione completa di come usare altre opzioni avanzate, fate riferimento alla documentazione dentro il kernel stesso, che può essere trovata nella cartella ''Documentation/kbuild'' nei sorgenti.


==='''Velocizzare la compilazione in macchine multiprocessore'''===
Il sistema di compilazione del kernel lavora molto bene come operazione che può essere divisa in pezzi più piccoli e assegnati a diversi processori. Facendo questo, potete usare la piena potenza di una macchina multiprocessore e ridurre considerevolmente il tempo di compilazione del kernel.


Per compilare un kernel in modo parallelo, usate l'opzione ''-j'' del comando ''make''. È meglio dare un numero all'opzione ''-j'' che corrisponda al doppio del numero di processori nel sistema. Quindi, per macchine con due processori, usate:
<pre>$ make -j4</pre>
e per macchine con quattro processori, usate:
<pre>$ make -j8</pre>
Se non passate un numero all'opzione ''-j'':
<pre>$ make -j</pre>
il sistema di compilazione creerà un nuovo thread per ogni sottocartella nell'albero delle cartelle del kernel, che può facilmente rendere la vostra macchina non in grado di rispondere ai comandi, e impiegare molto più tempo per completare la compilazione. Per questo si raccomanda di passare sempre un valore numerico all'opzione ''-j''.


====Lasciate che il Kernel ci Dica di Cui Abbiamo Bisogno====
==='''Compilare solo una parte del kernel'''===
Quando ci si dedica allo sviluppo del kernel, a volte si desidera compilare solo una specifica sottocartella, o un singolo file dell'intero albero del kernel. Il sistema di compilazione lo consente agevolmente. Per compilare selettivamente una sottocartella, specificatela nel comando di compilazione. Per esempio, per compilare i file nella cartella '''drivers/usb/serial''', inserite:
<pre>$ make drivers/usb/serial</pre>
Usando questa sintassi, comunque, non si compilerà l'immagine finale del modulo in quella cartella. Per fare questo, potete usare l'opzione <code>M=</code>argomento:
<pre>$ make M=drivers/usb/serial</pre>
che compilerà tutti i file necessari in quella cartella e collegherà le immagini finali dei moduli.


Quando si compila una singola cartella in uno dei modi mostrati, l'immagine finale del kernel non viene ricollegata. Comunque ogni cambiamento che era stato effettuato alle sottocartelle non influenzerà l'immagine finale del kernel, che probabilmente non è quello che desiderate. Eseguite alla fine un:
<pre>$ make</pre>
perché il sistema di compilazione controlli tutti i file oggetto cambiati e colleghi in modo proprio l'immagine finale del kernel.


==Determinare il Modulo Corretto per Scratch==
Per compilare un solo specifico file nell'albero del kernel, semplicemente passatelo come parametro a ''make''. Per esempio, se desiderate compilare il modulo ''drivers/usb/serial/visor.ko'', inserite:
<pre>$ make drivers/usb/serial/visor.ko</pre>
Il sistema di compilazione compilerà tutti i file necessari per il modulo visor.ko, e farà il collegamento finale per creare il modulo.


===Dispositivi PCI===
==='''Sorgente in un posto, destinazione in un altro'''===
Alle volte è più semplice avere i sorgenti del kernel in un posto accessibile in sola lettura (come un CD-ROM, o in un sistema di controllo del codice sorgente), e collocare il risultato della compilazione altrove, così da non alterare l'albero originale del sorgente. Il sistema di compilazione lo realizza facilmente, richiedendo il solo argomento <code>O=</code> per specificare dove collocare l'output della compilazione. Per esempio se i sorgenti del kernel sono in un CD-ROM montato in ''/mnt/cdrom/'' e desiderate mettere i file compilati nella vostra cartella locale, inserite:<pre>$ cd /mnt/cdrom/linux-2.6.17.11
$ make O=~/linux/linux-2.6.17.11</pre>
Tutti i file compilati saranno creati nella cartella ''~/linux/linux-2.6.17.11''. Notate che questa opzione <code>O=</code> dovrebbe essere passata anche alle opzioni di configurazione della compilazione cosicché la configurazione sia correttamente collocata nella cartella di destinazione e non in quella contenente il codice sorgente.


==='''Architetture differenti'''===
Una caratteristica molto utile è la costruzione di un kernel ottenuto tramite cross-compilazione, per permettere a una macchina più potente di compilare un kernel per una sistema embedded più piccolo, o anche solo per controllare una compilazione per un'architettura diversa per assicurare che a un cambiamento nel codice sorgente non danneggi qualcosa di inaspettato. Il sistema di compilazione del kernel consente di specificare un'architettura diversa da quella della macchina corrente con il parametro <code>ARCH=</code>argomento. Il sistema di compilazione consente, inoltre, di specificare il compilatore che si desidera usare con il parametro <code>CC=</code>argomento o un toolchain (un insieme di strumenti, N.d.T) per la cross-compilazione tramite l'argomento <code>CROSS_COMPILE</code>.


===Dispositivi USB===
Per esempio, per avere la configurazione predefinita dell'architettura x86_64, si può inserire:


===Root Filesystem===
<pre>$ make ARCH=x86_64 defconfig</pre>


Per compilare l'intero kernel con uno strumento per concatenare la compilazione situato in ''/usr/local/bin'', si può inserire:
<pre>$ make ARCH=arm CROSS_COMPILE=/usr/local/bin/arm-linux-</pre>


====Controller di Disco====
È utile anche per i kernel non ottenuti con la cross-compilazione cambiare ciò che il sistema di costruzione del kernel usa per il compilatore. Esempi di questo sono l'utilizzo dei programmi ''distcc'' o ''ccache'', i quali riducono notevolmente il tempo di compilazione di un kernel. Per usare il programma ''ccache'' come parte del sistema di costruzione del kernel, digitate:


===Un Aiuto dallo Script===
<pre>$ make CC="ccache gcc"</pre>
 
Per usare contemporaneamente ''distcc'' e ''ccache'', inserite:
 
<pre>$ make CC="ccache distcc"</pre>
 
 
----
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].
----
 
 
[http://files.kroah.com/lkn/lkn_pdf/ch04.pdf ''Capitolo originale'']
 
 
[[Categoria:Documentazione tecnica]]
[[Categoria:Linux Kernel in a Nutshell]]

Versione attuale delle 12:38, 14 mag 2016

Linux Kernel in a Nutshell

Sommario

Parte I
Compilare il kernel
  1. Introduzione
  2. Requisiti
  3. Procurarsi i sorgenti
  4. Configurazione e compilazione
  5. Installazione e avvio
  6. Aggiornare il kernel
Parte II
Personalizzazioni principali
  1. Personalizzare un kernel
  2. Ricette per configurare un kernel
Parte III
Guide di riferimento per il kernel
  1. Guida di riferimento dei parametri di boot del kernel - parte1
  2. Guida di riferimento dei parametri di boot del kernel - parte2
  3. Guida di riferimento dei parametri di compilazione del kernel
  4. Guida di riferimento delle opzioni di configurazione del kernel - parte1
  5. Guida di riferimento delle opzioni di configurazione del kernel - parte2
Parte IV
Informazioni aggiuntive
  1. Programmi utili
  2. Bibliografia

Ora che avete scaricato i sorgenti della versione del kernel che avete scelto e che li avete installati in una cartella locale, è giunto il momento di compilare il codice. Il primo passo è di configurare il kernel con le opzioni appropriate; in seguito il kernel potrà essere compilato. Entrambe le operazioni sono portate a termine attraverso lo strumento standard make.

Creare una configurazione

La configurazione del kernel risiede in un file chiamato .config nella cartella principale dell'albero dei sorgenti del kernel. Se avete appena estratto il codice sorgente del kernel, non vi sarà alcun file .config, quindi dovrà essere creato. Il file può essere creato da zero, creato partendo dalla "configurazione predefinita", preso da una versione funzionante del kernel, o preso da quello rilasciato da una distribuzione. Copriremo i primi due metodi adesso, gli ultimi due metodi nel Capitolo 7.

Configurare dall'inizio

Il modo più spartano per configurare un kernel è usare il metodo make config:

$ cd linux-2.6.17.10
$ make config
make config
scripts/kconfig/conf arch/i386/Kconfig
*
* Linux Kernel Configuration
*
*
* Code maturity level option
*
Prompt for development and/or incomplete code/drivers (EXPERIMENTAL) [Y/n/?]
Y

*
* General setup
*
Local version - append to kernel release (LOCALVERSION) []
Automatically append version information to the version string
(LOCALVERSION_AUTO) [Y/n/?] Y
...

Il programma di configurazione del kernel procederà attraverso ogni opzione di configurazione e chiederà se la si vuole abilitare o meno. Tipicamente, le possibilità per ogni opzione sono presentate nella forma [Y/m/n/?]. La lettera maiuscola è la scelta predefinita, e può essere selezionata semplicemente premendo il tasto Invio. Le quattro scelte sono:

  • Y Compilare direttamente nel kernel.
  • n Lasciare completamente al di fuori del kernel.
  • m Compilare come modulo, da caricare se necessario.
  • ? Stampa un breve messaggio descrittivo e ripropone il quesito.

Il kernel contiene quasi duemila opzioni di configurazioni differenti, quindi rispondere ad una domanda su ognuna di esse richiede un notevole dispendio di tempo. Fortunatamente, vi è un modo più facile di configurare un kernel: basare la configurazione su di un'altra precostituita.

Opzioni della configurazione predefinita

Ogni versione del kernel ha una configurazione "predefinita". Questa configurazione è in parte basata sulle scelte che il responsabile di quella architettura crede siano le opzioni migliori da essere usate. In alcuni casi, è la configurazione usata dal responsabile stesso sulle proprie macchine. Questo è vero per l'architettura i386, dove la configurazione predefinita corrisponde strettamente a quella che Linus Torvalds usa per la sua macchina di sviluppo principale.

Per creare questa configurazione predefinita, eseguite:

$ cd linux-2.6.17.10
$ make defconfig

Un'enorme quantità di opzioni di configurazione scorrerà velocemente sullo schermo, e un file .config sarà creato e piazzato nella cartella del kernel. Il kernel è ora correttamente configurato, ma dovrebbe essere adattato alla vostra macchina per assicurarsi che funzioni correttamente.

Modificare la configurazione

Ora che abbiamo un file di configurazione di base, dovrebbe essere modificato per supportare l'hardware presente nel vostro sistema. Per ulteriori dettagli su come individuare quali opzioni siano necessarie per ottenere ciò, potete leggere il Capitolo 7. Qui mostreremo come selezionare le opzioni che potreste voler cambiare.

Ci sono tre differenti strumenti interattivi per la configurazione del kernel: uno basato su terminale chiamato menuconfig, uno grafico basato sulle GTK+ chiamato gconfig, e un altro grafico basato sulle QT chiamato xconfig.

Configurazione tramite terminale

Il metodo chiamato menuconfig per configurare un kernel è un programma per terminale che dà modo di muoversi nella configurazione del kernel usando i tasti freccia della tastiera. Per avviare questa modalità di configurazione, digitate:

$ make menuconfig

Vi apparirà una schermata molto simile a quella di figura 4-1.

Figura 4-1. Schermata iniziale di menuconfig

Le istruzioni per navigare attraverso il programma, e i significati dei diversi caratteri, sono mostrati in cima allo schermo. Il resto dello schermo contiene le diverse opzioni di configurazione.

La configurazione del kernel è divisa in sezioni. Ogni sezione contiene opzioni che corrispondo ad argomenti specifici. Al loro interno possono esserci sottosezioni per vari argomenti specifici. Per esempio tutti i driver per le periferiche possono essere trovati sotto l'opzione del menu principale Device Drivers --->.

Figura 4-2. Selezione dell'opzione Device Drivers

Per aprire questo menu, premete la freccia in basso nove volte, finché la riga Device Drivers ---> non è sottolineata, come mostrato in figura 4-2.

Premete poi il tasto Invio. Vi porterà nel sotto-menu Device Drivers e lo mostrerà come mostrato nella figura 4-3.

Figura 4-3. Sottomenu Device Drivers

Potete continuare a muovervi nella gerarchia dei menu allo stesso modo. Per visualizzare il sotto-menu Generic Driver Options premete Invio di nuovo, e vedrete se tre opzioni mostrate in figura 4-4.

Figura 4-4. Sottomenu Generic Driver Options

Le prime due opzioni hanno un simbolo [*] vicino a esse. Questo significa che quest'opzione è selezionata (perché il simbolo * sta al centro dei due caratteri []), e che questa è un'opzione del tipo sì-o-no. La terza opzione ha un segno < >, che mostra che questa opzione può essere inserita nel kernel (Y), compilata come modulo (M), o esclusa del tutto (N).

Se l'opzione è selezionata con Y, le parentesi ad angolo conterranno un *. Se è selezionata come modulo con una M, conterranno una lettera M. Se è disabilitata con N, mostreranno solo uno spazio bianco.

Così, se desiderate cambiare queste tre opzioni per selezionare solo driver che non necessitano di firmware esterno in tempo di compilazione, disabilitate l'opzione per impedire che il firmware sia compilato, e compilate il caricatore del firmware in spazio utente come modulo, digitando Y per la prima opzione, N per la seconda e M per la terza, rendendo la schermata come quella in figura 4-5.

Figura 4-5. Sottomenu Generic Driver Options cambiato

Quando avete completato le vostre modifiche in questa schermata, premete il tasto Esc o la freccia destra seguita dal tasto Invio per lasciare questo sottomenu. Tutte le opzioni del kernel possono essere esplorate in questa maniera.

Quando avete finito di fare tutte le modifiche che desideriate apportare alla configurazione del kernel, uscite dal programma premendo il tasto Esc quando siete nel menu principale.

Figura 4-6. Salvare le opzioni del kernel

Vi sarà mostrata la schermata in figura 4-6, che vi chiede se desiderate salvare la vostra modificata configurazione.

Premete Invio per salvare la configurazione, o, se volete eliminare ogni modifica fatta, digitate la freccia destra per selezionare la voce < No > e premete Invio.


Metodi grafici di configurazione

I metodi di configurazione del kernel gconfig e xconfig usano un programma grafico per permettervi di modificare la configurazione. I due metodi sono pressoché identici, l'unica differenza risiede nei diversi strumenti grafici attraverso i quali sono scritti. gconfig è scritto usando il toolkit GTK+ e ha uno schermo diviso in due regioni, come mostrato in figura 4-7.

Figura 4-7. Schermata di make gconfig

Il metodo xconfig è scritto usando il toolkit QT e ha uno schermo diviso in tre regioni, come in figura 4-8.

Figura 4-8. Schermata di make xconfig

Usate il mouse per navigare nei sottomenu e selezionare le opzioni. Per esempio, nella figura 4-8 potreste usarlo per selezionare il sottomenu Generic Driver Options del menu Device Drivers. Questo cambierà la schermata di xconfig e la farà diventare quella dell'immagine 4-9.

Figura 4-9. Generic Driver Options in make xconfig

La corrispondente immagine di gconfig è in figura 4-10.

Figura 4-10. Generic Driver Options in make gconfig

Modificare questo sottomenu per disabilitare la seconda opzione e rendere la terza opzione compilata come modulo genera le schermate apparire come nelle figure 4-11 e 4-12.

Figura 4-11. Generic Driver Options in make xconfig, modificato
Figura 4-12. Generic Driver Options in make gconfig, modificato

Notate che nel metodo gconfig una Y significa che l'opzione sarà compilata nel kernel, una M l'opzione sarà compilata come modulo. Nel metodo xconfig un riquadro con il segno di visto significa che l'opzione sarà compilata nel kernel ,un'opzione compilata come modulo sarà mostrata con un punto nel riquadro.

Entrambi questi metodi vi chiedono di salvare la configurazione quando uscite dal programma, e offrono la possibilità di scrivere quella configurazione in un altro file. Potete così creare molteplici, distinte configurazioni.

Compilazione del kernel

Ora che avete creato la configurazione che intendete usare, dovete compilare il kernel. Questo è semplice come digitare un comando di un parola:

$ make
CHK	include/linux/version.h
UPD	include/linux/version.h
SYMLINK	include/asm -> include/asm-i386
SPLIT	include/linux/autoconf.h -> include/config/*
CC	arch/i386/kernel/asm-offsets.s
GEN	include/asm-i386/asm-offsets.h
CC	scripts/mod/empty.o
HOSTCC	scripts/mod/mk_elfconfig
MKELF	scripts/mod/elfconfig.h
HOSTCC	scripts/mod/file2alias.o
HOSTCC	scripts/mod/modpost.o
HOSTCC	scripts/mod/sumversion.o
HOSTLD	scripts/mod/modpost.o
HOSTCC	scripts/kallsyms
HOSTCC	scripts/conmakehash
HOSTCC	scripts/bin2c
CC	init/main.o
CHK	include/linux/compile.h
UPD	include/linux/compile.h
CC	init/version.o
CC	init/do_mounts.o
...

Eseguire make fa sì che il sistema di compilazione del kernel usi il file di configurazione che avete selezionato per compilare un kernel e tutti i moduli necessari per supportare tale configurazione.* Mentre il kernel è in compilazione, make mostra cosa sta correntemente succedendo ai singoli file, insieme a tutti gli avvertimenti ("warnings", N.d.T.) e gli errori di compilazioni.

Se la compilazione del kernel termina senza errori, avete creato con successo l'immagine di un kernel. Comunque deve essere propriamente installata prima che proviate ad avviarla. Leggete il Capitolo 5 per sapere come fare.

È molto raro avere errori di compilazione quando state compilando una versione del kernel rilasciata. Se vi capita, riportateli agli sviluppatori del kernel Linux cosicché possano essere corretti.

Nota (*): versioni del kernel più vecchie, precedenti al rilascio 2.6 richiedevano l'ulteriore passo make modules per compilare tutti i moduli necessari. Questo non è più necessario.

Opzioni di compilazione avanzate

Il sistema di compilazione del kernel consente di fare molte altre cose, oltre a compilare l'intero kernel e i relativi moduli. Il Capitolo 10 contiene l'intero elenco delle opzioni che il sistema di compilazione fornisce. In questa sezione discuteremo alcune di queste opzioni avanzate. Per avere una descrizione completa di come usare altre opzioni avanzate, fate riferimento alla documentazione dentro il kernel stesso, che può essere trovata nella cartella Documentation/kbuild nei sorgenti.

Velocizzare la compilazione in macchine multiprocessore

Il sistema di compilazione del kernel lavora molto bene come operazione che può essere divisa in pezzi più piccoli e assegnati a diversi processori. Facendo questo, potete usare la piena potenza di una macchina multiprocessore e ridurre considerevolmente il tempo di compilazione del kernel.

Per compilare un kernel in modo parallelo, usate l'opzione -j del comando make. È meglio dare un numero all'opzione -j che corrisponda al doppio del numero di processori nel sistema. Quindi, per macchine con due processori, usate:

$ make -j4

e per macchine con quattro processori, usate:

$ make -j8

Se non passate un numero all'opzione -j:

$ make -j

il sistema di compilazione creerà un nuovo thread per ogni sottocartella nell'albero delle cartelle del kernel, che può facilmente rendere la vostra macchina non in grado di rispondere ai comandi, e impiegare molto più tempo per completare la compilazione. Per questo si raccomanda di passare sempre un valore numerico all'opzione -j.

Compilare solo una parte del kernel

Quando ci si dedica allo sviluppo del kernel, a volte si desidera compilare solo una specifica sottocartella, o un singolo file dell'intero albero del kernel. Il sistema di compilazione lo consente agevolmente. Per compilare selettivamente una sottocartella, specificatela nel comando di compilazione. Per esempio, per compilare i file nella cartella drivers/usb/serial, inserite:

$ make drivers/usb/serial

Usando questa sintassi, comunque, non si compilerà l'immagine finale del modulo in quella cartella. Per fare questo, potete usare l'opzione M=argomento:

$ make M=drivers/usb/serial

che compilerà tutti i file necessari in quella cartella e collegherà le immagini finali dei moduli.

Quando si compila una singola cartella in uno dei modi mostrati, l'immagine finale del kernel non viene ricollegata. Comunque ogni cambiamento che era stato effettuato alle sottocartelle non influenzerà l'immagine finale del kernel, che probabilmente non è quello che desiderate. Eseguite alla fine un:

$ make

perché il sistema di compilazione controlli tutti i file oggetto cambiati e colleghi in modo proprio l'immagine finale del kernel.

Per compilare un solo specifico file nell'albero del kernel, semplicemente passatelo come parametro a make. Per esempio, se desiderate compilare il modulo drivers/usb/serial/visor.ko, inserite:

$ make drivers/usb/serial/visor.ko

Il sistema di compilazione compilerà tutti i file necessari per il modulo visor.ko, e farà il collegamento finale per creare il modulo.

Sorgente in un posto, destinazione in un altro

Alle volte è più semplice avere i sorgenti del kernel in un posto accessibile in sola lettura (come un CD-ROM, o in un sistema di controllo del codice sorgente), e collocare il risultato della compilazione altrove, così da non alterare l'albero originale del sorgente. Il sistema di compilazione lo realizza facilmente, richiedendo il solo argomento O= per specificare dove collocare l'output della compilazione. Per esempio se i sorgenti del kernel sono in un CD-ROM montato in /mnt/cdrom/ e desiderate mettere i file compilati nella vostra cartella locale, inserite:

$ cd /mnt/cdrom/linux-2.6.17.11
$ make O=~/linux/linux-2.6.17.11

Tutti i file compilati saranno creati nella cartella ~/linux/linux-2.6.17.11. Notate che questa opzione O= dovrebbe essere passata anche alle opzioni di configurazione della compilazione cosicché la configurazione sia correttamente collocata nella cartella di destinazione e non in quella contenente il codice sorgente.

Architetture differenti

Una caratteristica molto utile è la costruzione di un kernel ottenuto tramite cross-compilazione, per permettere a una macchina più potente di compilare un kernel per una sistema embedded più piccolo, o anche solo per controllare una compilazione per un'architettura diversa per assicurare che a un cambiamento nel codice sorgente non danneggi qualcosa di inaspettato. Il sistema di compilazione del kernel consente di specificare un'architettura diversa da quella della macchina corrente con il parametro ARCH=argomento. Il sistema di compilazione consente, inoltre, di specificare il compilatore che si desidera usare con il parametro CC=argomento o un toolchain (un insieme di strumenti, N.d.T) per la cross-compilazione tramite l'argomento CROSS_COMPILE.

Per esempio, per avere la configurazione predefinita dell'architettura x86_64, si può inserire:

$ make ARCH=x86_64 defconfig

Per compilare l'intero kernel con uno strumento per concatenare la compilazione situato in /usr/local/bin, si può inserire:

$ make ARCH=arm CROSS_COMPILE=/usr/local/bin/arm-linux-

È utile anche per i kernel non ottenuti con la cross-compilazione cambiare ciò che il sistema di costruzione del kernel usa per il compilatore. Esempi di questo sono l'utilizzo dei programmi distcc o ccache, i quali riducono notevolmente il tempo di compilazione di un kernel. Per usare il programma ccache come parte del sistema di costruzione del kernel, digitate:

$ make CC="ccache gcc"

Per usare contemporaneamente distcc e ccache, inserite:

$ make CC="ccache distcc"



This is an indipendent translation of the book Linux Kernel in a Nutshell by Greg Kroah-Hartman. This translation (like the original work) is available under the terms of Creative Commons Attribution-ShareAlike 2.5.



Capitolo originale