LKN: Installare ed Avviare con un Kernel: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
m (link)
 
(16 versioni intermedie di 6 utenti non mostrate)
Riga 1: Riga 1:
Uno dei punti pi� delicati e difficili nella creazione della propria versione del kernel Linux � quello di determinare esattamente quali driver e quali opzioni di configurazione sono richiesti per il corretto funzionamento dalla macchina su cui viene installato.
{{LKN}}
Questo capitolo guider� il lettore attraverso questo processo di selezione e scelta dei driver corretti.
__TOC__


==Usare un Kernel di una Distribuzione==
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''.


Uno dei metodi pi� semplici, per determinare quali moduli siano necessari, � quello di partire dalla configurazione che viene installata dal pacchetto del kernel della distribuzione che si sta usando. � infatti molto pi� semplice determinare di quali driver si ha bisogno basandosi su quelli installati in un sistema in funzione, in cui i driver corretti sono gi� associati all'hardware in utilizzo.
Per vedere se si ha ''sudo'' installato e gli appropriati diritti di accesso, lanciate:
<pre>
$ sudo ls ~/linux/linux-2.6.17.11/Makefile
Password:
Makefile
</pre>
Inserite la vostra password personale al prompt di password, o la password dell'amministratore di sistema (root). La scelta dipende da come il comando di ''sudo'' è stato impostato. Se non ci sono problemi, e si vede una riga che contiene:
<pre>Makefile</pre>
allora potete passare alla prossima sezione.


Se invece si sta personalizzando un kernel per una macchina sulla quale non � installata una distribuzione Linux, allora conviene partire dalla versione LiveCD di una distribuzione. Questo consente all'utente di far partire Linux sulla macchina in oggetto e di determinare in maniera semplice le opzioni di configurazione del kernel e che consentono il funzionamento ottimale della macchina stessa.
Se ''sudo'' non è installato o non si hanno i diritti appropriati, si provi ad usare il comando ''su'':
<pre>
$ su
Password:
# exit
exit
$
</pre>
Al prompt della password, inserite la password dell'amministratore di sistema (''root''). Quando ''su'' accetta con successo la password, si è trasferiti ad eseguire ogni cosa 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.


===Dove si Trova la Configurazione del Kernel?===
== Usare uno script di installazione di una distribuzione ==
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<sup>*</sup>.


Quasi tutte le distribuzioni prevedono i files di configurazione del kernel quale parte del pacchetto del kernel. Si consiglia di leggere la documentazione relativa alla Distribuzione stessa per sapere dove sono installati i files di configurazione. Solitamente si trova in una subdirectory attaccata a /usr/src/linux/.
[[Image:Warning_65x68.jpg|left|caption]] Le distribuzioni offrono ''installkernel'' solitamente in un pacchetto chiamato ''mkinitrd'', provate ad installare questo pacchetto se non trovate lo script sulla vostra macchina. <br clear=all/>


Se avete difficolt� a trovare la configurazione del kernel, allora guardate nel kernel stesso. Molte distribuzioni implementano i files di configurazione nel kernel stesso, che � incluso nella directory /proc. Potete verificare se state usando una di queste distribuzioni digitando in command-line il seguente comando:
Se avete compilato qualsiasi modulo e volete usare questo metodo per installare un kernel, inserite:
<pre>$ ls /proc/config.gz
<pre># make modules_install</pre>
/proc/config.gz</pre>
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 avete appena compilato.


Se il file ''/proc/config.gz'' presente, allora copiatelo nella directory del sorgente kernel ed estraetelo:
Dopo che i moduli sono stati installati con successo, l'immagine principale del kernel deve essere installata:
<pre># make install</pre>
Ciò farà partire il seguente processo:
# Il sistema di compilazione del kernel verificherà che il kernel sia stato correttamente compilato.
# Il sistema di compilazione copierà la parte statica nella directory ''/boot'' e rinominerà l'eseguibile sulla base della versione del kernel.
# Qualsiasi immagine di ramdisk iniziale necessaria verrà creata automaticamente, usando i moduli che sono appena stati installati durante la fase di ''modules_install''.
# 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.
# 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 tempo d'avvio (''boot time'').


<pre>$ cp /proc/config.gz -/linux/
<small>Nota ('''<sup>*</sup>'''): eccezioni da riportare a questa regola sono Gentoo e altre distribuzioni tipo "from scratch", le quali si
$ cd -/linux
aspettano che l'utente sappia come installare i kernel da solo. Questi tipi di distribuzioni includono la
$ gzip -dv config.gz
documentazione su come installare un nuovo kernel, si consulti quest'ultima per l'esatto metodo richiesto.</small>
config.gz:      74.9% - - replaced with config</pre>
Copiate questo file di configurazione nella vostra directory del kernel e rinominatelo in ''.config''.
Ora potrete utilizzare questo file come base di partenza nella personalizzazione della configurazione del kernel cos� come descritto nel Cap. 4.


Se si usa il file di configurazione in oggetto, allora quale buona norma, si dovrebbe anche sempre creare un'immagine del kernel operativo (funzionante) per la vostra macchina. Lo svantaggio derivante dall'utilizzo di questa immagine � il fatto che si dovr� configurare quasi ogni modulo del kernel e driver che si trova nel sorgente del kernel stesso. Infatti un kernel standard copre un gran numero di macchine e di hardware, questo ci consente di disattivare molti drivers ed opzioni che non vengono utilizzati nel nostro sistema. Si raccomanda comunque di disattivare solo quelle opzioni di cui siamo sicuri al 100% che non vengono utilizzate, ci possono essere infatti elementi del sistema che hanno necessitano di specifiche alla sola apparenza superflue.
== Installazione manuale ==
Se la distribuzione non è provvista del comando ''installkernel'', o si desidera semplicemente fare il lavoro a mano per capire i passi che servono, eccoli qua:


Se il file ''/proc/config.gz'' � presente, allora copiatelo nella directory del sorgente kernel ed estraetelo:
I moduli devono essere installati:
<pre># make modules_install</pre>


<pre>$ cp /proc/config.gz -/linux/
L'immagine statica del kernel deve essere copiata nella directory ''/boot''. Per un kernel basato su piattaforma i386, fare:
$ cd -/linux
<pre>
$ gzip -dv config.gz
# make kernelversion
config.gz:      74.9% - - replaced with config</pre>
2.6.17.11
Copiate questo file di configurazione nella vostra directory del kernel e rinominatelo in ''.config''.
</pre>
Ora potrete utilizzare questo file come base di partenza nella personalizzazione della configurazione del kernel cos� come descritto nel Cap. 4.


Se si usa il file di configurazione in oggetto, allora quale buona norma, si dovrebbe anche sempre creare un'immagine del kernel operativo (funzionante) per la vostra macchina. Lo svantaggio derivante dall'utilizzo di questa immagine � il fatto che si dovr� configurare quasi ogni modulo del kernel e driver che si trova nel sorgente del kernel stesso. Infatti un kernel standard copre un gran numero di macchine e di hardware, questo ci consente di disattivare molti drivers ed opzioni che non vengono utilizzati nel nostro sistema. Si raccomanda comunque di disattivare solo quelle opzioni di cui siamo sicuri al 100% che non vengono utilizzate, ci possono essere infatti elementi del sistema che hanno necessitano di specifiche alla sola apparenza superflue.
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>
# cp arch/i386/boot/bzImage /boot/bzImage-KERNEL_VERSION
# cp System.map /boot/System.map-KERNEL_VERSION
</pre>


===Determinare quali Moduli Siano Necessari===
Modificare 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.


Il tempo di compilazione del file di configurazione, implementato in una distribuzione, � molto lungo, datosi che tutti i diversi driver vengono inizializzati. Si dovrebbe cercare di inizializzare solo i driver per l'hardware presente nel sistema, cos� da ridurre i tempi di compilazione del kernel, inoltre la selezione di alcuni o di tutti i driver nel kernel, consente una riduzione di memoria utilizzata ed in alcune architetture un funzionamento del sistema pi� veloce. Per escludere i driver dal kernel � necessario per� determinare quali moduli sono indispensabili per il funzionamento dell'hardware installato. Attraverso l'utilizzo di due esempi, cercheremo di spiegare come determinare quali driver siano indispensabili al controllo dell'hardware.
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&eacute; lo script di installazione della distribuzione sa come creare adeguatamente il ramdisk usando gli script 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.


