LKN: Programmi Utili: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
m (link)
(nuova categoria)
 
(21 versioni intermedie di 5 utenti non mostrate)
Riga 1: Riga 1:
''Torna all'indice: [[Linux Kernel in a Nutshell]]''
{{Template:LKN}}
__TOC__


Quando si copila un kernel personalizzato ci si vorrebbe servire dell'ultima versione stabile. Molte distribuzioni forniscono i loro pacchetti dei sorgenti del kernel, ma raramente questi sono i pi� recenti e aggiornati. I pacchetti ufficiali delle distribuzioni hanno il vantaggio di essere compatibili con il compilatore e gli altri strumenti forniti dalla distribuzione stessa (Il capitolo 2 mette in evidenza l'importanza di questa compatibilit�), ma non � detto che permettano di avere le funzionalit� o le prestazioni di cui si ha bisogno. Preparando l'ambiente con il kernel pi� recente e le ultime versioni del compilatore e degli altri programmi sar� possibile ottenere esattamente ci� che si vuole. Questo capitolo spiega quali sorgenti del kerner scaricare e dove trovarli.
Scaricare [da Internet, NdT], compilare, aggiornare e mantenere i sorgenti del kernel Linux comporta diversi passi, come questo libro illustra. Essendo per natura creature pigre, gli sviluppatori hanno creato alcuni programmi a supporto di queste attività di routine. Descriviamo alcuni di tali utili strumenti e le nozioni di base sul loro utilizzo.


=='''Quale ramo usare'''==
Lo sviluppo del kernel Linux differisce per molti aspetti dal tradizionale processo di sviluppo software. A uno sviluppatore del kernel sono richieste alcune attività peculiari:
[[Immagine:kernel_releases.png|300px|thumb|Figura 3-1: Ciclo di sviluppo e rilascio del kernel]]


In passato il kernel Linux era diviso in 2 rami: quello di "sviluppo" e quello "stabile". Per distinguerli, il ramo di sviluppo era contrassegnato da un valore dispari nel secondo numero di release, quello stabile da un valore pari. Ad esempio, la 2.5.25 era una versione di sviluppo, mentre la 2.4.25 era la stabile.
* Applicare le modifiche ad un "bersaglio mobile" quale è il kernel, a causa della rapida pianificazione delle versioni di sviluppo.
* Risolvere i conflitti derivanti dalla fusione del proprio lavoro con quello dagli altri sviluppatori.
* Esportare i suoi cambiamenti in un formato che permetta agli altri sviluppatori di incorporarli facilmente nel proprio lavoro.


Quando fu creata la serie 2.6, gli sviluppatori decisero di abbandonare questo metodo basato su due rami separati e annunciarono che tutti i rilasci della serie 2.6 del kernel sarebbero stati considerati "stabili", indipendentemente da quanto veloce fosse stato il processo di sviluppo. I pochi mesi a disposizione tra le versioni maggiori della serie 2.6 avrebbero lasciato agli sviluppatori il tempo necessario per aggiungere nuove funzioni e renderle stabili per il rilascio successivo. Assieme a questo fu creato un ramo "-stabile" del kernel per permettere eventuali correzioni dei bug e aggiornamenti di sicurezza per l'ultima versione, prima che quella nuova venga rilasciata.
==patch e diff==
Alcuni esempi, illustrati in [[:Immagine:kernel_releases.png|figura 3-1]], aiuteranno a chiarire tutto questo: il team del kernel rilascia la versione stabile 2.6.17; poi gli sviluppatori iniziano a lavorare su nuove caratteristiche e rilasciano la versione -rc del kernel in via di sviluppo, in modo che chi vuole possa aiutare nella fase di test e di debug dei cambiamenti. Quando tutti concordano sul fatto che la versione in via di sviluppo sia abbastanza stabile, questa viene rilasciata come 2.6.18. L'intero ciclo impiega solitamente due o tre mesi, dipendendo da svariati fattori.
Questa sezione è basata su un articolo pubblicato originariamento su ''Linux Journal''.


Durante lo sviluppo di nuove funzioni vengono rilasciate la 2.6.17.2, la 2.6.17.3 e altre release stabili del kernel, contenenti correzioni di bug e aggiornamenti di sicurezza.
Una delle modalità più comuni per lavorare con il kernel è quella di usare i programmi ''patch'' e ''diff''. Per usare questi strumenti, sono necessarie due differenti directory: una "pulita" (clean) e una "di lavoro" (indicata con ''dirty'' in seguito). La directory clean contiene la versione originale del kernel, mentre quella dirty contiene le modifiche apportate dal programmatore alla stessa release.
È consigliabile che chi intenda usare l'ultima versione del kernel per lavoro si serva di quella stabile. Chi invece intende aiutare gli sviluppatori, pu� testare le caratteristiche della generazione successiva del kernel e darne una valutazione. Per quanto concerne gli scopi di questo capitolo, si suppone che venga utilizzata la versione stabile.
Utilizzando ''patch'' e ''diff'' è possibile estrarre i cambiamenti apportati sul sorgente e portarli nella nuova release del kernel.


=='''Dove trovare i sorgenti del kernel'''==
Per esempio, creiamo due directory contenenti l'ultima versione del kernel come descritto nel Capitolo 3.
Tutti i sorgenti del kernel Linux si possono trovare in ognuno dei siti kernel.org, una rete di mirror che permette a chiunque di trovare il server locale pi� vicino. Questo fa s� che i server principali possano rispondere pi� prontamente ai mirror e che gli utenti riescano a scaricare i file il pi� velocemente possibile.


La pagina principale di http://www.kernel.org riporta tutte le versioni correnti del kernel per ogni differente ramo, come mostrato in [[:Immagine:kernel.org.png|figura 3-2]].
<pre>
$ tar -zxf linux-2.6.19.tar.gz
$ mv linux-2.6.19 linux-2.6.19-dirty
$ tar -zxf linux-2.6.19.tar.gz
$ ls
linux-2.6.19/
linux-2.6.19-dirty/
</pre>
 
Ora è possibile apportare tutte le modifiche desiderate al sorgente presente nella directory dirty, lasciando inalterata quella clean. Dopo aver apportato le modifiche, si potrà creare una patch da inviare agli altri sviluppatori tramite i seguenti comandi:
 
<pre>
$ diff -Naur -X linux-2.6.19/Documentation/dontdiff linux-2.6.19/ \
linux-2.6.19-dirty/ > my_patch
</pre>
 
Questo comando creerà un file dal nome ''my_patch'' che conterrà tutti i cambiamenti apportati al sorgente del kernel rispetto alla versione pulita presente nella directory clean. Tale file potrà essere distribuito o inviato ad agli altri sviluppatori via email.
 
 
===Nuove versioni del kernel===
Al rilascio di una nuova versione del kernel, se si desidera portare i cambiamenti su questa nuova versione è necessario applicare la patch ad una versione ''pulita'' del kernel.
Questo può essere fatto seguendo questi passi:
* Creare la patch, come illustrato nell'esempio precedente.
* Utilizzare la patch ufficiale dal sito ''kernel.org'' e aggiornare la vecchia versione alla nuova release:
 
<pre>
$ cd linux-2.6.19
$ patch -p1 < ../patch-2.6.20
$ cd ..
$ mv linux-2.6.19 linux-2.6.20
</pre>
 
* Aggiornare la directory di lavoro rimuovendo la propria patch e, in seguito, applicando il nuovo aggiornamento:
<pre>
$ cd linux-2.6.19-dirty
$ patch -p1 -R < ../my_patch
$ patch -p1 < ../patch-2.6.20
$ cd ..
$ mv linux-2.4.19-dirty linux-2.6.20-dirty
</pre>
 
* Provare ad applicare la propria patch al nuovo aggiornamento:
<pre>
$ cd linux-2.6.20-dirty
$ patch -p1 < ../my_patch
</pre>
 
Se l'applicazione della patch provoca dei problemi, è necessario risolvere i conflitti creati (il comando ''patch'' informerà circa questi conflitti creando i file ''.rej'' e ''.orig'' per l'analisi e la correzioni da parte dello sviluppatore).
Questo processo di ''fusione'' (''merge'') può rappresentare la parte più difficile dell'intero processo se sono stati apportati cambiamenti a porzioni di codice che sono state modificate anche da altri.
 
Per applicare correttamente questo processo di sviluppo, consiglio vivamente di utilizzare l'eccellente insieme di programmi ''patchutils'' (reperibile qui: ''http://cyberelk.net/tim/patchutils''). Questi programmi permettono di manipolare le patch facilmente e hanno risparmiato agli sviluppatori molte ore di tedioso lavoro.
 
 
== Gestire le proprie patch con quilt ==
 
I programmi ''patch'' e ''diff'' risultano essere molto utili e funzionali per lo sviluppo del kernel. Ma dopo un certo periodo di utilizzo, molti si stancano di questo modo si procedere nello sviluppo e cercano altra strade che non coinvolgano le noiose attività di pacthing e merging. Fortunatamente, alcuni sviluppatori del kernel hanno realizzato un programma chiamato ''quilt'' che gestisce il processo di manipolazione delle patch in modo molto più semplice.
 
L'idea alla base di ''quilt'' discende da un insieme di script di Andrew Morton, realizzati originariamente per gestire il codice del sottosistema di gestione della memoria e, in seguito, utilizzati per l'intero kernel. I suoi script erano legati molto strettamente al processo di sviluppo, ma l'idea sottostante era molto potente.
Andreas Gruenbacher ha quindi ripreso questa idea creando ''quilt''.
 
L'idea principale sottostante ''quilt'' è di lavorare con una versione ''pulita'' del kernel alla quale aggiungere un insieme di patch. E&grave; possibile inserire e togliere diverse patch dal sorgente e mantenere una lista delle patch in modo molto semplice.
 
