[Linuxtrent] Re: kernel howto for dummies

  • From: Flavio Stanchina <flavio@xxxxxxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Mon, 13 Nov 2006 02:05:32 +0100

Thomas wrote:
> è una serie di dubbi che mi sono affiorati spesso e che ieri si sono
> manifestati con devastante concretezza....

Trovi tutte le risposte in rete, ad esempio qui:

http://www.linuxdocs.org/HOWTOs/Kernel-HOWTO.html (è antica, fa riferimento
ai kernel 2.0 e 2.2, ma molti dei concetti sono rimasti uguali)

http://www.digitalhermit.com/linux/Kernel-Build-HOWTO.html

http://www.tux.org/lkml/

Il kernel di Linux è un software complesso, vasto e per molti aspetti
peculiare: capirne la struttura generale non è banale, per non parlare dei
dettagli di tutti i sottosistemi che lo compongono. I tuoi dubbi sono
assolutamente legittimi, a maggior ragione visto che se ricordo bene non
vivi facendo il programmatore.

> kernel-source-2.6.x ------> sono i sorgenti del kernel (con le patch
> debian) che servono per qualunque attività di compilazione
> (dell'intero kernel oppure anche di soli moduli). [...]

Noto che la maggior parte dei tuoi dubbi ruotano attorno ai moduli.

Un modulo corrisponde ad un driver o comunque ad un componente opzionale
del kernel che può essere incluso o meno nella compilazione senza intaccare
le funzionalità di base del kernel, salvo ovviamente la periferica o la
funzionalità gestita da quello specifico modulo. La maggior parte dei
moduli possono essere sia compilati come moduli in senso stretto, ossia
come file fisicamente distinti dal kernel vero e proprio che verranno
caricati secondo necessita, sia come parte integrante del kernel stesso. Le
due alternative sono sostanzialmente equivalenti, con l'importantissima
eccezione dei driver che servono al kernel per fare il boot, ad es. il
driver del controller ed il file system sul quale sta la root, oppure il
driver della scheda di rete se la macchina fa il boot da rete. Se questi
moduli non sono compilati nel kernel, avrai bisogno di un initrd; al giorno
d'oggi, vista l'enorme quantità di driver supportati dal kernel, includere
i driver di tutti i controller e di tutti i file system produrrebbe un
kernel enorme, quindi i kernel standard delle distribuzioni compilano tutto
come moduli ed usano un corposo initrd. Se ti compili il kernel da te, puoi
includere i driver necessari nel kernel e fare a meno dell'initrd.

Bisogna poi fare una distinzione tra i moduli distribuiti con il kernel
ufficiale ed eventuali moduli esterni, ad es. (su i386) i driver
proprietari di ATI o nVidia o i moduli di VMware. Questi ultimi ovviamente
non possono essere compilati come parte del kernel, ma solo come moduli
esterni.

> linux-image-2.6.x----> è l'immagine del kernel....., cioè
> l'eseguibile, il binario? insomma è il kernel che sta attualmente
> girando nella macchina, [...]

Giusto. Inoltre, nel package sono inclusi tutti i moduli compilati come
file separati.

> Se ho bisogno di ricompilare il kernel, o di aggiungerci un
> modulo che non c'è, compilo i sorgenti ed ottengo una nuova immagine,
> giusto? 

Giusto, se con "aggiungere un modulo" intendi semplicemente abilitare un
modulo che non era stato abilitato nella configurazione originale.

Se vuoi compilare il modulo come parte del kernel, naturalmente dovrai
reinstallare il kernel vero e proprio, il file "vmlinuz"; se invece vuoi
compilare il modulo come file separato, in genere è possibile abilitare il
singolo modulo ed installare il file risultante, però talvolta abilitare un
modulo comporta delle modifiche alla configurazione del kernel e diventa
necessario ricompilare l'intero kernel.

> se non voglio ricompilarlo, aptgetto una versione giù compilata che è
> appunto una linxu-immage-nuova versione. facendo così poi devo
> ricompilare i moduli, o qualcosa del genere?

Devi ricompilare solo eventuali moduli esterni al kernel,

> linux-headers-2.6.xxx------> sono gli headers e servono per fare
> compilare un moduleo "out of the tree"?!?!? sinceramente non ho capito
> cosa sono e a che servono.

Sono gli header (file .h), i file di configurazione, qualche script e
qualche programmino prodotti dalla compilazione del kernel. Servono a
compilare i moduli esterni di cui sopra.

> Chiarite queste 3 questioni preliminari passiamo ad un caso pratico.
> 
> 
> Ho appena installato sulla mia macchina un distro linux (poniamo
> debian, che è quella che uso) e ho un kernel che voglio aggiornare
> perchè nella versione attuale non sopporta un modulo per una scheda
> wireless usb (esempio a caso... ;-)
> 
> 1. mi servono i sorgenti percui faccio
> #apt-get install kernel-source-2.6.versionechemiserver
> devo aptgettare anche linux-image e linux-header (versionechemiserve)
> o è sufficiente il source che poi compilerò?

Se esiste il package linux-source-x.y.z che ti serve, in genere esisterà
già il corrispondente linux-image-x.y.z (o più d'uno), quindi ti basterà
installare quello. Vedi risposta successiva.

> E' consigliato scaricare il kernel con apt-get o direttamente da
> kernel.org?

Dipende da un po' di cose.
* Di solito le nuove versioni del kernel arrivano in Debian con qualche
  giorno di ritardo, quindi se vuoi provare subito una nuova feature
  devi scaricarti e compilarti i sorgenti originali da kernel.org.
* I kernel che trovi in Debian contengono patch e bug fix non ancora
  inclusi nel kernel ufficiale: se ne hai bisogno, ovviamente è più
  facile installare un kernel già pronto che patchare i sorgenti.
* D'altra parte, dai kernel Debian sono stati tolti alcuni driver o
  pezzi di firmware incompatibili con i criteri di distribuzione di
  Debian; se ne hai bisogno, fai prima a ricompilare i sorgenti
  ufficiali che a ripristinare i pezzi mancanti.

> 2. ho trovato molti howto su come configurare e poi compilare e poi
> innstallare il kernel. per debian-ppc questa in particolare [...]
> posso farvi affidamento? [...]

Eh... puoi farci affidamento se dopo aver seguito le istruzioni la tua
macchina fa ancora il boot. ;)

> Questa cosa dei moduli, a me non mi è chiara. So che il kernel è
> composto da moduli, che possono essere caricati o meno. Quando compilo
> una nuova versione del kernel devo anche compilare i moduli, con
> qualcosa del tipo make depmod o robe del genre? Se lo faccio e poi
> voglio bootare con il vecchio kernel avro problemi di versione dei
> vari moduli?

Per la cronaca, il comando è "make modules", seguito da "make
modules_install" per installarli.

I moduli del kernel versione x.y.z vengono installati in /lib/modules/x.y.z
quindi puoi installare tutte le versioni del kernel che vuoi, ciascuna con
i propri moduli. Si può anche aggiungere una stringa arbiraria chiamata
EXTRAVERSION alla versione del kernel, ad es. "-paperino" per far sì che i
moduli vadano in "/lib/modules/x.y.z-paperino". In questo modo puoi anche
installare vari kernel della stessa versione ma configurati diversamente.

> indipendentemente da come si compila il kernel (debian-way o in
> maniera classica, e che so io)
> viene creata un immagine del kernel, un vmlinuz-versione (cosa è?) e
> un initrd.img-versione (cosa è?), i quali 2 ultimi vegnono messi
> automaticamente in /boot e simbolicamente linkati a vmliuz e
> initrd.img, giusto? ovviamente entrambi devono puntare alla stessa
> versione, giusto?

Distinguiamo tra compilazione ed installazione. Il file "vmlinuz" è il file
binario che contiene il kernel vero e proprio; la 'z' in fondo indica che è
compresso, se guardi nella directory dei sorgenti troverai il file
"vmlinux" che è la versione non compressa. Il nome di quel file ha radici
antiche: su Unix l'immagine del kernel si chiamava "vmunix", ma non ricordo
cosa volesse dire il prefisso "vm".

Dopo aver compilato il kernel, bisogna installarlo. Il file "vmlinuz" va
installato in /boot come "vmlinuz-x.y.z-paperino" (rifacendomi all'esempio
precedente) per convenzione; in realtà potresti installarlo dove ti pare se
poi riesci a convincere il boot loader a caricarlo. I moduli invece vanno
obbligatoriamente installati nella cartella /lib/modules del caso perché il
kernel li cercherà lì.

Dopo aver installato i moduli bisogna creare l'initrd che è in pratica un
archivio di tutti i driver necessari per fare il boot. Lascio volentieri ad
altri la spiegazione di cosa contiene l'initrd e in che formato, perché è
un argomento che conosco solo superficialmente.

Dopo aver installato tutti i pezzi, bisogna comunicare al boot loader che
esistono e dove si trovano. I link simbolici servono solo per indicare al
boot loader qual'è la versione preferita del kernel, ma è solo una
convenzione: cambiando opportunamente la configurazione del boot loader
puoi far caricare un kernel con qualsiasi nome.

> per fare in maniera che nel bootloader (nel mio caso yabin) venga
> inserito il nuovo kernel basta fare yabin -v, giusto?

Suppongo sia giusto per yaboot. I vari boot loader hanno requisiti
differenti: alcuni (come Grub) sanno leggere il file system e vanno a
leggersi il kernel al momento del boot, altri (come Lilo) devono essere
eseguiti ogni volta che modifichi un kernel perché non sanno leggere il
file system ma solo i settori fisici del disco, quindi ad ogni modifica del
kernel devono crearsi una tabella che descrive in quale posizione è il kernel.

> il kernel vecchio va automaticamente in old, così se qualcosa è
> compilato male posso sempre bootare con il vecchio kernel?

Di nuovo, questa è una convenzione ma non è necessario che sia così. Quando
installi un nuovo kernel, i link simbolici cambiano ma il kernel precedente
non viene automaticamente disinstallato ne sovrascritto (a meno che tu non
ricompili la stessa versione con la stessa EXTRAVERSION). In modo più o
meno complicato a seconda del boot loader, è possibile ripartire con uno
qualsiasi dei kernel installati.

Uff... vado a dormire... so già che ti verranno più dubbi di quanti ne
abbia chiarito. :)

-- 
Ciao, Flavio

-- 
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con OGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx


Other related posts: