Alessio Biancalana Grab The Blaster di Alessio Biancalana

Compilazione del kernel Linux - Debian-way.

Aggiornamento (9 lug 2008): Aggiunta piccola postilla su come fixare gli headers del kernel. Grazie a telperion.

Aggiornamento (5 apr 2008): Effettivamente, come riportato da scimmia, per chi ricompila è meglio aggiungere make oldconfig.

Aggiornamento (4 apr 2008): Aggiornata la guida con alcuni piccoli consigli di LuNa

Questa è una piccola chicca che mancava nel panorama delle varie guide che propongo; non mi soffermerò a lungo nel descrivere i comandi perchè si suppone che se una persona ricompila il kernel, sia un pochino addentrata nel mondo linux e quindi sappia quello che sta facendo.

Innanzi tutto bisogna scaricare gli ultimi sorgenti del kernel Linux che andremo a compilare, e siccome io voglio fare sempre il super figo di turno che ha l'ultimo kernel disponibile sulla piazza iper aggiornato e mega alleggerito, andremo a scegliere l'ultima relase disponibile. Nella guida utilizzerò sudo anzichè su, perchè nella mia box utilizzo sudo, che ritengo migliore.

Prima però di scaricare, spostare, linkare, compilare e chi più ne ha più ne metta, installiamo le dipendenze necessarie:

sudo apt-get install build-essential kernel-package libncurses-dev linux-kernel-headers

Scaricheremo così tutto quello che ci serve per la compilazione. Se vogliamo configurare il kernel tramite xconfig o gconfig, abbiamo bisogno rispettivamente delle librerie di sviluppo QT o GTK, a seconda del caso.

A questo punto andiamo a prelevare il kernel Linux dal sito www.kernel.org; nella prima pagina ci viene chiarito tutto il possibile sulle versioni, quindi scelgiamo l'ultima stable (visto che non siamo suicidi, e non vogliamo compilare Linux instabile), e copiatone l'indirizzo dalla "F" che vi si trova accanto, spostiamoci in /usr/src e scarichiamo lì i nostri sorgenti:

cd /usr/src
sudo wget http://www.kernel.org/pub/linux/kernel/v2.$numero/linux-$versione_kernel.tar.bz2

Comparirà quindi la famigerata barra d'avanzamento di wget. Una volta finito il download, diamo nel terminale un bel

sudo tar jxvf linux-$versione_kernel.tar.bz2

Ricordiamo che siamo fuori dalla nostra home, quindi mai omettere sudo.

Adesso, per semplicità, linkiamo la directory appena creata ad una immaginaria che riporta dentro quest'ultima, di nome "linux". In questo modo il percorso dei sorgenti sarà /usr/src/linux-$versione_kernel, anche abbreviabile in /usr/src/linux.

sudo ln -s linux-2.6.19.1 linux

Spostiamoci dunque nella directory per andare poi a compilare.

cd linux

Adesso puliamo i sorgenti da residui di altre compilazioni. Se è la prima volta che compiliamo possiamo anche omettere questo passo:

sudo make-kpkg clean

Una volta completata la pulitura del codice, andiamo dunque a configurare tutto il necessario per far funzionare il nostro kernel in modo leggero e scattante.

sudo make oldconfig

Comando da non dare necessariamente. Personalmente, credo che nella prima compilazione non serva poi a molto; ma andiamo prima a spiegare cosa effettivamente fa: make oldconfig configura il kernel in base ai parametri di quello che si sta usando. È molto utile in caso di molte compilazioni, infatti mettiamo che io dopo questo kernel debba ricompilare per fare il figo con un'eventuale ultima versione ancora più recente. Dando make oldconfig potrò importare la mia vecchia configurazione evitandomi la rogna di disattivare moduli già eliminati in precedenza. Io credo che questo aiuti anche un processo di scrematura crescente, in quanto vedo che ad ogni ricompilazione cresce il livello di consapevolezza di quello che serve o non serve. Con make oldconfig posso far ripartire la scrematura dal punto in cui l'avevo interrotta, con la sola aggiunta delle novità, che potrò disattivare sotto forma di domanda in seguito. Per chi invece compila per la prima volta, l'oldconfig non credo serva a molto; in fondo i kernel precompilati delle varie distribuzioni cercano di adattarsi a qualsiasi utilizzo e macchina, quindi le loro configurazioni sono molto standardizzate e non penso che vi sia stato tolto qualcosa. Anzi, in questi casi solitamente si aggiunge roba esterna.

sudo make menuconfig

Questo comando presenterà un'interfaccia ncurses, ma personalmente preferisco qualcosa di grafico che rende di più l'idea di quello che debbo settare, quello che manca, quello che ho già fatto... quindi utilizzo xconfig. Gconfig credo sia molto immaturo rispetto alla sua controparte QT, quindi consiglio xconfig anche agli gnomer come me. Da notare che entrambe le interfacce grafiche hanno bisogno delle rispettive librerie di sviluppo.