1. Per iniziare, creiamo una directory contenente il sorgente del kernel:
<pre>
$ tar -zxf linux-2.6.19.tar.gz
$ ls
linux-2.6.19/
</pre>
 
2. Spostiamoci in tale directory:
<pre>
$ cd linux-2.6.19
</pre>
 
3. Creiamo una directory ''patches'' che conterrà tutte le nostre patch:
<pre>
$ mkdir patches
</pre>
 
4. Tramite ''quilt'' creiamo una nuova patch chiamata ''patch1'':
<pre>
$ quilt new patch1
Patch patches/patch1 is now on top
</pre>


[[Immagine:kernel.org.png|center|500px|thumb|Figura 3-2: Il sito ufficiale Kernel.org.]]
5. ''quilt'' necessita di sapere quali file saranno modificati da questa patch. Per fare questo, utilizziamo il comando ''add'':
<pre>
$ quilt add Makefile
File Makefile added to patch patches/patch1
</pre>


Per scaricare l'ultima versione stabile del kernel � sufficiente cliccare sulla lettera F nella linea corrispondente: cos� facendo si scaricher� l'intero albero dei sorgenti. Altrimenti � possibile accedere alla sotto-directory relativa ad ogni versione della serie 2.6 tramite la pagina http://www.kernel.org/pub/linux/kernel/v2.6/, mostrata in [[:Immagine:Kernel.org.v2.6.png|figura 3-3]].
6. Apriamo il file ''Makefile'' e modifichiamo la linea EXTRAVERSION, salvando poi il file. Alla fine, aggiorniamo la patch tramite ''quilt'':


[[Immagine:Kernel.org.v2.6.png|center|500px|thumb|Figura 3-3: Directory dei sorgenti per il kernel 2.6]]
<pre>
$ quilt refresh
Refreshed patch patches/patch1
</pre>


&Egrave; anche possibile scaricare i sorgenti del kernel tramite riga di comando, usando il programma <tt>wget</tt> o <tt>curl</tt>, normalmente presenti in ogni distribuzione Linux.
Il file ''patches/patch1'' conterrà una patch con tutti i cambiamenti appena fatti:
<pre>
$ cat patches/patch1
Index: linux-2.6.19/Makefile
===================================================================
--- linux-2.6.19.orig/Makefile
+++ linux-2.6.19/Makefile
@@ -1,7 +1,7 @@
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 19
-EXTRAVERSION =
+EXTRAVERSION = -dirty
NAME=Crazed Snow-Weasel
# *DOCUMENTATION*
</pre>


Per scaricare la versione 2.6.17.8 del kernel con <tt>wget</tt> il comando �:
Ora è possibile continuare a lavorare su una patch, o crearne una nuova in testa a quella attuale.
Ad esempio, se sono state create tre diverse patch ''patch1'', ''patch2'' e ''patch3'', esse saranno applicate una sopra l'altra.
Per vedere la lista delle patch attualmente applicate:
<pre>
$ quilt series -v
+ patches/patch1
+ patches/patch2
= patches/patch3
</pre>


<pre>$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.8.tar.gz
Il risultato del comando mostra che tutte e tre le patch sono state applicate e che quella corrente è la ''patch3''.
Al rilascio di una nuova versione del kernel, se si vuole portare i cambiamenti effettuati sulla versione precedente anche sulla nuova versione, è possibile utilizzare ''quilt'' secondo i seguenti passi:


1. Togliere le patch attualmente applicate al sorgente
<pre>
$ quilt pop -a
Removing patch patches/patch3
Restoring drivers/usb/Makefile
Removing patch patches/patch2
Restoring drivers/Makefile
Removing patch patches/patch1
Restoring Makefile
No patches applied
</pre>


-> 'linux-2.6.17.8.tar.gz
2. Utilizzando la patch ufficiale da ''kernel.org'' aggiornare la vecchia versione del kernel:
<pre>
$ patch -p1 < ../patch-2.6.20
$ cd ..
$ mv linux-2.6.19 linux-2.6.20
</pre>
3. A questo punto, tramite ''quitl'' applicare nuovamente le patch sul nuovo sorgente:
<pre>
$ quilt push
Applying patch patches/patch1
patching file Makefile
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED -- rejects in file Makefile
Patch patches/patch1 does not apply (enforce with -f)
</pre>


Resolving www.kernel.org... 204.152.191.5, 204.152.191.37
4. Come risultato, le patch non si applicano immediatamente senza problemi. E&grave; possibile forzare l'applicazione della patch e poi procedere alle correzioni necessarie:
<pre>
$ quilt push -f
Applying patch patches/patch1
patching file Makefile
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED -- saving rejects to file Makefile.rej
Applied patch patches/patch1 (forced; needs refresh)
$ vim Makefile.rej Makefile
</pre>


