LKN: Aggiornare il Kernel: differenze tra le versioni

m
riformattazione
(ricreata)
 
m (riformattazione)
Riga 1: Riga 1:
{{Template:LKN}}
{{Template:LKN}}
__TOC__
__TOC__
Inevitabilmente capita: avete un kernel personalizzato, funziona perfettamente tranne per una piccola cosa che è stata sistemata nel più recente rilascio (''release'') dagli sviluppatori del kernel. Oppure un problema di sicurezza è stato trovato, e una nuova release stabile del kernel è stata pubblicata. In entrambi i casi, siete davanti al problema di aggiornare il kernel ma non volete perdere tutto il tempo e la fatica spesa nella creazione di quella perfetta configurazione.


Inevitabilmente capita: avete un kernel personalizzato, funziona perfettamente tranne per una piccola cosa che è stata sistemata nell'ultima release appena rilasciata dagli sviluppatori del kernel. Oppure un problema di sicurezza è stato trovato, e una nuova release stabile del kernel è stata pubblicata. In entrambi i casi, siete davanti al problema di aggiornare il kernel ma non volete perdere tutto il tempo e la fatica spesa nella creazione di quella perfetta configurazione.
Questo capitolo mostra come è facile aggiornare il kernel da una vecchia versione, mantenendo tutte le opzioni di configurazione della precedente.
 
Questo capitolo mostra come è facile aggiornare il kernel da una vecchia versione, mantenendo tutte le opzioni di configurazione della precedente versione.
 
Anzitutto, fate il back up del file ''.config'' nella directory dei sorgenti del kernel. Avete speso del tempo e fatica per crearlo, e dovrebbe essere salvato nel caso qualcosa vada storto provando ad aggiornare.


Anzitutto, fate il backup del file ''.config'' nella directory dei sorgenti del kernel. Avete speso del tempo e fatica per crearlo, e dovrebbe essere salvato nel caso qualcosa vada storto provando ad aggiornare.
<pre>
<pre>
  $ cd ~/linux/linux-2.6.17.11
$ cd ~/linux/linux-2.6.17.11
  $ cp .config ../good_config
$ cp .config ../good_config
</pre>
</pre>


Solo cinque semplici passi sono necessari per aggiornare il kernel da uno precedentemente preparato:
Solo cinque semplici passi sono necessari per aggiornare il kernel da uno precedentemente preparato:
 
# Ottenere il nuovo codice sorgente.
1. Ottenete il nuovo codice sorgente.
# Applicare le modifiche al vecchio albero sorgente per portarlo al nuovo livello.
 
# Riconfigurare il kernel basato sulla configurazione precedente.
2. Applicate le modifiche al vecchio albero sorgente per portarlo al nuovo livello.
# Compilare il nuovo kernel.
 
# Installare il nuovo kernel.
3. Riconfigurare il kernel basato sulla configurazione precedente.
 
4. Compilare il nuovo kernel.
 
5. Installare il nuovo kernel.


Gli ultimi due passi funzionano come descritto prima, per cui discuteremo solo i primi tre punti in questo capitolo.
Gli ultimi due passi funzionano come descritto prima, per cui discuteremo solo i primi tre punti in questo capitolo.


In questo capitolo, presumeremo che si sia compilato con successo un kernel 2.6.17.9, e lo si voglia aggiornare alla versione 2.6.17.11.
In questo capitolo, presumeremo che si sia compilato con successo un kernel 2.6.17.9, e lo si voglia aggiornare alla release 2.6.17.11.


== Download del nuovo sorgente ==
== Download del nuovo sorgente ==
 
Gli sviluppatori del kernel Linux comprendono che gli utenti non desiderano scaricarsi l'intero codice sorgente del kernel per ogni aggiornamento. Sarebbe uno spreco di banda e tempo. Per questo offrono una patch che può aggiornare un kernel più vecchio a uno più recente.<sup>*</sup>
Gli sviluppatori del kernel Linux comprendono che gli utenti non desiderano scaricarsi l'intero codice sorgente del kernel per ogni aggiornamento. Sarebbe uno spreco di banda e tempo. A causa di questo, offrono una patch che può aggiornare un kernel più vecchio a uno nuovo.*


