LKN: Programmi Utili: differenze tra le versioni

Nessun cambiamento nella dimensione ,  16 mag 2007
m
link corretto
m (link)
m (link corretto)
Riga 1: Riga 1:
''Torna all'indice: [[Linux Kernel in a Nutshell]]''
''Torna all'indice: [[Linux Kernel in a Nutshell]]''
__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.
I precedenti capitoli hanno mostrato come scaricare e compilare il kernel. Ora che si ha un file eseguibile -- con tutti i moduli compilati -- � ora di installare il kernel e provare a fare il boot. In questo capitolo, a differenza dei precedenti, tutti i comandi necessitano di essere eseguiti come utente root. Questo  pu� essere fatto anteponendo ad ogni comando ''sudo'', usando il comando ''su'' per diventare root, oppure accedendo come ''root''.


=='''Quale ramo usare'''==
Per vedere se si ha ''sudo'' installato e gli appropriati diritti di accesso, lanciate:
[[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.
<pre>
  $ sudo ls ~/linux/linux-2.6.17.11/Makefile
  Password:
  Makefile
</pre>


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.
Inserite la vostra password personale al prompt di password, o la password del system administrator (root). La scelta dipende da come il comando di ''sudo'' � stato impostato. Se non ci sono problemi, e si vede una linea che contiene:
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.


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.
<pre> Makefile </pre>
&Egrave; 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.


=='''Dove trovare i sorgenti del kernel'''==
allora potete passare alla prossima sezione.
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]].
Se ''sudo'' non � installato o non si hanno i diritti appropriati, si provi ad usare il comando ''su'':


[[Immagine:kernel.org.png|center|500px|thumb|Figura 3-2: Il sito ufficiale Kernel.org.]]
<pre>
  $ su
  Password:
  # exit
  exit
  $
</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]].
Al prompt della password, inserite la password del system administrator (''root''). Quando ''su'' accetta con successo la password, si trasferiti ad eseguire ognicosa con i pieni privilegi di root. State molto attenti mentre siete ''root'', e fate solo il minimo necessario; dopodich� uscite dal programma per tornare con il vostro utente normale.


[[Immagine:Kernel.org.v2.6.png|center|500px|thumb|Figura 3-3: Directory dei sorgenti per il kernel 2.6]]


&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.
== Usare uno script di installazione di una distribuzione ==


Per scaricare la versione 2.6.17.8 del kernel con <tt>wget</tt> il comando :


<pre>$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.8.tar.gz
Quasi tutte le distribuzioni hanno uno script chiamato ''installkernel'' che pu� essere usato dal sistema di creazione del kernel per installarne uno pronto automaticamente nel giusto posto e per modificare il bootloader cos� che nulla di pi� debba essere fatto dallo sviluppatore *.


<pre>
Le distribuzioni offrono installkernel solitamente in un package chiamato mkinitrd, provate ad installare
questo package se non trovate lo script sulla vostra macchina.
</pre>


-> 'linux-2.6.17.8.tar.gz
Se avete compilato qualsiasi modulo e volete usare questo metodo per installare un kernel, inserite:


Resolving www.kernel.org... 204.152.191.5, 204.152.191.37
'''# make modules_install'''


Connecting to www.kernel.org|204.152.191.5|:80... connected.
Questo installer� tutti i moduli che avete compilato e li metter� nelle appropriate locazioni del filesystem per farli trovare correttamente dal nuovo kernel. I moduli sono posti in ''/lib/modules/kernel_version'', dove per ''kernel_version'' si intende la versione del nuovo kernel che state preparando.


HTTP request sent, awaiting response... 200 OK
Dopo che i moduli sono stati installati con successo, l'immagine principale del kernel deve essere installata:


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


100%[-------------------------------------->] 51,707,742 35.25k/s
Questo causer�:


ETA 00:00
1. Il sistema di creazione del kernel verificher� che il kernel sia stato correttamente costruito.


18:02:48 (47.12 kB/s) - 'linux-2.6.17.8.tar.gz' saved [51707742/51707742]</pre>
2. Il sistema di creazione copier� la parte statica nella directory ''/boot'' e rinominer� l'eseguibile sulla base della versione del kernel.


Per scaricarla con <tt>curl</tt>:
3. Qualsiasi immagine di ramdisk iniziale necessaria verr� creata automaticamente, usando i moduli che sono appena stati installati durante la fase di ''modules_install''.


<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>
4. Al programma di bootloader verr� correttamente notificato che un nuovo kernel � presente, e verr� aggiunto nel giusto menu cos� che l'utente possa selezionarlo la prossima volta che la macchina verr� avviata.


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]].
5. Dopo questo ha finito, il kernel � installato con successo, si pu� tranquillamente riavviare e provare la nuova immagine di kernel. Notare che questa installazione non sovrascrive nessuna vecchia immagine dei kernel, cos� se c'� un problema con la vostra nuova immagine del kernel, il vecchio kernel potr� essere selezionato al boot time.


[[Immagine:Kernel.org_finger_banner.png|center|500px|thumb|Figura 3-4: Ultima versione del kernel.]]
<pre>
* Eccezioni da riportare a questa regola sono Gentoo e altre distribuzioni tipo "from scratch", le quali si
aspettano che l'utente sappia come installare i kernels da solo. Questi tipi di distribuzoni includono la
documentazione su come installare un nuovo kernel, si consulti quest'ultima per l'esatto metodo richiesto.
</pre>


=='''Cosa fare con i sorgenti'''==
== Installazione manuale ==


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:


<pre>$ mkdir ~/linux</pre>
Se la distribuzione non � provvista del comando ''installkernel'', o si desidera semplicemnete fare il lavoro a mano per capire i passi che servono, eccoli qua:


Spostate il codice sorgente nella directory linux:
I moduli devono essere installati:


<pre>$ mv ~/linux-2.6.18.8.tar.gz ~/linux/</pre>
<pre> # make modules_install </pre>


ed entrate nella directory linux:
L'immagine statica del kernel deve essere copiata nella directory /boot. Per un kernel basato su piattaforma i386, fare:


<pre>$ cd ~/linux
<pre>
$ ls
  # make kernelversion
linux-2.6.18.8.tar.gz</pre>
  2.6.17.11
</pre>


Adesso che il codice sorgente si trova nella directory giusta, decomprimetelo:
Notare che la versione del kernel probabilmente sar� differente da quella del vostro. Usate questo valore al posto del testo KERNEL_VERSION nei seguenti passaggi:


<pre>$ tar -xzvf linux-2.6.18.8.tar.gz</pre>
<pre>
  # cp arch/i386/boot/bzImage /boot/bzImage-KERNEL_VERSION
  # cp System.map /boot/System.map-KERNEL_VERSION
</pre>


Lo schermo si riempir� della lista dei file che verranno decompressi, e alla fine nella directory linux/ rimarr�:
Modificate il bootloader in modo che conosca il nuovo kernel. Questo implica modificare il file di configurazione per il bootloader che si usa, � spiegato pi� avanti in "Modificare il bootloader per il nuovo kernel" in GRUB e LILO.


<pre>$ ls
Se il processo di avvio non funziona, solitamente � perch� una immagine iniziale di ramdisk (initial ramdisk) �  necessaria. Per crearla correttamente, si usino i passi all'inizio di questo capitolo per installare un kernel automaticamente, poich� lo script di installazione della distribuzione sa come creare adeguatamente il ramdisk usando gli scripts e gli strumenti necessari. Dato che ogni distribuzione fa questo in maniera differente, � oltre lo scopo di questo libro ricoprire tutti i differenti metodi di costruzione dell'immagine di ramdisk.
linux-2.6.18.8.tar.gz
 
linux-2.6.18.8/</pre>
Qui c'� uno script agevole che pu� essere usato per installare un kernel automaticamente invece di dover digitare tutti i precedenti comandi ogni volta:
 
<pre>
  #!/bin/sh
  #
  # installs a kernel
  #
  make modules_install
 
  # find out what kernel version this is
  for TAG in VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION ; do
    eval `sed -ne "/^$TAG/s/ //gp" Makefile`
  done
  SRC_RELEASE=$VERSION.$PATCHLEVEL.$SUBLEVEL$EXTRAVERSION
 
  # figure out the architecture
  ARCH=`grep "CONFIG_ARCH " include/linux/autoconf.h | cut -f 2 -d "\""`
 
  # copy the kernel image
  cp arch/$ARCH/boot/bzImage /boot/bzImage-"$SRC_RELEASE"
 
  # copy the System.map file
  cp System.map /boot/System.map-"$SRC_RELEASE"
 
  echo "Installed $SRC_RELEASE for $ARCH"
</pre>
 
 
==  Modificare il bootloader per il nuovo kernel ==
 
 
Esistono due bootloader comuni per i kernel Linux: GRUB e LILO. GRUB � quello maggiormente usato nelle distribuzioni moderne, e fa' alcune cose un po' pi� facilmente di LILO, ma LILO � tuttora anch'esso utilizzato. Li vedremo entrambi in questa sezione.
 
Per determinare quale bootloader il vostro sistema usa, guardate nella directory ''/boot/''. Se esiste una sottodirectory ''grub'':
 
<pre>
  $ ls -F /boot | grep grub
  grub/
</pre>
 
allora si sta utilizzando GRUB come programma per fare il boot. Se questa directory non � presente, si guardi se � presente il file ''/etc/lilo.conf'':
 
<pre>
  $ ls /etc/lilo.conf
  /etc/lilo.conf
</pre>
 
se � presente, state usando LILO come programma per fare il boot.
I passi che implicano l'aggiunta del nuovo kernel a ognuno di questi programmi sono differenti, per cui si segua solo la sezione che corrisponde al programma che si sta usando.
 
==='''GRUB'''===
 