Connecting to www.kernel.org|204.152.191.5|:80... connected.
5. Dopo aver applicato manualmente la patch, aggiornare la patch:
<pre>
$ quilt refresh
Refreshed patch patches/patch1
</pre>


HTTP request sent, awaiting response... 200 OK
6. Procedere all'applicazione delle altre patch:
<pre>
$ quilt push
Applying patch patches/patch2
patching file drivers/Makefile
Now at patch patches/patch2
$ quilt push
Applying patch patches/patch3
patching file drivers/usb/Makefile
Now at patch patches/patch3
</pre>


Lenght: 51,707,742 (49M) [application/x-gzip]


100%[-------------------------------------->] 51,707,742 35.25k/s
''quilt'' ha anche delle opzioni che permettono di inviare automaticamente le nuove patch ad un gruppo di persone o a una mailing list, di eliminare specifiche patch all'interno della serie, di ricercare una specifica patch all'interno della serie e molte altre utili opzioni.


ETA 00:00
''quilt'' è vivamente consigliato per qualsiasi attività di sviluppo del kernel, anche per tenere traccia di poche patch, invece di usare i più ostici ''diff'' e ''patch''. E&grave; decisamente più semplice e consente di risparmiare parecchio tempo e sforzi.


18:02:48 (47.12 kB/s) - 'linux-2.6.17.8.tar.gz' saved [51707742/51707742]</pre>
Come nota personale, non raccomanderò mai abbastanza l'utilizzo di questo strumento, poiché lo utilizzo tutti i giorni per gestire centinaia di patch in diversi rami di sviluppo.
Esso è anche usato da numerose distribuzioni Linux per gestire il proprio kernel e può contare su una comunità di sviluppo entusiasta e reattiva.


Per scaricarla con <tt>curl</tt>:
== git ==


<pre>$ curl http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.8.tar.gz \ -o linux-2.6.17.8.tar.gz</pre>
''git'' è uno strumento di controllo del codice sorgente originariamente scritto da Linus Torvalds quando stava cercando un nuovo sistema di gestione del codice per il kernel di Linux.


Il modo pi� semplice e veloce per scoprire quale sia l'ultima versione del kernel � usare le informazioni disponibili alla pagina http://www.kernel.org/kdist/finger_banner, come mostrato in [[:Immagine:Kernel.org.v2.6.png|figura 3-4]].
&Egrave; un sistema distribuito che differisce dai sistemi tradizionali di gestione del codice (come ad esempio CVS) nel fatto che non è necessario essere connessi al server per effettuare un commit sul deposito.


[[Immagine:Kernel.org_finger_banner.png|center|500px|thumb|Figura 3-4: Ultima versione del kernel.]]
''git'' è uno dei più potenti, flessibili e veloci sistemi di gestione del codice sorgente attualmente disponibili, e ha alle spalle un team di sviluppo molto attivo.
La pagina principale di ''git'' è ''http://git.or.cz/''.
Si consiglia ad ogni nuovo utente di seguire le guide pubblicate al fine di familiarizzare con la modalità di funzionamento di git, in modo da poterlo utilizzare correttamente.


=='''Cosa fare con i sorgenti'''==
Il kernel di Linux è sviluppato utilizzando ''git'', e le ultime versioni possono essere trovate all'indirizzo ''http://www.kernel.org/git/'' insieme ad una vasta lista di altri depositi git.


Una volta scaricati i sorgenti del kernel appropriati, dove � previsto che vengano messi? E' consigliabile creare una directory locale nella propria home chiamata linux per conservare tutti i file dei sorgenti del kernel:
Non è necessario utilizzare ''git'' per sviluppare il kernel di Linux, ma è molto utile per tenere traccia dei bug rilevati.
Se doveste segnalare un bug agli sviluppatori del kernel, essi potranno richiedevi di utilizzare ''git bisect'' al fine di identificare l'esatta modifica che ha causato il bug. In questo caso, potete seguire le indicazioni sulla documentazione di ''git'' per capire come procedere.


<pre>$ mkdir ~/linux</pre>
== ketchup ==


Spostate il codice sorgente nella directory linux:
''ketchup'' è uno strumento molto comodo utilizzato per aggiornare una versione del kernel o per passare da una versione all'altra del codice sorgente.


<pre>$ mv ~/linux-2.6.18.8.tar.gz ~/linux/</pre>
Esso offre la possibilità di:
* Trovare l'ultima versione del kernel, scaricarla e decomprimerla.
* Aggiornare una versione attualmente installata del codice sorgente del kernel, applicando le patch necessarie.
* Gestire i diversi rami di sviluppo del kernel, incluse le versioni -mm e -stable
* Scaricare qualsiasi patch o archivio tar necessario per l'aggiornamento, se non già presenti sulla macchina locale.
* Controllare la firma GPG dell'archivio e delle patch per verificarne l'integrità.