Sulla pagina principale del sito web di ''kernel.org'', ricorderete che è presente una lista delle versioni correnti di kernel che sono disponibili per il download, come mostrato in [[:Immagine:Kernel.org.png|Figura 6-1]].
Sulla pagina principale del sito web di ''kernel.org'', ricorderete che è presente una lista delle versioni correnti di kernel che sono disponibili per il download, come mostrato in [[:Immagine:Kernel.org.png|Figura 6-1]].
Riga 38: Riga 30:


Precedentemente, avete usato il link indicato dalla F per scaricare l'intero sorgente del kernel. Comunque, se premete sul nome della release del kernel, scaricherà invece un file di patch, come mostrato in [[:Immagine:Kernel.org_patch.png|Figura 6-2]].
Precedentemente, avete usato il link indicato dalla F per scaricare l'intero sorgente del kernel. Comunque, se premete sul nome della release del kernel, scaricherà invece un file di patch, come mostrato in [[:Immagine:Kernel.org_patch.png|Figura 6-2]].
* Si chiama ''patch'' perché il programma ''patch'' prende il file e la applica all'albero
originale, creando il nuovo albero. Il file patch contiene una rappresentazione delle
modifiche che sono necessarie alla compilazione dei nuovi files, sulla base dei vecchi.
I files patch sono leggibili, e contengono una lista di linee che sono da rimuovere e da
aggiungere, con alcuni contesti nel file che mostrano dove le modifiche vanno eseguite.


[[Immagine:Kernel.org_patch.png|center|500px|thumb|''Figure 6-2: Scaricamento di una patch da Kernel.org.'']]
[[Immagine:Kernel.org_patch.png|center|500px|thumb|''Figure 6-2: Scaricamento di una patch da Kernel.org.'']]


Questo è ciò che vogliamo quando aggiorniamo. Ma dobbiamo capire quale patch scaricare.


Questo è ciò che vogliamo quando aggiorniamo. Ma dobbiamo capire quale patch scaricare.
<small>Nota ('''<sup>*</sup>'''): si chiama ''patch'' perché il programma ''patch'' prende il file e la applica all'albero originale, creando il nuovo albero. Il file patch contiene una rappresentazione delle modifiche che sono necessarie alla compilazione dei nuovi file, sulla base dei vecchi. I file patch sono leggibili, e contengono una lista di linee che sono da rimuovere e da aggiungere, con alcuni contesti nel file che mostrano dove le modifiche vanno eseguite.</small>


== Quale patch applicare a quale versione? ==
== Quale patch applicare a quale versione? ==
 
Una patch del kernel aggiornerà il codice sorgente solo da una versione specifica ad un'altra versione specifica. Ecco come differenti patch possono essere applicate:
Una patch del kernel aggiornerà il codice sorgente solo da una specifica versione ad un'altra versione. Qui c'è come differenti patch possono essere applicate:
* Le patch stabili (''stable'') per il kernel si applicano sulla versione base del kernel. Ciò significa che la patch 2.6.17.10 si applicherà solo alla release del kernel 2.6.17. La patch del kernel 2.6.17.10 non si applicherà al kernel 2.6.17.9 o a qualsiasi altra release.
 
