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