ed entrate nella directory linux:
''ketchup'' si trova all'indirizzo ''http://www.selenic.com/ketchup/'' insieme a molta documentazione presente nel wiki ''http://www.selenic.com/ketchup/wiki/''.


<pre>$ cd ~/linux
Di seguito un esempio che illustra quanto sia semplice utilizzare ''ketchup'' per fare scaricare una specifica versione del kernel e '''per passare ad un'altra versione''' con un numero minimo di comandi.'''VERIFICARE LA TRADUZIONE DELLA PARTE IN GRASSETTO [...and then have it switch the directory to another kernel version...]'''
$ ls
linux-2.6.18.8.tar.gz</pre>


Adesso che il codice sorgente si trova nella directory giusta, decomprimetelo:
Per scaricare il sorgente del kernel 2.6.16.24 in una directory, e rinominare la directory perché abbia lo stesso nome della versione del kernel, utilizzare il seguente comando:


<pre>$ tar -xzvf linux-2.6.18.8.tar.gz</pre>
<pre>
$ mkdir foo
$ cd foo
$ ketchup -r 2.6.16.24
None -> 2.6.16.24
Unpacking linux-2.6.17.tar.bz2
Applying patch-2.6.17.bz2 -R
Applying patch-2.6.16.24.bz2
Current directory renamed to /home/gregkh/linux/linux-2.6.16.24
</pre>


Lo schermo si riempir� della lista dei file che verranno decompressi, e alla fine nella directory linux/ rimarr�:
Ora, per aggiornare il sorgente affinché contenga l'ultimo rilascio stabile, digitare:
<pre>
$ ketchup -r 2.6
2.6.16.24 -> 2.6.17.11
Applying patch-2.6.16.24.bz2 -R
Applying patch-2.6.17.bz2
Downloading patch-2.6.17.11.bz2
--22:21:14-- http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.17.11.bz2
=> `/home/greg/.ketchup/patch-2.6.17.11.bz2.partial'
Resolving www.kernel.org... 204.152.191.37, 204.152.191.5
Connecting to www.kernel.org|204.152.191.37|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 36,809 (36K) [application/x-bzip2]
100%[====================================>] 36,809 93.32K/s
22:21:14 (92.87 KB/s) - `/home/greg/.ketchup/patch-2.6.17.11.bz2.partial'saved [36809/36809]
Downloading patch-2.6.17.11.bz2.sign
--22:21:14-- http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.17.11.bz2.sign
=> `/home/greg/.ketchup/patch-2.6.17.11.bz2.sign.partial'
Resolving www.kernel.org... 204.152.191.37, 204.152.191.5
Connecting to www.kernel.org|204.152.191.37|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 248 [application/pgp-signature]
100%[====================================>] 248 --.--K/s
22:21:14 (21.50 MB/s) - `/home/greg/.ketchup/patch-2.6.17.11.bz2.sign.
partial' saved [248/248]
Verifying signature...
gpg: Signature made Wed Aug 23 15:01:04 2006 PDT using DSA key ID 517D0F0E
gpg: Good signature from "Linux Kernel Archives Verification Key >
ftpadmin@kernel.org<"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: C75D C40A 11D7 AF88 9981 ED5B C86B A06A 517D 0F0E
Applying patch-2.6.17.11.bz2
Current directory renamed to /home/greg/linux/tmp/x/linux-2.6.17.11
</pre>


<pre>$ ls
linux-2.6.18.8.tar.gz
linux-2.6.18.8/</pre>


Questo esempio mostra come ''ketchup'' determini in modo automatico che la nuova versione stabile del kernel è la 2.6.17.11 e scarichi le patch necessarie per aggiornare il sorgente.
L'uso di ''ketchup'' è vivamente consigliato per scaricare qualsiasi sorgente del kernel di Linux. Esso si occupa di reperire le patch necessarie sul server e applicarle automaticamente nel modo corretto, dopo averne controllato l'autenticità tramite la firma digitale.
L'uso combinato di ''ketchup'' e ''quilt'' permette di avere tutto ciò che serve per gestire il kernel di Linux e per soddisfare le esigenze degli sviluppatori.


----
----
Riga 87: Riga 302:
----
----