* Le patch del kernel di base (''base'') si applicano solo alle versioni di base del kernel precedenti. Ciò significa che la patch 2.6.18 si applicherà alla versione 2.6.17 del kernel. Non si applicherà all'ultima release 2.6.17.y del kernel, o a qualsiasi altra release.
* Le patch stabili per il kernel si applicano sulla versione base del kernel. Ciò significa che la patch 2.6.17.10 si applicherà solo alla versione del kernel 2.6.17. La patch del kernel 2.6.17.10 non si applicherà al kernel 2.6.17.9 o a qualsiasi altra release.
* Le patch incrementali (''incremental'') aggiornano da una specifica release a quella successiva. Questo permette agli sviluppatori di non dover retrocedere i loro kernel e poi aggiornarli, solo per cambiare dalla più recente release stabile a quella successiva (ricordatevi che le patch della release stabile sono solo per la base del kernel, non la release stabile precedente). Quando possibile, è raccomandabile che usiate le patch incrementali per rendere la vostra vita più semplice.
 
* Le patch del kernel di base si applicano solo alle versioni di base del kernel precedenti. Ciò significa che la patch 2.6.18 si applicherà alla versione 2.6.17 del kernel. Non si applicherà all'ultima release 2.6.17.y, o a qualsiasi altra release.
 
* Le patch incrementali aggiornano da una specifica release a quella successiva. Questo permette agli sviluppatori di non dover retrocedere i loro kernel e poi aggiornarli, solo per cambiare dalla più recente release stabile a quella successiva (ricordatevi che le patch della release stabile sono solo per la base del kernel, non la release stabile precedente). Quando possibile, è raccomandabile che usiate le patch incrementali per rendere la vostra vita più semplice.


== Trovare la patch ==
== Trovare la patch ==
Dal momento che noi vogliamo passare dalla release del kernel 2.6.17.9 alla 2.6.17.11, dobbiamo scaricare due differenti patch. Abbiamo bisogno di una per passare dalla 2.6.17.9 alla 2.6.17.10 e poi di una per passare dalla 2.6.17.10 alla 2.6.17.11.<sup>*</sup>


Dal momento che noi vogliamo passare dalla release di kernel 2.6.17.9 alla 2.6.17.11, dobbiamo scaricare due differenti patch. Abbiamo bisogno di una per passare dalla 2.6.17.9 alla 2.6.17.10 e poi di una per passare dalla 2.6.17.10 alla 2.6.17.11.*
Le patch stabili e di base si trovano nella stessa struttura di directory come gli alberi sorgenti principali. Tutte le patch incrementali possono esser trovate ad un livello più basso, nella directory ''incr''. Così, per trovare la patch che va da 2.6.17.9 a 2.6.17.10, guarderemo nella directory ''/pub/linux/kernel/v2.6/incr'' per trovare i file di cui abbiamo bisogno:<sup>+</sup>
<pre>
$ ~/linux
$ lftp ftp.kernel.org/pub/linux/kernel/v2.6/incr
cd ok, cwd=/pub/linux/kernel/v2.6/incr
lftp ftp.kernel.org:/pub/linux/kernel/v2.6/incr> ls *2.6.17.9*.bz2
-rw-rw-r-- 1 536 536 2872 Aug 22 19:23 patch-2.6.17.9-10.
bz2
lftp ftp.kernel.org:/pub/linux/kernel/v2.6/incr> get patch-2.6.17.9-10.bz2
2872 bytes transferred
lftp ftp.kernel.org:/pub/linux/kernel/v2.6/incr> get patch-2.6.17.10-11.bz2
7901 bytes transferred
lftp ftp.kernel.org:/pub/linux/kernel/v2.6/incr> exit
$ ls -F
good_config linux-2.6.17.9/ patch-2.6.17.10-11.bz2 patch-2.6.17.9-10.bz2
</pre>


Le patch stabili e di base si trovano nella stessa struttura di directory come gli alberi sorgenti principali. Tutte le patch incrementali possono esser trovate ad un livello più basso, nella directory incr. Così, per trovare la patch che va da 2.6.17.9 a 2.6.17.10, guarderemo nella directory ''/pub/linux/kernel/v2.6/incr'' per trovare i file di cui abbiamo bisogno:
<small>
Nota ('''<sup>*</sup>'''): se dovete aggiornare più di due versioni è raccomandabile, come modo per risparmiare passaggi, retrocedere e poi avanzare. In questo caso, potevamo andare indietro dalla 2.6.17.9 alla 2.6.17 e poi avanti dalla 2.6.17 alla 2.6.17.11 .