Le informazioni che mettono in relazione i dispositivi ai driver presenti nel kernel sono conservate in vari spazi del sistema. Uno degli elementi pi� importanti dove sono salvate queste informazioni � il file di sistema ''sysfs''. All'inizializzazione di Linux ''sysfs'' normalmente dovrebbe essere caricato nella directory ''/sys''. ''sysfs'' consente di dare un'occhiata a come le varie parti del kernel sono legate l'un l'altra, questo lo si deduce grazie ai vari symlink che puntano all'interno dell'intero file di sistema.
Qui c'è uno script comodo 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


In tutti gli esempi di seguito, saranno riportati listati reali di ''sysfs'' e saranno indicati tipi di hardware. La vostra macchina sar� certamente diversa, ma i luoghi relativi dove sono salvate le informazioni sono gli stessi. Non ci si deve allarmare se i nomi di file nel ''sysfs'' non sono i medesimi, rientra nelle aspettative.
# 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


Inoltre, la struttura interna del file di sistema ''sysfs'' cambia costantemente, questo dovuto sia alla riorganizzazione dei dispositivi sia alle revisioni del kernel tese a migliorare l'adattamento delle strutture interne del kernel allo spazio utilizzato. A causa di questo, col tempo, alcuni dei symlink, precedentemente menzionati in questo capitolo, possono non essere presenti. Tuttavia, le informazioni sono ancora tutte presenti, al massimo sono state spostate di qualche riga.
# figure out the architecture
ARCH=`grep "CONFIG_ARCH " include/linux/autoconf.h | cut -f 2 -d "\""`


====Esempio: Come Determinare il Driver di Rete====
# copy the kernel image
cp arch/$ARCH/boot/bzImage /boot/bzImage-"$SRC_RELEASE"


Uno degli elementi pi� comuni ed importanti in un sistema � la carta-interfaccia di rete. � essenziale capire quale driver la controlla ed attivarlo nella configurazione in maniera da consentire un corretto funzionamento delle connessioni di rete.
# copy the System.map file
cp System.map /boot/System.map-"$SRC_RELEASE"


Primo: partendo dalle connessioni di rete si risale ai device PCI
echo "Installed $SRC_RELEASE for $ARCH"
<pre>$ ls /sys/class/net/
</pre>
eth0  eth1  eth2  lo</pre>


La directory ''lo'' rappresenta il dispositivo di rete loopback, e non � dipendente da nessun dispositivo di rete realmente installato. Invece si dovrebbe riservare particolare attenzione alle directory ''eth0'', ''eth1'' e ''eth2'', datosi che si riferiscono a dispositivi realmente esistenti
==  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 è ancora utilizzato. Li vedremo entrambi in questa sezione.


Per determinare approfonditamente di quali dispositivi ci si deve occupare, si utilizza il comando ''ifconfig'':
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.


<pre>$ /sbin/ifconfig -a
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.
eth0 Link  encap:Ethernet  HWaddr 00:12:3F:65:7D:C2
inet  addr:192.168.0.13  Bcast:192.168.0.255  Mask:255.255.255.0
UP BROADCAST NOTRAILERS RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:2720792 errors:0 dropped:0 overruns:0 frame:0
TX packets:1815488 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:3103826486 (2960.0 Mb) TX bytes:371424066 (354.2 Mb)
Base address:0xdcc0 Memory:dfee0000-dff00000
eth1 Link  encap:UNSPEC  HWaddr 80-65-00-12-7D-C2-3F-00-00-00-00-00-00-00-00
BROADCAST MULTICAST  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
eth2 Link  encap:UNSPEC  HWaddr 00-02-3C-04-11-09-D2-BA-00-00-00-00-00-00-00
BROADCAST MULTICAST  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
lo Link  encap:Local Lookback
        inet addr:127.0.0.1  Mask:255.0.0.0
UP  LOOPBACK  RUNNING  MTU:16436  Metric:1
RX packets:60 errors:0 dropped:0 overruns:0 frame:0
TX packets:60 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:13409 (13.0 Kb) TX bytes:13409 (13.0 Kb)</pre>


Da questo listato si pu� riconoscere nel dispositivo di rete <tt>eth0</tt>, quello attivo e funzionante, infatti nelle righe;
==='''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:
<pre>$ info grub</pre>


<pre>eth0 Link  encap:Ethernet  HWaddr 00:12:3F:65:7D:C2
Il metodo più facile 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:
inet  addr:192.168.0.13  Bcast:192.168.0.255  Mask:255.255.255.0</pre>
<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


Questo risultato dimostra che il dispositivo Ethernet si vede assegnato un indirizzo IP valido (<tt>inet</tt>).
title 2.6.16
  root (hd0,0)
  kernel /bzImage-2.6.16 root=/dev/sda2 vga=0x0305
</pre>


Ora, dopo che abbiamo individuato il dispositivo <tt>eth0</tt> e ci siamo accertati di volerlo implementare nel nostro nuovo kernel, dobbiamo individuare quale driver lo controlla. Ci� si realizza con una semplice procedura, che � quella si seguire i link nel file di sistema sysfs, basta digitare un comando di una sola riga:
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>


<pre>$ basename `readlink /sys/class/net/eth0/device/driver/module`
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:
e1000</pre>
<pre>
timeout 300
default 0


Il risultato mostra che il modulo <tt>e1000</tt> controlla il dispositivo di rete <tt>eth0</tt>. Il comando ''basename'' racchiude in un'unica linea di comando i seguenti passaggi:
splashimage=(hd0,0)/grub/splash.xpm.gz


: 1. Individua il symlink ''/sys/class/net/eth0/device'' contenuto all'interno della directory ''/sys/device/'', la quale contiene le informazioni relative al dispositivo che controlla ''eth0''. Fate attenzione al fatto che nelle nuove versioni del kernel la directory ''/sys/class/net/eth0'' potrebbe essere un symlink.
title 2.6.16.11
  root (hd0,0)
  kernel /bzImage-2.6.16.11 root=/dev/sda2 vga=0x0305


: 2. All'interno della directory che descrive il dispositivo in sysfs, c'� un symlink che punta al driver relativo a questo dispositivo. Questo symlink � nominato ''driver'', pertanto si segue questo collegamento.
title 2.6.16
  root (hd0,0)
  kernel /bzImage-2.6.16 root=/dev/sda2 vga=0x0305


: 3. All'interno della directory che descrive il driver in sysfs, c'� un symlink che punta al modulo che si trova all'interno del driver in oggetto. Questo symlink � chiamato <tt>module</tt>. Noi cerchiamo l'oggetto a cui punta questo symlink, per ottenerlo ci serviamo del comando ''readlink'', il quale produce un risultato simile a questo:
title 2.6.17.11
: <pre>$ readlink /sys/class/net/eth0/device/driver/module
  root (hd0,0)
../../../../module/e1000</pre>
  kernel /bzImage-2.6.17.11 root=/dev/sda2 vga=0x0305
</pre>


: 4. Datosi che a noi interessa solo il nome del modulo e ci disinteressiamo del resto del risultato ottenuto con il comando ''readlink'', tenendo solo la parte pi� a destra del risultato. Questo � appunto ci� che il comando ''basename'' realizza. Esercitandolo direttamente sull'intero percorso, questo comando ci ritorna quanto segue:
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.
: <pre>$ basename ../../../../module/e1000
e1000</pre>


Cos� abbiamo inserito il lungo risultato del symlink, ottenuto da ''readlink'', quale parametro nel programma ''basemane'', permettendo cos� l'intero processo di essere realizzato in una sola riga.
==='''LILO'''===
Ora che abbiamo identificato il nome del modulo, si dovrebbe trovare l'opzione della configurazione del kernel che lo controlla. Si pu� cercare nei vari menu di configurazione dei dispositivi di rete oppure cercare nel codice sorgente del kernel stesso per essere sicuri di avere l'opzione giusta.
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:
<pre>$ cd ~/linux/linux-2.6.17.8
<pre>$ man lilo</pre>
$ find -type f -name Makefile | args grep e1000
./drivers/net/Makefile:obj-$(CONFIG_E1000) += e1000/
./drivers/net/e1000/Makefile:obj-$(CONFIG_E1000) += e1000.o
./drivers/net/e1000/Makefile:e1000-objs := e1000_main.o e1000_hw.o e1000_ethtool.o e1000_param.o</pre>


Si precisa che "e1000'', usato in questo esempio, deve essere sostituito con il nome del modulo che state analizzando.
Il modo pi&ugrave; 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 al momento del boot. Usate la freccia verso il basso per evidenziare la versione del nuovo kernel, premete Invio per avviare la nuova immagine.
 
 
----
This is an indipendent translation of the book [http://www.kroah.com/lkn/ Linux Kernel in a Nutshell] by [http://www.kroah.com/log/ Greg Kroah-Hartman]. This translation (like the original work) is available under the terms of [http://creativecommons.org/licenses/by-sa/2.5/ Creative Commons Attribution-ShareAlike 2.5].
----
 
 
[http://files.kroah.com/lkn/lkn_pdf/ch05.pdf ''Capitolo originale'']
 
 
[[Categoria:Documentazione tecnica]]
[[Categoria:Linux Kernel in a Nutshell]]

Versione attuale delle 12:39, 14 mag 2016

Linux Kernel in a Nutshell

Sommario

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

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.

Per vedere se si ha sudo installato e gli appropriati diritti di accesso, lanciate:

$ sudo ls ~/linux/linux-2.6.17.11/Makefile
Password:
Makefile

Inserite la vostra password personale al prompt di password, o la password dell'amministratore di sistema (root). La scelta dipende da come il comando di sudo è stato impostato. Se non ci sono problemi, e si vede una riga che contiene:

Makefile

allora potete passare alla prossima sezione.

Se sudo non è installato o non si hanno i diritti appropriati, si provi ad usare il comando su:

$ su
Password:
# exit
exit
$

Al prompt della password, inserite la password dell'amministratore di sistema (root). Quando su accetta con successo la password, si è trasferiti ad eseguire ogni cosa 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.

Usare uno script di installazione di una distribuzione

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

caption

Le distribuzioni offrono installkernel solitamente in un pacchetto chiamato mkinitrd, provate ad installare questo pacchetto se non trovate lo script sulla vostra macchina.

Se avete compilato qualsiasi modulo e volete usare questo metodo per installare un kernel, inserite:

# make modules_install

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 avete appena compilato.

Dopo che i moduli sono stati installati con successo, l'immagine principale del kernel deve essere installata:

# make install

Ciò farà partire il seguente processo:

  1. Il sistema di compilazione del kernel verificherà che il kernel sia stato correttamente compilato.
  2. Il sistema di compilazione copierà la parte statica nella directory /boot e rinominerà l'eseguibile sulla base della versione del kernel.
  3. Qualsiasi immagine di ramdisk iniziale necessaria verrà creata automaticamente, usando i moduli che sono appena stati installati durante la fase di modules_install.
  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.
  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 tempo d'avvio (boot time).

Nota (*): 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 kernel da solo. Questi tipi di distribuzioni includono la documentazione su come installare un nuovo kernel, si consulti quest'ultima per l'esatto metodo richiesto.

Installazione manuale

Se la distribuzione non è provvista del comando installkernel, o si desidera semplicemente fare il lavoro a mano per capire i passi che servono, eccoli qua:

I moduli devono essere installati:

# make modules_install

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

  
# make kernelversion 
2.6.17.11

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:

# cp arch/i386/boot/bzImage /boot/bzImage-KERNEL_VERSION
# cp System.map /boot/System.map-KERNEL_VERSION

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

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

Qui c'è uno script comodo che può essere usato per installare un kernel automaticamente invece di dover digitare tutti i precedenti comandi ogni volta:

#!/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"

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 è ancora utilizzato. Li vedremo entrambi in questa sezione.

Per determinare quale bootloader il vostro sistema usa, guardate nella directory /boot/. Se esiste una sottodirectory grub:

$ ls -F /boot | grep grub
grub/

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:

$ ls /etc/lilo.conf
/etc/lilo.conf

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ù facile 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:

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

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:

title 2.6.16.11
  root (hd0,0)
  kernel /bzImage-2.6.16.11 root=/dev/sda2 vga=0x0305

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:

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

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:

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

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:

image=/boot/bzImage-2.6.15
  label=2.6.15
  read-only
  root=/dev/hda2

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à:

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

Dopo aver salvato il file, lanciate il programma /sbin/lilo per salvare i cambiamenti del file di configurazione nella sezione di boot del disco:

# /sbin/lilo

Ora il sistema può essere riavviato in sicurezza. La scelta del nuovo kernel si può vedere tra le scelte disponibili al momento del boot. Usate la freccia verso il basso per evidenziare la versione del nuovo kernel, premete Invio per avviare la nuova immagine.



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