LKN: Configurare e Compilare: differenze tra le versioni

Vai alla navigazione Vai alla ricerca
m
link
Nessun oggetto della modifica
m (link)
 
(9 versioni intermedie di 2 utenti non mostrate)
Riga 1: Riga 1:
{{Navigazione
{{Template:LKN}}
|Libro=Linux Kernel in a Nutshell
|NomeLibro=Linux Kernel in a Nutshell
|CapitoloPrecedente=Procurarsi i Sorgenti del Kernel
|NomePaginaCapitoloPrecedente=LKN:_Procurarsi_i_Sorgenti_del_Kernel
|CapitoloSuccessivo=Installare ed Avviare con un Kernel
|NomePaginaCapitoloSuccessivo=LKN:_Installare_ed_Avviare_con_un_Kernel
}}
 
__TOC__
__TOC__


Riga 13: Riga 5:


== '''Creare una configurazione''' ==
== '''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]].
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]].


==='''Configurare dall'inizio'''===
==='''Configurare dall'inizio'''===
Il modo più spartano per configurare un kernel è usare il metodo ''make config'':
Il modo più spartano per configurare un kernel è usare il metodo ''make config'':
<pre>$ cd linux-2.6.17.10
<pre>
  $ make config
$ cd linux-2.6.17.10
make config
$ make config
make config
scripts/kconfig/conf arch/i386/Kconfig
scripts/kconfig/conf arch/i386/Kconfig
*
*
Riga 37: Riga 29:
Automatically append version information to the version string
Automatically append version information to the version string
(LOCALVERSION_AUTO) [Y/n/?] Y
(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 <tt>[Y/m/n/?]</tt>. La lettera maiuscola è la scelta predefinita, e può essere selezionata semplicemente premendo il tasto Invio. Le quattro scelte sono:
</pre>
* <tt>Y</tt>  Compilare direttamente nel kernel.
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:
* <tt>n</tt>  Lasciare completamente al di fuori del kernel.
* <code>Y</code>  Compilare direttamente nel kernel.
* <tt>m</tt>  Compilare come modulo, da caricare se necessario.
* <code>n</code>  Lasciare completamente al di fuori del kernel.
* <tt>?</tt>  Stampa un breve messaggio descrittivo e ripropone il quesito.
* <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.
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.


Riga 67: Riga 60:
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 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 <tt>Device Drivers ---></tt>.
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>.


[[Immagine:Menuconfig_2.png|center|500px|thumb|''Figura 4-2. Selezione dell'opzione Device Drivers'']]
[[Immagine:Menuconfig_2.png|center|500px|thumb|''Figura 4-2. Selezione dell'opzione Device Drivers'']]


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


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


[[Immagine:Menuconfig_3.png|center|500px|thumb|''Figura 4-3. Sottomenu Device Drivers'']]
[[Immagine:Menuconfig_3.png|center|500px|thumb|''Figura 4-3. Sottomenu Device Drivers'']]


Potete continuare a muovervi nella gerarchia dei menu allo stesso modo. Per visualizzare il sotto-menu <tt>Generic Driver Options</tt> premete Invio di nuovo, e vedrete se tre opzioni mostrate in figura 4-4.
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.


[[Immagine:Menuconfig_4.png|center|500px|thumb|''Figura 4-4. Sottomenu Generic Driver Options'']]
[[Immagine:Menuconfig_4.png|center|500px|thumb|''Figura 4-4. Sottomenu Generic Driver Options'']]


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


Se l'opzione è selezionata con <tt>Y</tt>, le parentesi ad angolo conterranno un <tt>*</tt>. Se è selezionata come modulo con una <tt>M</tt>, conterranno una lettera <tt>M</tt>. Se è disabilitata con <tt>N</tt>, mostreranno solo uno spazio bianco.
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.


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 <tt>Y</tt> per la prima opzione, <tt>N</tt> per la seconda e <tt>M</tt> per la terza, rendendo la schermata come quella in figura 4-5.
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.


[[Immagine:Menuconfig_5.png|center|500px|thumb|''Figura 4-5. Sottomenu Generic Driver Options cambiato'']]
[[Immagine:Menuconfig_5.png|center|500px|thumb|''Figura 4-5. Sottomenu Generic Driver Options cambiato'']]
Riga 97: Riga 90:
Vi sarà mostrata la schermata in figura 4-6, che vi chiede se desiderate salvare la vostra modificata configurazione.
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 <tt>< No ></tt> e premete Invio.
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.




Riga 109: Riga 102:
[[Immagine:Xconfig_1.png|center|500px|thumb|''Figura 4-8. Schermata di make xconfig'']]
[[Immagine:Xconfig_1.png|center|500px|thumb|''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 <tt>Generic Driver Options</tt> del menu <tt>Device Drivers</tt>. Questo cambierà la schermata di ''xconfig'' e la farà diventare quella dell'immagine 4-9.  
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.  


[[Immagine:Xconfig_2.png|center|500px|thumb|''Figura 4-9. Generic Driver Options in make xconfig'']]
[[Immagine:Xconfig_2.png|center|500px|thumb|''Figura 4-9. Generic Driver Options in make xconfig'']]
Riga 152: Riga 145:
...</pre>
...</pre>


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


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.
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.
Riga 158: Riga 151:
È 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.
È 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.
<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>


=='''Opzioni di compilazione avanzate'''==
=='''Opzioni di compilazione avanzate'''==
Riga 175: Riga 168:


==='''Compilare solo una parte del kernel'''===
==='''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>
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:
Usando questa sintassi, comunque, non si compilerà l'immagine finale del modulo in quella cartella. Per fare questo, potete usare l'opzione <tt>M=</tt>argomento:<pre>$ make M=drivers/usb/serial</pre>che compilerà tutti i file necessari in quella cartella e collegherà le immagini finali dei moduli.
<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.
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.


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>
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.
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'''===
==='''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 <tt>O=</tt> 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
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>
$ 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 <tt>O=</tt> 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.
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'''===
==='''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 <tt>ARCH=</tt>argomento. Il sistema di compilazione consente, inoltre, di specificare il compilatore che si desidera usare con il parametro <tt>CC=</tt>argomento o un toolchain (un insieme di strumenti, N.d.T) per la cross-compilazione tramite l'argomento <tt>CROSS_COMPILE</tt>.
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>.


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


[http://www.kernel.org/pub/linux/kernel/people/gregkh/lkn/lkn_pdf/ch04.pdf ''Capitolo originale'']
 
[http://files.kroah.com/lkn/lkn_pdf/ch04.pdf ''Capitolo originale'']
 
 
[[Categoria:Documentazione tecnica]]
[[Categoria:Documentazione tecnica]]
[[Categoria:Linux]]
[[Categoria:Linux Kernel in a Nutshell]]
3 581

contributi

Menu di navigazione