<pre>
Nota ('''<sup>+</sup>'''): in questo esempio usiamo il buon programma FTP ''lftp'' per scaricare le patch. Qualsiasi programma FTP o web browser può venir usato per scaricare gli stessi files. La cosa importante qui è mostrare dove si trovano questi files.
  $ ~/linux
</small>
  $ lftp ftp.kernel.org/pub/linux/kernel/v2.6/incr
  cd ok, cwd=/pub/linux/kernel/v2.6/incr
  lftp ftp.kernel.org:/pub/linux/kernel/v2.6/incr> ls *2.6.17.9*.bz2
  -rw-rw-r-- 1 536 536 2872 Aug 22 19:23 patch-2.6.17.9-10.
  bz2
  lftp ftp.kernel.org:/pub/linux/kernel/v2.6/incr> get patch-2.6.17.9-10.bz2
  2872 bytes transferred
  lftp ftp.kernel.org:/pub/linux/kernel/v2.6/incr> get patch-2.6.17.10-11.bz2
  7901 bytes transferred
  lftp ftp.kernel.org:/pub/linux/kernel/v2.6/incr> exit
  $ ls -F
  good_config linux-2.6.17.9/ patch-2.6.17.10-11.bz2 patch-2.6.17.9-10.bz2
</pre>


== Applicare la patch ==
== Applicare la patch ==
Dal momento che le patch che abbiamo scaricato sono compresse, la prima cosa da fare è decomprimerle con il comando ''bzip2'':
Dal momento che le patch che abbiamo scaricato sono compresse, la prima cosa da fare è decomprimerle con il comando ''bzip2'':
<pre>
<pre>
  $ bzip2 -dv patch-2.6.17.9-10.bz2
$ bzip2 -dv patch-2.6.17.9-10.bz2
    patch-2.6.17.9-10.bz2: done
  patch-2.6.17.9-10.bz2: done
  $ bzip2 -dv patch-2.6.17.10-11.bz2
$ bzip2 -dv patch-2.6.17.10-11.bz2
    patch-2.6.17.10-11.bz2: done
  patch-2.6.17.10-11.bz2: done
  $ ls -F
$ ls -F
  good_config linux-2.6.17.9/ patch-2.6.17.10-11 patch-2.6.17.9-10
good_config linux-2.6.17.9/ patch-2.6.17.10-11 patch-2.6.17.9-10
</pre>
</pre>


Ora dobbiamo applicare le patch alla directory del kernel. Andate nella directory:
Ora dobbiamo applicare le patch alla directory del kernel. Andate nella directory:
 
<pre>$ cd linux-2.6.17.9</pre>
'''$ cd linux-2.6.17.9'''


Lanciate il programma ''patch'' per applicare la prima patch spostando l'albero sorgente dalla versione 2.6.17.9 alla 2.6.17.10:
Lanciate il programma ''patch'' per applicare la prima patch spostando l'albero sorgente dalla versione 2.6.17.9 alla 2.6.17.10:
'''$ patch -p1 < ../patch-2.6.17.9-10'''
* Se dovete aggiornare più di due versioni, è raccomandabile come modo per salvare
passaggi, retrocedere e poi avanzare. In questo caso, potevamo andare indietro dalla
2.6.17.9 alla 2.6.17 e poi avanti dalla 2.6.17 alla 2.6.17.11 .
+ In questo esempio, usiamo il programma FTP molto buono ''lftp'' per scaricare le patch.
Qualsiasi programma FTP o web browser può venir usato per scaricare gli stessi files.
La cosa importante qui è mostrare dove si trovano questi files.
<pre>
<pre>
$ patch -p1 < ../patch-2.6.17.9-10
patching file Makefile
patching file Makefile
patching file block/elevator.c
patching file block/elevator.c
Riga 123: Riga 97:
</pre>
</pre>