Per fare in modo che GRUB sappia che un nuovo kernel � presente, tutto ci� che dovete fare � modificare il file ''/boot/grub/menu/lst''. Per i dettagli completi della struttura di questo file, e tutte le differenti opzioni disponibili, consultate le pagine di info di GRUB:
 
 
'''$ info grub'''
 
 
Il metodo pi� veloce per aggiungere una nuova voce kernel a ''/boot/grub/menu.lst'' � quello di copiare una voce gi� esistente. Per esempio, considerate il seguente ''menu.lst'' da un sistema Gentoo:
 
<pre>
  timeout 300
  default 0
 
  splashimage=(hd0,0)/grub/splash.xpm.gz
 
  title 2.6.16.11
    root (hd0,0)
    kernel /bzImage-2.6.16.11 root=/dev/sda2 vga=0x0305
 
  title 2.6.16
    root (hd0,0)
    kernel /bzImage-2.6.16 root=/dev/sda2 vga=0x0305
</pre>
 
La linea che comincia con la parola title definisce una nuova voce di kernel, in questo modo questo file contiene due voci. Copiate semplicemente un blocco di linee che cominciano con la linea title, come:
 
<pre>
  title 2.6.16.11
    root (hd0,0)
    kernel /bzImage-2.6.16.11 root=/dev/sda2 vga=0x0305
</pre>
 
Dopodich� aggiungete il blocco alla fine del file, e modificate il numero di versione con la nuova versione del nuovo kernel che si � appena installato. Il titolo non ha alcuna importanza, purch� unico, ma visualizzato nel menu di boot, per cui si dovrebbe dargli qualcosa che abbia un significato. Nel nostro esempio, abbiamo installato il kernel 2.6.17.11, per tanto la copia finale del file assomiglier� a:
 
<pre>
  timeout 300
  default 0
 
  splashimage=(hd0,0)/grub/splash.xpm.gz
 
  title 2.6.16.11
    root (hd0,0)
    kernel /bzImage-2.6.16.11 root=/dev/sda2 vga=0x0305
 
  title 2.6.16
    root (hd0,0)
    kernel /bzImage-2.6.16 root=/dev/sda2 vga=0x0305
 
  title 2.6.17.11
    root (hd0,0)
    kernel /bzImage-2.6.17.11 root=/dev/sda2 vga=0x0305
</pre>
 
Dopo che si � salvato il file, riavviate il sistema e assicuratevi che il titolo della nuova immagine del kernel sia presente nel menu di boot. Usate la freccia verso il basso per evidenziare la versione del nuovo kernel, e premete enter per avviare la nuova immagine.
 
==='''LILO'''===
 
Per fare in modo che LILO sappia che un nuovo kernel � presente, dovete modificare il file di configurazione ''/etc/lilo.conf'' ed eseguire il comando ''lilo'' per applicare le modifiche fatte al file di configurazione. Per i dettagli completi sulla struttura del file di configurazione di LILO, consultate la manpage di LILO:
 
'''$ man lilo'''
 
Il modo pi facile per aggiungere una nuova voce di kernel nel file ''/etc/lilo.conf'' � copiare una voce esistente. Per esempio, considerate il seguente file di configurazione di LILO di un sistema Gentoo:
 
<pre>
  boot=/dev/hda
  prompt
  timeout=50
  default=2.6.12
 
  image=/boot/bzImage-2.6.15
    label=2.6.15
    read-only
    root=/dev/hda2
 
  image=/boot/bzImage-2.6.12
    label=2.6.12
    read-only
    root=/dev/hda2
</pre>
 
La linea che comincia con la parola image= definisce una nuova voce kernel, quindi questo file contiene due voci. Copiate semplicemente un blocco di linee che cominciano con image=, come:
 
<pre>
  image=/boot/bzImage-2.6.15
    label=2.6.15
    read-only
    root=/dev/hda2
</pre>
 
Aggiungete dopo il blocco alla fine del file, e modificate il numero di versione per contenere quella del nuovo kernel appena installato. La label non ha alcuna importanza, purch� unica, ma � visualizzata nel menu di boot, per cui dovreste dargli qualcosa di sensato. Nel nostro esempio, abbiamo installato il kernel 2.6.17.11, per cui la copia finale del file sar�:
 
<pre>
  boot=/dev/hda
  prompt
  timeout=50
  default=2.6.12
 
  image=/boot/bzImage-2.6.15
    label=2.6.15
    read-only
    root=/dev/hda2
 
  image=/boot/bzImage-2.6.12
    label=2.6.12
    read-only
    root=/dev/hda2
 
  image=/boot/bzImage-2.6.17
    label=2.6.17
    read-only
    root=/dev/hda2
</pre>
 
Dopo aver salvato il file, lanciate il programma ''/sbin/lilo'' per salvare i cambiamenti del file di configurazione nella sezione di boot del disco:
 
<pre> # /sbin/lilo </pre>
 
Ora il sistema pu� essere riavviato in sicurezza. La scelta del nuovo kernel si pu� vedere tra le scelte disponibili a boot time. Usate la freccia verso il basso per evidenziare la versione del nuovo kernel, premete Enter per lanciare il boot della nuova immagine.




1 760

contributi