Per configurare il kernel Linux non è necessario avere nessun requisito particolare; bisogna solo conoscere molto bene il proprio hardware, questo se si intende fare una scrematura consistente dei moduli disponibile, e snellire in modo ingente il kernel; se non si possiede un'estrema conoscenza dell'hardware (io stesso non sono un grande conoscitore del mio computer parte per parte), si può comunque tantare una densa scrematura, anche se non andando in profondità, poichè si rischia di eliminare qualche pezzo di kernel fondamentale. Il risultato, eliminando parti vitali del kernel, sarà l'immancabile Kernel Panic.

Il secondo requisito è la pazienza di Giobbe, per due motivi: per quanto riguarda il primo, nel mio caso il kernel ci mette un'ora buona a compilare tutto. Se si sbaglia e si va in kernel panic, si deve ricompilare tutto da capo, e quindi significa che abbiamo buttato un'ora per un kernel che non funziona. Il secondo motivo lo si capisce subito guardando la lista dei moduli: in questo caso, per una scrematura di buon livello, si impiega una mezz'ora. La lista è veramente gigante ed include l'ultimo hardware, comanche dei driver vecchi di dieci anni come quelli per le EEPROM.

Abbiamo configurato tutto? Ma proprio tutto, non omettendo nulla? Ok, è ora quindi di passare all'effetiva compilazione alla cui conclusione vi è l'automatico impacchettamento del kernel, in un pacchetto installabile comodamente con dpkg. Facile eh? :D

Puliamo ancora.

sudo make-kpkg clean

A questo punto vi è il comando cruciale, nel quale io, andando a memoria, dimentico sempre qualcosa: questo infatti compila e impacchetta il kernel secondo le opzioni che gli vengono date.

sudo make-kpkg --revision 1.bt --append-to-version -bt --initrd kernel_image kernel_headers

Soffermiamoci dunque a vedere che significa quello che abbiamo appena digitato.

--revision 1.bt assegna un numero di revisione al mio kernel impacchettato, in modo che io abbia tutte le mie versioni belle numerate e catalogate, secondo ordine crescente. Può essere tranquillamente cambiato.

--append-to-version -bt cambierà nome al kernel, infatti dopo la versione ci sarà il mio suffisso -bt. Esempio: 2.6.22-bt. Anche questo può essere cambiato, mettendo qualunque cosa dopo il trattino.

--initrd dice a make-kpkg di creare per il kernel compilato anche una immagine initial ram disk. Questa è fondamentale per chi, come me, dimentica di settare qualcosa come statico invece che come modulare. Senza initrd possono capitare due cose: avete settato quello che c'era da settare come statico, e va tutto liscio, con anche due secondi in meno al boot, o vi viene restituito un Panic grosso come una casa. Ciò è dovuto al fatto della mancata impostazione come statici dei moduli che provvedono al controllo del disco fisso. Se siete guru della compilazione kernel, omettete l'initrd... ma io non posso farne a meno: senza initrd il mio PC non parte :D

kernel_image e kernel_headers compilano e pacchettizzano rispettivamente kernel e headers del kernel. Non c'è molto da descrivere, è così e basta :)

Se volete, potete anche inserire un modules_image, che compilerà eventuali moduli inseriti a parte e non in mainline.

Una volta lanciato il comando, liberate la ram e attendete guardando una puntata de "La Signora in Giallo" o leggendo un fumetto. Ogni tanto guardate cosa sta facendo il terminale, tanto per essere sicuri che non dia qualche tipo di errore; circa un'ora dopo tornate a vedere come siete messi. Se ha finito di fare le sue cose, date questi due comandi:

cd ..
sudo dpkg -i *.deb

Il primo ci sposterà in /usr/src, perchè come sanno bene i pacchettizzatori, i pacchetti deb vengono creati nel livello superiore. Non chiedetemi perchè, visto che non lo so.

Il secondo comando installerà il nostro bel kernel compilato di fresco, e aggiornerà GRUB permettendoci così al riavvio di scegliere il nostro kernel con il nostro suffisso customizzato. :D

Telperion mi ha inoltre segnalato che i kernel_headers prodotti da kernel package ultimamente non vanno. Per fixare possiamo benissimo usare la sua guida.

Se fila tutto liscio fino a GDM (o KDM), possiamo dire di aver compilato un kernel funzionante! Auguri a chi compila per la prima volta!

----------------------------------------------------------

P.S.: I comandi sono presi e liberamente interpretati dalla guida del bravo imu, la quale però mancava dell'initrd e di alcune chicche come il sudo :)

comments powered by Disqus

Member of

Previous Random Next