Si verifichi che veramente la patch ha funzionato correttamente e che non ci siano errori o avvisi in output dal programma patch. E' anche buona idea guardare nel ''Makefile'' la versione del kernel:
Si verifichi che veramente la patch ha funzionato correttamente e che non ci siano errori o avvisi in output dal programma patch. È anche una buona idea guardare nel ''Makefile'' la versione del kernel:
 
<pre>
<pre>
$ head -n 5 Makefile
$ head -n 5 Makefile
Riga 135: Riga 108:


Ora che il kernel è alla release 2.6.17.10, fate le stesse cose di prima, e applicate la patch per portarlo al livello 2.6.17.11:
Ora che il kernel è alla release 2.6.17.10, fate le stesse cose di prima, e applicate la patch per portarlo al livello 2.6.17.11:
<pre>
<pre>
$ patch -p1 < ../patch-2.6.17.10-11
$ patch -p1 < ../patch-2.6.17.10-11
Riga 172: Riga 144:


Ancora una volta verificate che non ci siano errori e guardate il ''Makefile'':
Ancora una volta verificate che non ci siano errori e guardate il ''Makefile'':
<pre>
<pre>
$ head -n 5 Makefile
$ head -n 5 Makefile
Riga 183: Riga 154:


Ora che il codice sorgente è aggiornato con successo alla versione che desiderate avere, è una buona idea tornare indietro e cambiare il nome della directory per riferirsi alla versione del kernel in modo da evitare confusione in seguito:
Ora che il codice sorgente è aggiornato con successo alla versione che desiderate avere, è una buona idea tornare indietro e cambiare il nome della directory per riferirsi alla versione del kernel in modo da evitare confusione in seguito:
<pre>
<pre>
$ cd ..
$ cd ..
Riga 192: Riga 162:


== Riconfigurare il kernel ==
== Riconfigurare il kernel ==
Precedentemente, abbiamo usato i metodi ''make menuconfig'' oppure ''gconfig'' o ''xconfig'' per cambiare differenti opzioni di configurazione. Ma una volta che avete una configurazione funzionante, l'unica cosa necessaria è aggiornarla con qualsiasi nuova opzione che è stata aggiunta al kernel dall'ultima release. Per fare ciò, si devono usare le opzioni ''make oldconfig'' e ''make silentoldconfig''.


Precedentemente, abbiamo usato il metodo ''make menuconfig o gconfig o xconfig'' per cambiare differenti opzioni di configurazione. Ma una volta che avete una configurazione funzionante, l'unica cosa che è necessaria è aggiornarla con qualsiasi nuova opzione che è stata aggiunta al kernel dall'ultima release. Per fare ciò, le opzioni ''make oldconfig e make silentoldconfig'' devono esser usate.
''make oldconfig'' prende la configurazione del kernel corrente nel file ''.config'', e lo aggiorna sulla base del nuovo kernel. Per far ciò, stampa tutte le domande di configurazione, e fornisce loro una risposta se l'opzione è già gestita nel file di configurazione. Se c'è una nuova opzione, il programma si ferma e chiede all'utente a cosa il nuovo valore deve essere impostato. Dopo aver risposto, il programma continua finché l'intera configurazione del kernel è finita.


''make oldconfig'' prende la configurazione del kernel corrente nel file ''.config'', e lo aggiorna sulla base del nuovo kernel. Per far ciò, stampa tutte le domande di configurazione, e provvede a una risposta per esse se l'opzione è già gestita nel file di configurazione. Se c'è una nuova opzione, il programma si ferma e chiede all'utente a cosa il nuovo valore deve essere impostato. Dopo aver risposto, il programma continua finché l'intera configurazione del kernel è finita.
''make silentoldconfig'' funziona esattamente nello stesso modo di ''oldconfig'', ma non stampa niente sullo schermo, a meno che necessiti di chiedere una domanda su una opzione della nuova configurazione.
 