[[Categoria:Kernel]]
[http://www.kernel.org/pub/linux/kernel/people/gregkh/lkn/lkn_pdf/appa.pdf ''Capitolo originale'']
 
[[Categoria:Documentazione tecnica]]
[[Categoria:Linux Kernel in a Nutshell]]

Versione attuale delle 13:15, 28 giu 2013

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

Scaricare [da Internet, NdT], compilare, aggiornare e mantenere i sorgenti del kernel Linux comporta diversi passi, come questo libro illustra. Essendo per natura creature pigre, gli sviluppatori hanno creato alcuni programmi a supporto di queste attività di routine. Descriviamo alcuni di tali utili strumenti e le nozioni di base sul loro utilizzo.

Lo sviluppo del kernel Linux differisce per molti aspetti dal tradizionale processo di sviluppo software. A uno sviluppatore del kernel sono richieste alcune attività peculiari:

  • Applicare le modifiche ad un "bersaglio mobile" quale è il kernel, a causa della rapida pianificazione delle versioni di sviluppo.
  • Risolvere i conflitti derivanti dalla fusione del proprio lavoro con quello dagli altri sviluppatori.
  • Esportare i suoi cambiamenti in un formato che permetta agli altri sviluppatori di incorporarli facilmente nel proprio lavoro.

patch e diff

Questa sezione è basata su un articolo pubblicato originariamento su Linux Journal.

Una delle modalità più comuni per lavorare con il kernel è quella di usare i programmi patch e diff. Per usare questi strumenti, sono necessarie due differenti directory: una "pulita" (clean) e una "di lavoro" (indicata con dirty in seguito). La directory clean contiene la versione originale del kernel, mentre quella dirty contiene le modifiche apportate dal programmatore alla stessa release. Utilizzando patch e diff è possibile estrarre i cambiamenti apportati sul sorgente e portarli nella nuova release del kernel.

Per esempio, creiamo due directory contenenti l'ultima versione del kernel come descritto nel Capitolo 3.

$ tar -zxf linux-2.6.19.tar.gz
$ mv linux-2.6.19 linux-2.6.19-dirty
$ tar -zxf linux-2.6.19.tar.gz
$ ls
linux-2.6.19/
linux-2.6.19-dirty/

Ora è possibile apportare tutte le modifiche desiderate al sorgente presente nella directory dirty, lasciando inalterata quella clean. Dopo aver apportato le modifiche, si potrà creare una patch da inviare agli altri sviluppatori tramite i seguenti comandi:

$ diff -Naur -X linux-2.6.19/Documentation/dontdiff linux-2.6.19/ \
linux-2.6.19-dirty/ > my_patch

Questo comando creerà un file dal nome my_patch che conterrà tutti i cambiamenti apportati al sorgente del kernel rispetto alla versione pulita presente nella directory clean. Tale file potrà essere distribuito o inviato ad agli altri sviluppatori via email.


Nuove versioni del kernel

Al rilascio di una nuova versione del kernel, se si desidera portare i cambiamenti su questa nuova versione è necessario applicare la patch ad una versione pulita del kernel. Questo può essere fatto seguendo questi passi:

  • Creare la patch, come illustrato nell'esempio precedente.
  • Utilizzare la patch ufficiale dal sito kernel.org e aggiornare la vecchia versione alla nuova release:
$ cd linux-2.6.19
$ patch -p1 < ../patch-2.6.20
$ cd ..
$ mv linux-2.6.19 linux-2.6.20
  • Aggiornare la directory di lavoro rimuovendo la propria patch e, in seguito, applicando il nuovo aggiornamento:
$ cd linux-2.6.19-dirty
$ patch -p1 -R < ../my_patch
$ patch -p1 < ../patch-2.6.20
$ cd ..
$ mv linux-2.4.19-dirty linux-2.6.20-dirty
  • Provare ad applicare la propria patch al nuovo aggiornamento:
$ cd linux-2.6.20-dirty
$ patch -p1 < ../my_patch

Se l'applicazione della patch provoca dei problemi, è necessario risolvere i conflitti creati (il comando patch informerà circa questi conflitti creando i file .rej e .orig per l'analisi e la correzioni da parte dello sviluppatore). Questo processo di fusione (merge) può rappresentare la parte più difficile dell'intero processo se sono stati apportati cambiamenti a porzioni di codice che sono state modificate anche da altri.

Per applicare correttamente questo processo di sviluppo, consiglio vivamente di utilizzare l'eccellente insieme di programmi patchutils (reperibile qui: http://cyberelk.net/tim/patchutils). Questi programmi permettono di manipolare le patch facilmente e hanno risparmiato agli sviluppatori molte ore di tedioso lavoro.


Gestire le proprie patch con quilt

I programmi patch e diff risultano essere molto utili e funzionali per lo sviluppo del kernel. Ma dopo un certo periodo di utilizzo, molti si stancano di questo modo si procedere nello sviluppo e cercano altra strade che non coinvolgano le noiose attività di pacthing e merging. Fortunatamente, alcuni sviluppatori del kernel hanno realizzato un programma chiamato quilt che gestisce il processo di manipolazione delle patch in modo molto più semplice.

L'idea alla base di quilt discende da un insieme di script di Andrew Morton, realizzati originariamente per gestire il codice del sottosistema di gestione della memoria e, in seguito, utilizzati per l'intero kernel. I suoi script erano legati molto strettamente al processo di sviluppo, ma l'idea sottostante era molto potente. Andreas Gruenbacher ha quindi ripreso questa idea creando quilt.

L'idea principale sottostante quilt è di lavorare con una versione pulita del kernel alla quale aggiungere un insieme di patch. E` possibile inserire e togliere diverse patch dal sorgente e mantenere una lista delle patch in modo molto semplice.

1. Per iniziare, creiamo una directory contenente il sorgente del kernel:

$ tar -zxf linux-2.6.19.tar.gz
$ ls
linux-2.6.19/

2. Spostiamoci in tale directory:

$ cd linux-2.6.19

3. Creiamo una directory patches che conterrà tutte le nostre patch:

$ mkdir patches

4. Tramite quilt creiamo una nuova patch chiamata patch1:

$ quilt new patch1
Patch patches/patch1 is now on top

5. quilt necessita di sapere quali file saranno modificati da questa patch. Per fare questo, utilizziamo il comando add:

$ quilt add Makefile
File Makefile added to patch patches/patch1

6. Apriamo il file Makefile e modifichiamo la linea EXTRAVERSION, salvando poi il file. Alla fine, aggiorniamo la patch tramite quilt:

$ quilt refresh
Refreshed patch patches/patch1

Il file patches/patch1 conterrà una patch con tutti i cambiamenti appena fatti:

$ cat patches/patch1
Index: linux-2.6.19/Makefile
===================================================================
--- linux-2.6.19.orig/Makefile
+++ linux-2.6.19/Makefile
@@ -1,7 +1,7 @@
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 19
-EXTRAVERSION =
+EXTRAVERSION = -dirty
NAME=Crazed Snow-Weasel
# *DOCUMENTATION*

Ora è possibile continuare a lavorare su una patch, o crearne una nuova in testa a quella attuale. Ad esempio, se sono state create tre diverse patch patch1, patch2 e patch3, esse saranno applicate una sopra l'altra. Per vedere la lista delle patch attualmente applicate:

$ quilt series -v
+ patches/patch1
+ patches/patch2
= patches/patch3

Il risultato del comando mostra che tutte e tre le patch sono state applicate e che quella corrente è la patch3. Al rilascio di una nuova versione del kernel, se si vuole portare i cambiamenti effettuati sulla versione precedente anche sulla nuova versione, è possibile utilizzare quilt secondo i seguenti passi:

1. Togliere le patch attualmente applicate al sorgente

$ quilt pop -a
Removing patch patches/patch3
Restoring drivers/usb/Makefile
Removing patch patches/patch2
Restoring drivers/Makefile
Removing patch patches/patch1
Restoring Makefile
No patches applied

2. Utilizzando la patch ufficiale da kernel.org aggiornare la vecchia versione del kernel:

$ patch -p1 < ../patch-2.6.20
$ cd ..
$ mv linux-2.6.19 linux-2.6.20

3. A questo punto, tramite quitl applicare nuovamente le patch sul nuovo sorgente:

$ quilt push
Applying patch patches/patch1
patching file Makefile
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED -- rejects in file Makefile
Patch patches/patch1 does not apply (enforce with -f)

4. Come risultato, le patch non si applicano immediatamente senza problemi. E` possibile forzare l'applicazione della patch e poi procedere alle correzioni necessarie:

$ quilt push -f
Applying patch patches/patch1
patching file Makefile
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED -- saving rejects to file Makefile.rej
Applied patch patches/patch1 (forced; needs refresh)
$ vim Makefile.rej Makefile

5. Dopo aver applicato manualmente la patch, aggiornare la patch:

$ quilt refresh
Refreshed patch patches/patch1

6. Procedere all'applicazione delle altre patch:

$ quilt push
Applying patch patches/patch2
patching file drivers/Makefile
Now at patch patches/patch2
$ quilt push
Applying patch patches/patch3
patching file drivers/usb/Makefile
Now at patch patches/patch3


quilt ha anche delle opzioni che permettono di inviare automaticamente le nuove patch ad un gruppo di persone o a una mailing list, di eliminare specifiche patch all'interno della serie, di ricercare una specifica patch all'interno della serie e molte altre utili opzioni.

quilt è vivamente consigliato per qualsiasi attività di sviluppo del kernel, anche per tenere traccia di poche patch, invece di usare i più ostici diff e patch. E` decisamente più semplice e consente di risparmiare parecchio tempo e sforzi.

Come nota personale, non raccomanderò mai abbastanza l'utilizzo di questo strumento, poiché lo utilizzo tutti i giorni per gestire centinaia di patch in diversi rami di sviluppo. Esso è anche usato da numerose distribuzioni Linux per gestire il proprio kernel e può contare su una comunità di sviluppo entusiasta e reattiva.

git

git è uno strumento di controllo del codice sorgente originariamente scritto da Linus Torvalds quando stava cercando un nuovo sistema di gestione del codice per il kernel di Linux.

È un sistema distribuito che differisce dai sistemi tradizionali di gestione del codice (come ad esempio CVS) nel fatto che non è necessario essere connessi al server per effettuare un commit sul deposito.