''make silentoldconfig'' funziona esattamente nello stesso modo di ''oldconfig'', ma non stampa niente sullo schermo, a meno che necessita di chiedere una domanda su una opzione della nuova configurazione.
 
Solitamente, quando si aggiorna tra differenti versioni delle release stabili, nessuna nuova opzione di configurazione viene aggiunta, dal momento che si suppone essere una serie di kernel stabile. Se questo succede, non ci sono nuove domande che necessitano una risposta per la configurazione del kernel, per ciò il programma continua con successo senza alcun bisogno per l'utente di interventi. Un esempio di ciò è spostarsi dalla versione 2.6.17.9 alla 2.6.17.11:


Solitamente, quando si aggiorna tra differenti versioni delle release stabili, nessuna nuova opzione di configurazione viene aggiunta, dal momento che si suppone essere una serie di kernel stabile. Se questo succede, non ci sono nuove domande che necessitano una risposta per la configurazione del kernel, perciò il programma continua con successo senza alcun bisogno di interventi dell'utente. Un esempio di questo è mostrato aggiornando dalla release 2.6.17.9 alla 2.6.17.11:
<pre>
<pre>
$ cd linux-2.6.17.11
$ cd linux-2.6.17.11
Riga 210: Riga 178:
</pre>
</pre>


Il seguente esempio mostra cosa succede quando una nuova opzione del kernel viene mostrata in una nuova release. L'opzione del kernel per abilitare il ''Mutex debugging'' è di certo una nuova opzione per alcune kernel release. Qui c'è l'output quando ciò succede:
Il seguente esempio mostra cosa succede quando una nuova opzione del kernel arriva in una nuova release. L'opzione del kernel per abilitare il ''Mutex debugging'' è una nuova opzione per alcune release. Ecco l'output:
 
<pre>
<pre>
$ make silentoldconfig
$ make silentoldconfig
Riga 236: Riga 203:


Il programma di configurazione si ferma a questa opzione e chiede all'utente di scegliere una opzione. Premere y, e il programma continua:
Il programma di configurazione si ferma a questa opzione e chiede all'utente di scegliere una opzione. Premere y, e il programma continua:
<pre>
<pre>
Spinlock debugging (DEBUG_SPINLOCK) [Y/n/?] y
Spinlock debugging (DEBUG_SPINLOCK) [Y/n/?] y
Riga 259: Riga 225:
</pre>
</pre>


In questo modo aggiornare la configurazione del kernel per una nuova è semplice come usare una opzione differente a ''make''. Con questo metodo non si ha bisogno di usare la grafica o programmi testuali di configurazione per qualsiasi aggiornamento di kernel.
In questo modo aggiornare la configurazione del kernel per una nuova è semplice come usare una opzione differente a ''make''. Con questo metodo non si ha bisogno di usare programmi di configurazione grafici o testuali per qualsiasi aggiornamento del kernel.
 


== &Egrave; possibile automatizzare tutto? ==
== &Egrave; possibile automatizzare tutto? ==
 
L'intero processo di scaricamento del file di patch appropriato, la sua decompressione e applicazione sembra essere maturo per l'automatizzazione. Gli sviluppatori del kernel essendo tipi a cui piace automatizzare operazioni ripetitive, hanno creato il programma ''ketchup'' per gestire tutto automaticamente. Si veda l'[[LKN: Programmi Utili|appendice A]] per ulteriori dettagli su come funziona questo programma e come usarlo.
L'intero processo di scaricamento del file di patch appropriato, la sua decompressione e applicazione sembra essere maturo per l'automatizzazione. Gli sviluppatori del kernel essendo tipi a cui piace automatizzare operazioni ripetitive, hanno creato il programma ''ketchup'' per gestire tutto automaticamente. Si veda l'appendice A per ulteriori dettagli su come questo programma lavori e come usarlo.




3 581

contributi