git è uno dei più potenti, flessibili e veloci sistemi di gestione del codice sorgente attualmente disponibili, e ha alle spalle un team di sviluppo molto attivo. La pagina principale di git è http://git.or.cz/. Si consiglia ad ogni nuovo utente di seguire le guide pubblicate al fine di familiarizzare con la modalità di funzionamento di git, in modo da poterlo utilizzare correttamente.

Il kernel di Linux è sviluppato utilizzando git, e le ultime versioni possono essere trovate all'indirizzo http://www.kernel.org/git/ insieme ad una vasta lista di altri depositi git.

Non è necessario utilizzare git per sviluppare il kernel di Linux, ma è molto utile per tenere traccia dei bug rilevati. Se doveste segnalare un bug agli sviluppatori del kernel, essi potranno richiedevi di utilizzare git bisect al fine di identificare l'esatta modifica che ha causato il bug. In questo caso, potete seguire le indicazioni sulla documentazione di git per capire come procedere.

ketchup

ketchup è uno strumento molto comodo utilizzato per aggiornare una versione del kernel o per passare da una versione all'altra del codice sorgente.

Esso offre la possibilità di:

  • Trovare l'ultima versione del kernel, scaricarla e decomprimerla.
  • Aggiornare una versione attualmente installata del codice sorgente del kernel, applicando le patch necessarie.
  • Gestire i diversi rami di sviluppo del kernel, incluse le versioni -mm e -stable
  • Scaricare qualsiasi patch o archivio tar necessario per l'aggiornamento, se non già presenti sulla macchina locale.
  • Controllare la firma GPG dell'archivio e delle patch per verificarne l'integrità.

ketchup si trova all'indirizzo http://www.selenic.com/ketchup/ insieme a molta documentazione presente nel wiki http://www.selenic.com/ketchup/wiki/.

Di seguito un esempio che illustra quanto sia semplice utilizzare ketchup per fare scaricare una specifica versione del kernel e per passare ad un'altra versione con un numero minimo di comandi.VERIFICARE LA TRADUZIONE DELLA PARTE IN GRASSETTO [...and then have it switch the directory to another kernel version...]

Per scaricare il sorgente del kernel 2.6.16.24 in una directory, e rinominare la directory perché abbia lo stesso nome della versione del kernel, utilizzare il seguente comando:

$ mkdir foo
$ cd foo
$ ketchup -r 2.6.16.24
None -> 2.6.16.24
Unpacking linux-2.6.17.tar.bz2
Applying patch-2.6.17.bz2 -R
Applying patch-2.6.16.24.bz2
Current directory renamed to /home/gregkh/linux/linux-2.6.16.24

Ora, per aggiornare il sorgente affinché contenga l'ultimo rilascio stabile, digitare:

$ ketchup -r 2.6
2.6.16.24 -> 2.6.17.11
Applying patch-2.6.16.24.bz2 -R
Applying patch-2.6.17.bz2
Downloading patch-2.6.17.11.bz2
--22:21:14-- http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.17.11.bz2
=> `/home/greg/.ketchup/patch-2.6.17.11.bz2.partial'
Resolving www.kernel.org... 204.152.191.37, 204.152.191.5
Connecting to www.kernel.org|204.152.191.37|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 36,809 (36K) [application/x-bzip2]
100%[====================================>] 36,809 93.32K/s
22:21:14 (92.87 KB/s) - `/home/greg/.ketchup/patch-2.6.17.11.bz2.partial'saved [36809/36809]
Downloading patch-2.6.17.11.bz2.sign
--22:21:14-- http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.17.11.bz2.sign
=> `/home/greg/.ketchup/patch-2.6.17.11.bz2.sign.partial'
Resolving www.kernel.org... 204.152.191.37, 204.152.191.5
Connecting to www.kernel.org|204.152.191.37|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 248 [application/pgp-signature]
100%[====================================>] 248 --.--K/s
22:21:14 (21.50 MB/s) - `/home/greg/.ketchup/patch-2.6.17.11.bz2.sign.
partial' saved [248/248]
Verifying signature...
gpg: Signature made Wed Aug 23 15:01:04 2006 PDT using DSA key ID 517D0F0E
gpg: Good signature from "Linux Kernel Archives Verification Key >
ftpadmin@kernel.org<"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: C75D C40A 11D7 AF88 9981 ED5B C86B A06A 517D 0F0E
Applying patch-2.6.17.11.bz2
Current directory renamed to /home/greg/linux/tmp/x/linux-2.6.17.11


Questo esempio mostra come ketchup determini in modo automatico che la nuova versione stabile del kernel è la 2.6.17.11 e scarichi le patch necessarie per aggiornare il sorgente.

L'uso di ketchup è vivamente consigliato per scaricare qualsiasi sorgente del kernel di Linux. Esso si occupa di reperire le patch necessarie sul server e applicarle automaticamente nel modo corretto, dopo averne controllato l'autenticità tramite la firma digitale.

L'uso combinato di ketchup e quilt permette di avere tutto ciò che serve per gestire il kernel di Linux e per soddisfare le esigenze degli sviluppatori.


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