<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AlexBio&#039;s Blog &#187; Kernel</title>
	<atom:link href="http://alexbio.ath.cx/category/gnulinux/kernel/feed/" rel="self" type="application/rss+xml" />
	<link>http://alexbio.ath.cx</link>
	<description>/dev/random</description>
	<lastBuildDate>Fri, 19 Mar 2010 20:48:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Kernel Tip: Aggiornare i sorgenti del kernel con ketchup</title>
		<link>http://alexbio.ath.cx/2010/03/18/kernel-tip-aggiornare-i-sorgenti-del-kernel-con-ketchup/</link>
		<comments>http://alexbio.ath.cx/2010/03/18/kernel-tip-aggiornare-i-sorgenti-del-kernel-con-ketchup/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 18:16:53 +0000</pubDate>
		<dc:creator>AlexBio</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Source]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://alexbio.ath.cx/?p=950</guid>
		<description><![CDATA[In questo breve articolo vedremo come utilizzare un comodissimo script per aggiornare i sorgenti del kernel all&#8217;ultima versione disponibile.
Lo strumento di cui sto parlando è ketchup, uno script in python sviluppato da Matt Mackall (manutentore del set di patch -tiny) ed è scaribabile da qui.
Per gli utenti Debian sarà sufficiente un:

# apt-get install ketchup

ketchup permette, [...]]]></description>
			<content:encoded><![CDATA[<p>In questo breve articolo vedremo come utilizzare un comodissimo script per aggiornare i sorgenti del kernel all&#8217;ultima versione disponibile.</p>
<p>Lo strumento di cui sto parlando è ketchup, uno script in python sviluppato da Matt Mackall (manutentore del set di patch -tiny) ed è scaribabile da <a href="http://www.selenic.com/ketchup/">qui</a>.<br />
Per gli utenti Debian sarà sufficiente un:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># apt-get install ketchup</pre></div></div>

<p>ketchup permette, tra le altre cose di:</p>
<ul>
<li>Scaricare e decomprimere l&#8217;ultima versione disponibile del kernel.</li>
<li>Aggiornare una versione locale dei sorgenti, scaricando e applicando le dovute patch.</li>
<li>Controllare le varie firme GPG dei sorgenti.</li>
<li>Gestire i diversi rami (e set di patch) di linux, come -stable, -mm, -ck, -git, ecc&#8230;</li>
</ul>
<p>Per prima cosa è necessario creare una cartella in cui verranno scaricati i sorgenti. La cartella consigliata è &#8216;/usr/src&#8217; (ricordatevi di aggiungervi al gruppo &#8217;src&#8217;), e, una volta lì:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ mkdir dir
$ cd dir</pre></div></div>

<p>Potete ovviamente dare il nome che volete alla cartella, vedremo in seguito che comunque verrà modificato.<br />
Una volta nella cartella è venuto il momento di scaricare i sorgenti, ma prima è necessario decidere quale ramo del kernel utilizzare. Come forse saprete esistono diversi rami di sviluppo del kernel. I principali sono -stable (l&#8217;attuale versione stabile del kernel), -mm (la versione di sviluppo) e -git (l&#8217;ultimo snapshot dal repository git), ognuno di essi ovviamente presenta pregi e difetti, starà poi a voi decidere qual&#8217;è la più indicata (anche se mi sentirei di consigliare vivamente il ramo -stable, che, a meno che non siate sviluppatori, va più che bene).<br />
Esistono inoltre diversi altri rami che rappresentano varie versioni modificate attraverso set di patch, in modo da rivestire particolari campi di applicazione: tra i principali ci sono le patch -rt (real-time), sviluppate da Ingo Molnar, indicate per quei sistemi in cui la latenza deve essere al minimo (vedi ad es <a href="http://alexbio.ath.cx/2009/02/23/registrare-musica-da-chitarra-elettrica-su-linux-parte-1/">registrazioni musicali</a>), le -ck sviluppate da Con Kolivas, ideali per sistemi desktop in cui la responsività (responsiveness, suona meglio in inglese) è molto importante ed altre.<br />
Per ottenere una lista completa e una breve descrizione dei rami supportati da ketchup è sufficiente:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ketchup -l</pre></div></div>

<h4>Scaricare il kernel</h4>
<p>Una volta scelto il ramo (in questo il 2.6 che rappresenta lo -stable) è venuto il momento di scaricarlo, molto semplicemente:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ketchup 2.6</pre></div></div>

<p>Sostituite ovviamente a 2.6 il ramo da voi scelto. &#8220;Questa operazione potrebbe richiedere qualche minuto&#8221; (cit.)</p>
<p>Una caratteristica piuttosto carina di ketchup, è quella di modificare il nome della cartella in cui viene scaricato il codice in base alla versione dello stesso, semplicemente aggiungendo l&#8217;opzione &#8216;-r&#8217; o &#8216;&#45;&#45;rename-directory&#8217;:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ketchup -r 2.6</pre></div></div>

<p>Quindi se prima la cartella si chiamava &#8216;dir&#8217;, ora si chiamerà &#8216;linux-2.6.xx&#8217; dove xx è l&#8217;attuale versione del kernel.<br />
È inoltre possibile scaricare una particolare versione del kernel, come ad esempio la &#8216;2.6.22&#8242; (giusto per prenderne una a caso):</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ketchup -r 2.6.22</pre></div></div>

<p>Una volta scaricata sarà comunque possibile aggiornarla all&#8217;ultima versione, sempre con:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ketchup -r 2.6</pre></div></div>

<p>Tutto molto intuitivo.</p>
<h4>Configurazione</h4>
<p>È anche possibile gestire il comportamento di ketchup attraverso una file di configurazione: &#8216;~/.ketchuprc&#8217;. Le variabili disponibili sono pochine (solo tre) ma risultano più che utili.<br />
Le variabili valide sono:</p>
<ul>
<li>default_tree &#8211; Che permette di impostare il ramo predefinito da cui scaricare il kernel e non sarà più quindi necessario passarlo via linea di comando; nel caso però che venga impostato via command-line verrà data priorità ad esso.</li>
<li>precommand &#8211; Indica un comando da eseguire prima della sincronizzazione dei sorgenti.</li>
<li>postcommand &#8211; Indica un comando da eseguire dopo la sincronizzazione dei sorgenti.</li>
</ul>
<p>Per fare un esempio ecco il mio file &#8216;~/.ketchuprc&#8217;:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">default_tree = <span style="color: #483d8b;">&quot;2.6&quot;</span>
postcommand = <span style="color: #483d8b;">&quot;rm ../linux &amp;&amp; ln -s `pwd` ../linux&quot;</span></pre></div></div>

<p>Come potete vedere il ramo di sviluppo predefinito è il 2.6, mentre la variabile &#8216;postcommand&#8217; è impostata in modo da aggiornare il link simbolico &#8216;/usr/src/linux&#8217; alla nuova cartella (in pratica prima rimuove il vecchio link e poi lo ricrea passando la cartella corrente con &#8216;pwd&#8217;), da usare insieme a &#8216;&#45;&#45;rename-directory&#8217;. La variabile &#8216;precommand&#8217; è invece vuota perchè non mi serve a niente.</p>
<p>Questo è tutto, e come al solito, nel caso vogliate approfondire l&#8217;argomento, vi rimando al manuale:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ man ketchup</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://alexbio.ath.cx/2010/03/18/kernel-tip-aggiornare-i-sorgenti-del-kernel-con-ketchup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Come applicare una patch al ramo stabile del kernel Linux</title>
		<link>http://alexbio.ath.cx/2009/12/16/come-applicare-una-patch-al-ramo-stabile-del-kernel-linux/</link>
		<comments>http://alexbio.ath.cx/2009/12/16/come-applicare-una-patch-al-ramo-stabile-del-kernel-linux/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 16:53:03 +0000</pubDate>
		<dc:creator>AlexBio</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Kernel]]></category>

		<guid isPermaLink="false">http://alexbio.ath.cx/?p=656</guid>
		<description><![CDATA[
Un interessante video by Greg Kroah-Hartman, uno dei maggiori sviluppatori del kernel Linux, su come applicare una patch al ramo stabile (-stable) di Linux. Mostra l&#8217;uso dei diversi strumenti e script utilizzati dagli sviluppatori (ketchup, quilt, git, mutt, patch, ecc&#8230;) rigorosamente da terminale, e come tutto il processo avviene.
Dategli un&#8217;occhiata se vi va, dura una [...]]]></description>
			<content:encoded><![CDATA[<p><object width="500" height="350"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8200182&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=8200182&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="500" height="350"></embed></object></p>
<p>Un interessante video by <a href="http://en.wikipedia.org/wiki/Greg_Kroah-Hartman">Greg Kroah-Hartman</a>, uno dei maggiori sviluppatori del kernel Linux, su come applicare una patch al ramo stabile (-stable) di Linux. Mostra l&#8217;uso dei diversi strumenti e script utilizzati dagli sviluppatori (ketchup, quilt, git, mutt, patch, ecc&#8230;) rigorosamente da terminale, e come tutto il processo avviene.</p>
<p>Dategli un&#8217;occhiata se vi va, dura una decina di minuti, in lingua (scritta) inglese.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbio.ath.cx/2009/12/16/come-applicare-una-patch-al-ramo-stabile-del-kernel-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Virtualizzare Linux con lguest</title>
		<link>http://alexbio.ath.cx/2009/10/16/virtualizzare-linux-con-lguest/</link>
		<comments>http://alexbio.ath.cx/2009/10/16/virtualizzare-linux-con-lguest/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 17:21:04 +0000</pubDate>
		<dc:creator>AlexBio</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Virtualizzazione]]></category>

		<guid isPermaLink="false">http://alexbio.ath.cx/?p=622</guid>
		<description><![CDATA[Introduzione
In questo articolo parlerò nuovamente di una funzione del kernel Linux: se nell&#8217;articolo precedente era kexec, in questo sarà lguest.
lguest non è altro che un hypervisor molto leggero (circa 5000 linee di codice), che permette in modo molto semplice di creare un sistema di paravirtualizzazione (non permette una virtualizzazione completa) con Linux (che è l&#8217;unica [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduzione</h3>
<p>In questo articolo parlerò nuovamente di una funzione del kernel Linux: se nell&#8217;articolo precedente era kexec, in questo sarà lguest.<br />
lguest non è altro che un hypervisor molto leggero (circa 5000 linee di codice), che permette in modo molto semplice di creare un sistema di paravirtualizzazione (non permette una virtualizzazione completa) con Linux (che è l&#8217;unica architettura supportata).<br />
È formato da due parti distinte, una parte kernel, rappresentata da un modulo &#8216;lg&#8217; (è anche possibile compilarlo direttamente nel kernel) che si occupa del lavoro sporco e una parte user-space, l&#8217;hypervisor.</p>
<h3>Funzionamento</h3>
<p>Il funzionamento di lguest è abbastanza semplice da comprendere, in quanto non impiega nessuna tecnica speciale come fanno altri sistemi tipo Xen.<br />
Il cuore di tutto sta nel modulo del kernel che si occupa innanzitutto di allocare una porzione di meoria dinamica del kernel, in cui viene caricato un piccolo hypervisor incaricato di spostarsi dal kernel al sistema guest. Il processo di paravirtualizzazione viene compiuto grazie all&#8217;implementazione di paravirt_ops, che deve essere compilato nel kernel da eseguire come guest. Il modulo del kernel si occupa anche di fornire un&#8217;interfaccia tramite un file speciale posizionato in /dev/lguest. Il client in user-space, per creare un sistema guest, dovrà semplicemente scrivere un comando di inizializzazione in quel file indicando alcuni valori, come ad esempio dove trovare il kernel e la porzione di memoria da utilizzare.</p>
<p>A questo punto il client in user-space si occupa di allocare un tot di memoria virtuale che poi sarà mappata nel sistema guest come memoria fisica. In questa porzione viene caricato il kernel virtualizzato e poi l&#8217;user-space guest (in pratica il filesystem di root del sistema virtualizzato). Un semplice file può essere utilizzato per fornire al sistema guest un&#8217;immagine di un disco gestito dal client che si dovrà preoccuperà di spostare blocchi di dati nella memoria dinamica. Per quanto riguarda la rete, il creatore di lguest consiglia di utilizzare una periferica TAP configurata sul sistema host.<br />
Per far partire il sistema guest, lg modifica opportunamente la page tables del kernel, per fare in modo che il sistema guest appena caricato</p>
<p>Bene o male questo è il funzionamento di lguest. Vediamo ora come mettere queste cose in pratica.</p>
<h3>Root Filesystem</h3>
<p>Iniziamo subito con la creazione di quello che sarà il filesystem di root del sistema guest. Sconsiglio vivamente di utilizzare una partizione esistente in quanto potrebbero sorgere problemi gravi.<br />
Con questo procedimento verrà creato un sistema Debian da zero. È anche possibile trovare in rete immagini di altri sistemi (per quanto ne sappia, il team di Gentoo fornisce immagini di dischi con la distro preinstallata).</p>
<p>Prima di tutto creiamo il file nel quale verrà installato il sistema, come dimensione 1G dovrebbe bastare:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ dd if=/dev/zero of=debian.img bs=1 count=1 seek=1G</pre></div></div>

<p>Creiamo il filesystem:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># mke2fs -j -v debian.img</pre></div></div>

<p>E montiamolo:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># mkdir /mnt/virtual
# mount debian.img /mnt/virtual -o loop</pre></div></div>

<p>(potrebbe essere necessario caricare il modulo per il loopback)</p>
<p>Per installare il sistema base utilizzeremo un tool, debootstrap, che si occupa di scaricare e installare i pacchetti basilari per il nostro sistema. Dopo averlo installato:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># debootstrap --verbose --arch i386 squeeze /mnt/virtual http://debian.fastweb.it/debian</pre></div></div>

<p>Potete ovviamente configurarlo come volete, modificando l&#8217;architettura, la versione di debian e il repository da cui prelevare i pacchetti.</p>
<p>Ora abbiamo un sistema perfettamente funzionante, ma che richiede alcune configurazioni aggiuntive prima di poter essere utilizzato con lguest.<br />
Perciò la prima cosa da fare è entrare nel sistema con chroot:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># chroot /mnt/virtual</pre></div></div>

<p>Da cui:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># apt-get update</pre></div></div>

<p>Per una configurazione terra terra (orario + lingua + password root):</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># dpkg-reconfigure tzdata
# apt-get install locales
# dpkg-reconfigure locales
# passwd root</pre></div></div>

<p>Ora è necessario creare un device a blocchi che verrà utilizzato come console virtuale:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># mknod hvc0 c 229 0</pre></div></div>

<p>e fare in modo che parta all&#8217;avvio modificando il file inittab:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># nano /etc/inittab</pre></div></div>

<p>cambiando le linee che regolano l&#8217;avvio dei terminali:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">1:2345:respawn:/sbin/getty hvc0
#2:2345:respawn:/sbin/getty tty2
#3:2345:respawn:/sbin/getty tty3
#4:2345:respawn:/sbin/getty tty4
#5:2345:respawn:/sbin/getty tty5
#6:2345:respawn:/sbin/getty tty6</pre></div></div>

<p>Per finire creiamo un nuovo utente (chiamatelo pure come vi pare):</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># adduser user</pre></div></div>

<p>E poi usciamo</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># exit</pre></div></div>

<h3>Kernel</h3>
<p>Il modo più semplice per eseguire lguest, come suggerisce il creatore stesso, è utilizzare lo stesso kernel sia come host che come guest.<br />
Abbiamo però bisogno di una configurazione particolare, quindi verificate le seguenti impostazioni nel vostro kernel (se non sono presenti ricompilate):</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">CONFIG_EXPERIMENTAL=y
CONFIG_PARAVIRT=y
CONFIG_LGUEST_GUEST=y
CONFIG_HIGHMEM64G=n
CONFIG_PHYSICAL_ALIGN=0x100000
CONFIG_VIRTIO_BLK=m
CONFIG_VIRTIO_NET=m
CONFIG_TUN=m
CONFIG_LGUEST=m</pre></div></div>

<p>Nella cartella del kernel &#8216;Documentation/lguest&#8217; è presente il client user-space, se non è stato compilato con il kernel, digitate &#8216;make&#8217;.</p>
<p>A questo punto abbiamo tutto il necessario per avviare lguest.</p>
<h3>Let&#8217;s virtualize</h3>
<p>Per prima cosa è necessario caricare il modulo del kernel</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># modprobe lg</pre></div></div>

<p>Dopodichè, sempre dalla cartella di lguest</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># ./lguest [mem] [kernel] --tunnet=[ip] --block=[rootfile] root=/dev/vda</pre></div></div>

<p>Dove:</p>
<ul>
<li>[mem] indica la quantità di memoria da utilizzare in MB</li>
<li>[kernel] il percorso del kernel da usare</li>
<li>[ip] l&#8217;indirizzo di rete da attribuire al sistema guest</li>
<li>[rootfile] il file da usare come root</li>
</ul>
<p>Dopo aver definito root, è possibile indicare altri valori da passare al kernel.</p>
<p>Un esempio di utilizzo:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># ./lguest 64 /boot/vmlinuz-`uname -r` --tunnet=192.168.1.38 --block=debian.img root=/dev/vda ro quiet</pre></div></div>

<p>debian.img starebbe ad indicare il file che abbiamo creato prima, mentre come kernel è stato impostato quello attualmente in uso.</p>
<p>Se tutto è andato per il verso giusto, il nuovo kernel dovrebbe partire.</p>
<h3>Conclusione</h3>
<p>La caratteristica più interessante di lguest è senza dubbio la sua facilità di comprensione e di utilizzo. Essendo scritto in quasi 5000 righe di codice non ha certo funzionalità avanzate da farlo competere con altri grossi progetti di virtualizzazione come Xen o KVM ma è senza dubbio un ottimo punto di partenza per meglio comprendere la virtualizzazione. E comunque non si può certo dire che su Linux manchino soluzioni per la virtualizzazione.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbio.ath.cx/2009/10/16/virtualizzare-linux-con-lguest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Riavviare Linux con kexec</title>
		<link>http://alexbio.ath.cx/2009/10/11/riavviare-linux-con-kexec/</link>
		<comments>http://alexbio.ath.cx/2009/10/11/riavviare-linux-con-kexec/#comments</comments>
		<pubDate>Sun, 11 Oct 2009 11:49:01 +0000</pubDate>
		<dc:creator>AlexBio</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Kernel]]></category>

		<guid isPermaLink="false">http://alexbio.ath.cx/?p=587</guid>
		<description><![CDATA[Introduzione
Su sistemi Linux alcuni dei pochi motivi per cui è necessario riavviare il sistema dipendono principalmente da: a) aggiornamento del kernel, b) crash dello stesso.
Personalmente ho sempre odiato il continuo bisogno di riavvio (spesso immotivato) in seguito ad un qualsiasi aggiornamento di software su sistemi Windows, è stata quindi una bella sorpresa per me scoprire [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduzione</h3>
<p>Su sistemi Linux alcuni dei pochi motivi per cui è necessario riavviare il sistema dipendono principalmente da: a) aggiornamento del kernel, b) crash dello stesso.</p>
<p>Personalmente ho sempre odiato il continuo bisogno di riavvio (spesso immotivato) in seguito ad un qualsiasi aggiornamento di software su sistemi Windows, è stata quindi una bella sorpresa per me scoprire che, come già detto, su Linux i riavvii sono molto rari.</p>
<p>Con l&#8217;aumentare della mia esperienza nell&#8217;uso di Linux, uno dei &#8220;lidi&#8221; su cui la mia curiosità si è posata è stato proprio il kernel. Dopo i miei primi e incerti tentativi di ricompilazione, credo di poter dire di aver raggiunto un ragguardevole livello di esperienza (per quanto un normale utente senza, ancora, nessuna istruzione accademica in materia possa raggiungere). Come a molti utenti Linux a me piace sperimentare, mi sono perciò spesso trovato a ricompilare uno stesso kernel diverse volte prima di raggiungere una configurazione che soddisfacesse pienamente le mie aspettative, e ovviamente a queste ricompilazioni seguivano necessariamente altrettanti riavvii del sistema. Questo fino a scoprire una interessante funzione del kernel Linux (entrata nel ramo principale di sviluppo già da diverso tempo): kexec.</p>
<p>Kexec permette, in poche parole, di riavviare un kernel da uno già in esecuzione senza dover necessariamente riavviare il sistema fisico.</p>
<h3>Linux e il suo boot</h3>
<p>Prima di partire però è necessario fare una piccola parentesi sul sistema di booting di Linux, questo per meglio comprendere come kexec funziona.<br />
Il processo di boot ha due fasi principali, la fase del bootloader e quella del kernel, le quali possono essere suddivise a loro volta in diversi stadi.</p>
<p>La prima delle due, la fase bootloader, inizia quando un computer viene acceso fisicamente. Dopo qualche inizializzazioni, il controllo dell&#8217;avvio viene passato al BIOS (o firmware che dir si voglia), che ha il compito di determinare le varie periferiche connesse (memorie, dischi, ecc&#8230;). Il BIOS si occupa anche di avviare il bootloader dal master boot record (MBR), che, in base alla configurazione, farà decidere all&#8217;utente quale kernel avviare (la cosa è un pò più complicata, ma spiegare nei dettaglia il boot di Linux non è lo scopo di questo articolo). Ed è a questo pounto che si passa alla fase del kernel.</p>
<p>Dopo aver preso il controllo del boot, il kernel si occupa di esaminare le periferiche, caricare i driver necessari e inizializzarle. A questo punto vengono avviati i servizi di sistema che si occupano del resto (montare i filesystem, avviare i termiali, ecc&#8230;).</p>
<p>Per la fase di riavvio, prima di ritornare alla fase del bootloader, vengono prima terminati tutti i processi, smontati i filesystem e scaricati i driver (con conseguente spegnimento delle periferiche).</p>
<h3>Cos&#8217;è kexec?</h3>
<p>Kexec non è altro che una funzione del kernel Linux che permette di avviare un kernel da uno già avviato, saltando completamente la fase del bootloader sopra descritta, rendendo quindi la fase di riavvio molto più veloce. Si occupa, in altre parole, di caricare un nuovo kernel in memoria, terminare quello già in esecuzione e sostituirlo con quello caricato in precedenza.</p>
<p>Kexec si divide in due parti, la parte kernel, compilata direttamente con il kernel, che consiste in una serie di system call, e una parte user-space, chiamata kexec-tools (sono ovviamente necessarie entrambe).</p>
<p>Per verificare che il proprio kernel sia compilato con kexec, è sufficiente cercare nel file .config se la chiave CONFIG_KEXEC è impostata a &#8216;y&#8217;:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ zgrep CONFIG_KEXEC /proc/config.gz</pre></div></div>

<p>oppure</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ grep CONFIG_KEXEC /boot/config-`uname -r`</pre></div></div>

<p>Mentre per la parte userspace è sufficiente installare kexec-tools</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># apt-get install kexec-tools</pre></div></div>

<p>oppure usando il proprio package manager preferito.</p>
<h3>Come funziona?</h3>
<p>Prima di procedere con la parte pratica, vediamo più in dettaglio come funziona kexec. Innanzitutto è necessario sapere che il kernel Linux deve essere avviato da una posizione predefinita della memoria, perciò per avviare un nuovo kernel è necessario sovrascrivere quello precedente. Questo è eseguito in 4 passaggi:</p>
<ol>
<li>Caricare il nuovo kernel in memoria</li>
<li>Spostare il kernel nella memoria dinamica del kernel</li>
<li>Sostituire fisicamente il kernel caricato</li>
<li>Avviare il nuovo kernel</li>
</ol>
<p>I primi due passaggi sono effettuati durante il caricamento del kernel. Una volta caricato nella memoria utente, il kernel viene spostato nella memoria dinamica del kernel grazie all&#8217;uso della chiamata di sistema &#8217;sys_kexec&#8217;.<br />
Insieme ad esso viene allocato in memoria del codice assembly chiamato &#8216;reboot_code_buffer&#8217;, che si dovrà occupare di sovrascrivere il kernel in funzione con quello caricato in memoria, e poi farlo partire (terzo e quarto passaggio).</p>
<h3>kexec-tools</h3>
<p>Dopo aver verificato che kexec sia correttamente compilato, e aver installato kexec-tools, vediamo ora come usare nella pratica questi strumenti.<br />
Come già detto il primo passo è caricare il kernel in memoria (i primi due passaggi visti prima).</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># kexec -l [nuovo-kernel] [args]</pre></div></div>

<p>dove [nuovo-kernel] sta per l&#8217;immagine del kernel da caricare. I formati supportati sono: Beoboot-x86, elf-x86, bzImage-x86, multiboot-x86. Mentre [args] sta per gli argomenti specifici per i formati. Un esempio, utilizzando un kernel in formato bzImage, potrebbe essere:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># kexec -l /usr/src/linux/arch/i386/boot/bzImage --append=&quot;root=/dev/hdX&quot;</pre></div></div>

<p>Dove /dev/hdX sta per il filesystem di root. È possibile usare anche initrd:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># kexec -l /usr/src/linux/arch/i386/boot/bzImage --append=&quot;root=/dev/hdX&quot; --initrd=/boot/initrd.img</pre></div></div>

<p>Se siete indecisi su che argomenti passare al kernel potete dare un&#8217;occhiata al file &#8216;/proc/cmdline&#8217; che indica i parametri dell&#8217;attuale kernel.<br />
Per una lista di tutte le opzioni invece basta digitare:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ man kexec</pre></div></div>

<p>Ora non resta altro da fare che avviare il nuovo kernel.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># kexec -e</pre></div></div>

<p>kexec avvia &#8220;alla brutta&#8221; il nuovo kernel senza fare lo shutdown correttamente, perciò consiglio di usare semplicemente il comando</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># reboot</pre></div></div>

<p>Che dovrebbe funzionare ugualmente (ad un certo punto, dovrebbe spuntare un scritta del tipo &#8220;rebooting with kexec&#8221; o qualcosa del genere).</p>
<p>Dopodichè il nuovo kernel dovrebbe partire, come se fosse un normale avvio del sistema.</p>
<h3>Conclusione</h3>
<p>Grazie a kexec, è possibile ridurre notevolmente i tempi di riavvio di un sistema, questo non solo beneficia uno sviluppatore che si trova a dover riavviare numerose volte, ma si applica molto bene anche a tutti quei sistemi in cui il downtime deve essere ridotto al minimo (la maggior parte dei sistemi enterprise quindi). Oltre che ovviamente a tutti quelli che come me vogliono solo imparare qualcosa di nuovo.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbio.ath.cx/2009/10/11/riavviare-linux-con-kexec/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux 2.6.31 + RT + nVidia = Fail</title>
		<link>http://alexbio.ath.cx/2009/09/20/linux-2-6-31-rt-nvidia-fail/</link>
		<comments>http://alexbio.ath.cx/2009/09/20/linux-2-6-31-rt-nvidia-fail/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 13:01:02 +0000</pubDate>
		<dc:creator>AlexBio</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Kernel]]></category>

		<guid isPermaLink="false">http://alexbio.ath.cx/?p=529</guid>
		<description><![CDATA[Ieri pomeriggio mi sono messo a ricompilare il kernel Linux (ultima versione stabile ovvero 2.6.31) con la patch real-time di Ingo Molnar. Solitamente aspetto che i sorgenti siano disponibili nei repo di Debian con realativa patch ma questa volta non avevo voglia di attendere.
Compilato alla Debian way senza nessun problema, e felice come una pasqua [...]]]></description>
			<content:encoded><![CDATA[<p>Ieri pomeriggio mi sono messo a ricompilare il kernel Linux (ultima versione stabile ovvero 2.6.31) con la patch real-time di Ingo Molnar. Solitamente aspetto che i sorgenti siano disponibili nei repo di Debian con realativa patch ma questa volta non avevo voglia di attendere.</p>
<p>Compilato alla <a href="http://alexbio.ath.cx/2008/07/08/ricompilare-il-kernel-linux-debian-way/">Debian way</a> senza nessun problema, e felice come una pasqua mi apprestavo ad installare i driver nVidia&#8230; ed è proprio a questo punto che sono iniziati i problemi.</p>
<p>Primo tentativo usando module-assistant e il pacchetto nvidia-kernel-source (185.18)  da Sid&#8230; Fallito.</p>
<p>Secondo tentativo usando l&#8217;installer ufficiale nVidia (sempre 185.18)&#8230; Fallito.</p>
<p>Senza perdermi d&#8217;animo faccio un terzo tentativo usando l&#8217;installer nVidia ancora in beta (versione 192.32) ma anche questo fallisce.</p>
<p>A questo punto, insospettito, vado a guardare il log dell&#8217;installazione. L&#8217;errore riguardava una certa funzione init_MUTEX evidentemente modificata dalla patch RT. Cercando un pò su internet è saltato fuori che nell&#8217;ultima versione del kernel la patch non dichiarava più la suddetta funzione, rispetto alla precedente ovvero quella per la versione 2.6.29.</p>
<p>Continuando a cercare ho trovato anche un&#8217;ottima patch per risolvere il problema&#8230; vediamo ora come installarla.</p>
<p>La patch è la seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">diff -Naur NVIDIA-Linux-x86-190.32-orig/usr/src/nv/nv-linux.h NVIDIA-Linux-x86-190.32/usr/src/nv/nv-linux.h
--- NVIDIA-Linux-x86-190.32-orig/usr/src/nv/nv-linux.h	2009-09-02 11:54:49.000000000 +0100
+++ NVIDIA-Linux-x86-190.32/usr/src/nv/nv-linux.h	2009-09-17 21:05:45.000000000 +0100
@@ -742,20 +742,28 @@
 #define nv_down(lock)                   down(&amp;lock)
 #define nv_up(lock)                     up(&amp;lock)
&nbsp;
+#if defined(CONFIG_PREEMPT_RT) &amp;&amp; !defined(init_MUTEX)
+#  define nv_spin_lock_init(lock)              atomic_spin_lock_init(lock)
+#  define nv_spin_lock_irqsave(lock, irq)      atomic_spin_lock_irqsave(lock, irq)
+#  define nv_spin_unlock_irqrestore(lock, irq) atomic_spin_unlock_irqrestore(lock, irq)
+#else
+#  define nv_spin_lock_init(lock)              spin_lock_init(lock)
+#  define nv_spin_lock_irqsave(lock, irq)      spin_lock_irqsave(lock, irq)
+#  define nv_spin_unlock_irqrestore(lock, irq) spin_unlock_irqrestore(lock, irq)
+#endif
+
 #if defined(CONFIG_PREEMPT_RT)
-#define NV_INIT_MUTEX(mutex) init_MUTEX(mutex)
+#  if defined(init_MUTEX)
+#    define nv_spinlock_t raw_spinlock_t
+#  else
+#    define nv_spinlock_t atomic_spinlock_t
+#  endif
 #else
-#if !defined(__SEMAPHORE_INITIALIZER) &amp;&amp; defined(__COMPAT_SEMAPHORE_INITIALIZER)
-#define __SEMAPHORE_INITIALIZER __COMPAT_SEMAPHORE_INITIALIZER
-#endif
-#define NV_INIT_MUTEX(mutex)                       \
-    {                                              \
-        struct semaphore __mutex =                 \
-            __SEMAPHORE_INITIALIZER(*(mutex), 1);  \
-        *(mutex) = __mutex;                        \
-    }
+#  define nv_spinlock_t   spinlock_t
 #endif
&nbsp;
+#define NV_INIT_MUTEX(mutex) sema_init(mutex, 1)
+
 #if defined (KERNEL_2_4)
 #  define NV_IS_SUSER()                 suser()
 #  define NV_PCI_DEVICE_NAME(dev)       ((dev)-&gt;name)
diff -Naur NVIDIA-Linux-x86-190.32-orig/usr/src/nv/os-interface.c NVIDIA-Linux-x86-190.32/usr/src/nv/os-interface.c
--- NVIDIA-Linux-x86-190.32-orig/usr/src/nv/os-interface.c	2009-09-02 11:54:48.000000000 +0100
+++ NVIDIA-Linux-x86-190.32/usr/src/nv/os-interface.c	2009-09-17 21:05:45.000000000 +0100
@@ -108,11 +108,7 @@
 {
     nv_stack_t        *sp;
     struct completion  completion;
-#if defined(CONFIG_PREEMPT_RT)
-    raw_spinlock_t     lock;
-#else
-    spinlock_t         lock;
-#endif
+    nv_spinlock_t      lock;
     S032               count;
 } os_sema_t;
&nbsp;
@@ -148,7 +144,7 @@
     os_sema = (os_sema_t *)*ppSema;
     os_sema-&gt;sp = sp;
     init_completion(&amp;os_sema-&gt;completion);
-    spin_lock_init(&amp;os_sema-&gt;lock);
+    nv_spin_lock_init(&amp;os_sema-&gt;lock);
     os_sema-&gt;count = 1;
&nbsp;
     if (nv_os_smp_barrier_init())
@@ -199,18 +195,18 @@
     os_sema_t *os_sema = (os_sema_t *)pSema;
     unsigned long old_irq;
&nbsp;
-    spin_lock_irqsave(&amp;os_sema-&gt;lock, old_irq);
+    nv_spin_lock_irqsave(&amp;os_sema-&gt;lock, old_irq);
     if (os_sema-&gt;count &lt;= 0)
     {
         os_sema-&gt;count--;
-        spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
+        nv_spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
         wait_for_completion(&amp;os_sema-&gt;completion);
     }
     else
     {
         os_sema-&gt;count--;
         rm_disable_interrupts(os_sema-&gt;sp);
-        spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
+        nv_spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
     }
&nbsp;
     return RM_OK;
@@ -233,17 +229,17 @@
     os_sema_t *os_sema = (os_sema_t *)pSema;
     unsigned long old_irq;
&nbsp;
-    spin_lock_irqsave(&amp;os_sema-&gt;lock, old_irq);
+    nv_spin_lock_irqsave(&amp;os_sema-&gt;lock, old_irq);
     if (os_sema-&gt;count &lt;= 0)
     {
-        spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
+        nv_spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
         return RM_ERROR;
     }
     else
     {
         os_sema-&gt;count--;
         rm_disable_interrupts(os_sema-&gt;sp);
-        spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
+        nv_spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
         return RM_OK;
     }
&nbsp;
@@ -267,7 +263,7 @@
     unsigned long old_irq;
     BOOL doWakeup;
&nbsp;
-    spin_lock_irqsave(&amp;os_sema-&gt;lock, old_irq);
+    nv_spin_lock_irqsave(&amp;os_sema-&gt;lock, old_irq);
     if (os_sema-&gt;count &lt; 0)
     {
         doWakeup = TRUE;
@@ -278,7 +274,7 @@
         rm_enable_interrupts(os_sema-&gt;sp);
     }
     os_sema-&gt;count++;
-    spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
+    nv_spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
&nbsp;
     if (doWakeup)
         complete(&amp;os_sema-&gt;completion);
@@ -1383,7 +1379,7 @@
     unsigned long oldIrql;
&nbsp;
     os_sema = (os_sema_t *) pSema;
-    spin_lock_irqsave(&amp;os_sema-&gt;lock, oldIrql);
+    nv_spin_lock_irqsave(&amp;os_sema-&gt;lock, oldIrql);
&nbsp;
     return oldIrql;
 }
@@ -1394,7 +1390,7 @@
     unsigned long old_irq = (unsigned long) oldIrql;
&nbsp;
     os_sema = (os_sema_t *) pSema;
-    spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
+    nv_spin_unlock_irqrestore(&amp;os_sema-&gt;lock, old_irq);
 }
&nbsp;
 RM_STATUS NV_API_CALL os_get_address_space_info(</pre></div></div>

<p>Si riferisce alla versione beta dei driver (192.32) quindi è necessario scaricarli dal <a href="http://www.nvidia.it/object/linux_display_ia32_190.32_it.html">sito ufficiale</a> (ATTENZIONE: come già detto è solo una versione beta&#8230; maneggiare con cura ;) ).</p>
<p>Il secondo passo è quello di estrarre i sorgenti, per fare ciò utilizzare l&#8217;opzione &#8216;-x&#8217;:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sh NVIDIA-Linux-x86-190.32-pkg1.run -x</pre></div></div>

<p>Che dovrebbe aver creato una cartella omonima (senza il .run). Ora creiamo una copia (non si sa mai):</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ cp -r NVIDIA-Linux-x86-190.32-pkg1 NVIDIA-Linux-x86-190.32-orig</pre></div></div>

<p>Nel mio caso ho salvato la suddetta patch come &#8216;patch-2.6.31-nvidia-192.32-rt.patch&#8217; nella stessa cartella di quella estratta prima (es. se ho estratto la cartella dei driver in &#8216;Downloads/NVIDIA-Linux-x86-190.32-orig&#8217; il percorso della patch dovrà essere &#8216;Downloads/patch-2.6.31-nvidia-192.32-rt.patch&#8217;).</p>
<p>L&#8217;ultimo passo è quello di applicare la patch (alla vecchia maniera):</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ cat patch-2.6.31-nvidia-192.32-rt.patch | patch -p0</pre></div></div>

<p>Il cui output dovrebbe essere qualcosa tipo:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">patching file NVIDIA-Linux-x86-190.32-orig/usr/src/nv/nv-linux.h
patching file NVIDIA-Linux-x86-190.32-orig/usr/src/nv/os-interface.c</pre></div></div>

<p>Se così non fosse, significherebbe che avete sbagliato qualcosa, perciò ripetete il procedimento da capo.</p>
<p>Ed ora possiamo tranquillamente installare i driver (dopo aver terminato Xorg):</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ sudo NVIDIA-Linux-x86-190.32-orig/nvidia-installer</pre></div></div>

<p>Questo è tutto, dopo aver installato i driver è ovviamente necessario configurare Xorg, ma questa è un&#8217;altra storia, su interenet potete trovare pagine e pagine a riguardo.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbio.ath.cx/2009/09/20/linux-2-6-31-rt-nvidia-fail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ricompilare il kernel Linux: Debian-way</title>
		<link>http://alexbio.ath.cx/2008/07/08/ricompilare-il-kernel-linux-debian-way/</link>
		<comments>http://alexbio.ath.cx/2008/07/08/ricompilare-il-kernel-linux-debian-way/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 18:17:42 +0000</pubDate>
		<dc:creator>AlexBio</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Kernel]]></category>

		<guid isPermaLink="false">http://alexbio.netsons.org/?p=47</guid>
		<description><![CDATA[Introduzione
Come forse saprete il kernel, è il nucleo di un sistema operativo. In Linux è possibile creare una versione personalizzata del kernel aumentando in questo modo l&#8217;efficienza e la stabilità del nostro sistema. Infatti in molte distribuzioni sono attivi in modo predefinito la maggior parte dei moduli, per vari motivi (e.g. per fare in modo [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduzione</h3>
<p>Come forse saprete il kernel, è il nucleo di un sistema operativo. In Linux è possibile creare una versione personalizzata del kernel aumentando in questo modo l&#8217;efficienza e la stabilità del nostro sistema. Infatti in molte distribuzioni sono attivi in modo predefinito la maggior parte dei moduli, per vari motivi (e.g. per fare in modo che il sistema sia compatibile con la maggior parte di configurazioni hardware), rimuovendo quelli non necessari il kernel sel nostro sistema sarà più snello, e quindi più veloce ed efficiente e meno soggetto a problemi.</p>
<p>In Debian la ricompilazione del kernel può essere effettuata in diversi modi, quella standard per tutte le distribuzioni, o alla debian-way, che permette di compilare il kernel e di creare un comodo pacchetto .deb per facilitare la sua installazione (ed eventualmente la disinstallazione).</p>
<p>In questo articolo verrà illustrato il secondo metodo. I passi che vedremo saranno la configurazione del kernel, la sua compilazione e l&#8217;installazione.</p>
<h3>Preparazione</h3>
<p>Prima di cominciare è necessario installare alcuni pacchetti necessari alla compilazione e alla pachetizzazione del kernel</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># apt-get install build-essential kernel-package fakeroot</pre></div></div>

<p>Dopo aver fatto questo è necessario ottenere i sorgenti del kernel senza i quali non potremmo fare niente</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ apt-cache search linux-source
linux-source-2.6.24 - Linux kernel source for version 2.6.24 with Debian patches</pre></div></div>

<p>I sorgenti del kernel presenti nei repository di Debian sono leggermente diversi da quelli del kernel Vanilla (rilasciati da Torvalds e dal suo staff), in quanto vengono leggermente modificati per meglio integrarli con il sistema. Per questo articolo prenderemo come esempio la versione 2.6.24, voi potete sostituirla con la versione che userete.<br />
Ora non resta che installarli:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># apt-get install linux-source-2.6.24</pre></div></div>

<p>L&#8217;archivio contenente tutti i file verrà posizionati in</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">/usr/src</pre></div></div>

<p>Per evitare di compilare il kernel con i privilegi di root, è consigliato aggiungere l&#8217;utente che andrà a compilare, al gruppo &#8220;src&#8221;, i cui membri hanno diritto di scrittura nella cartella dei sorgenti</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># adduser nome-utente src</pre></div></div>

<p>Per rendere effettive le modifiche è necessario riloggarsi.</p>
<p>A questo punto possiamo spostarci nella cartella dei sorgenti</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ cd /usr/src</pre></div></div>

<p>dove troveremo un archivio tar.bz2 contenente i sorgenti, da decomprimere</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ tar -jxvf linux-source-2.6.24.tar.bz2</pre></div></div>

<p>Per facilitarci il lavoro creiamo un link simbolico alla cartella appena creata</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ ln -s linux-source-2.6.24 linux</pre></div></div>

<p>E spostiamoci al suo interno</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ cd linux</pre></div></div>

<h3>Pulizia</h3>
<p>Il prossimo passo da eseguire è la pulitura dei sorgenti. Questa operazione è necessaria per eliminare i file creati dalle precedenti compilazioni, se questa è la prima ricompilazione che eseguite non è necessaria.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ make-kpkg clean</pre></div></div>

<h3>Configurazione</h3>
<p>Passiamo ora alla configurazione, parte centrale dell&#8217;intera operazione. Per farlo si possono utilizzare differenti interfacce grafiche.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ make config</pre></div></div>

<p>Questa è l&#8217;interfaccia più semplice: presenta le varie opzioni una in seguito all&#8217;altra. Personalmente non mi piace molto, in quanto obbliga l&#8217;utente a definire qualsiasi tipo di impostazione, anche se non necessarie.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ make menuconfig</pre></div></div>

<p>Il metodo più comune: crea un comodo menu grazie alle librerie ncurses, in cui l&#8217;utente può facilmente navigare con la tastiera. Per questo metodo sono necessarie le librerie di sviluppo ncurses (ncurses-dev).</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ make xconfig</pre></div></div>

<p>Simile al precedente metodo, con la differenza che il menu viene creato per X con le librerie qt.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ make gconfig</pre></div></div>

<p>Come sopra, ma con le librerie gtk.<br />
Per questi due ultime modalità sono necessarie le librerie di sviluppo rispettivamente di qt e gtk.</p>
<p>A questo punto dovrete esplorare le varie opzioni del kernel, suddivise in diverse sezioni logiche. È possibile impostarle a off (ovvero non disponibile), modulo (compilato separatamente e caricato quando necessario) e on (compilato nel kernel).<br />
In questo articolo non entrerò nel dettaglio delle varie opzioni, per avere maggiori dettagli potete consultare il <a href="http://kernel.xc.net/">Linux Kernel Configuration Archive</a>, in cui non dovrete fare altro che selezionare la versione del kernel e l&#8217;architettura.<br />
Una volta finito di configurare, e necessario salvare le impostazione selezionando l&#8217;apposita voce nel menu, che creerà un file di testo (in modo predefinito col nome &#8220;.config&#8221;) che potrà essere utilizzato anche in futuro per ulteriori compilazioni.<br />
Ed ora la compilazione&#8230;</p>
<h3>Compilazione</h3>
<p>Per facilitare questa procedura useremo il tool make-kpkg, installato precedentemente</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ fakeroot make-kpkg --append-to-version custom --revision=1 kernel_image</pre></div></div>

<p>È possibile anche creare pacchetti deb dai sorgenti di moduli (ad esempio alsa) posizionati in /usr/src/modules aggiungendo modules_image alla fine del comando, in modo che diventi</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ fakeroot make-kpkg --append-to-version custom --revision=1 kernel_image modules_image</pre></div></div>

<p>Analizziamo brevemente questo comando:<br />
<strong>&#8211;append-to-version custom</strong> &#8211; Serve ad aggiungere una stringa personalizzata (in questo caso &#8220;custom&#8221;) al nome del pacchetto, dopo il numero di versione, che verrà creato .<br />
<strong>&#8211;revision=1</strong> &#8211; Imposta un numero di revisione per il kernel, in modo che ad un successivo aggiornamento del kernel, quello personalizzato non venga rimosso in favore di quello ufficiale.<br />
<strong>kernel_image</strong> &#8211; Indica che si vuole creare un pacchetto deb con il kernel compilato.</p>
<p>È possibile indicare altre opzioni, per una lista più approfondita vi rimando al manuale di make-kpkg</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$ man make-kpkg</pre></div></div>

<p>La compilazione richiederà un pò di tempo, al termine della quale verrà creato un file del tipo linux-image-&lt;versione&gt;-&lt;nomepersonalizzato&gt;-&lt;architettura&gt;.deb nella cartelle /usr/src.</p>
<p>Non ci resta altro da fare se non installarlo tramite dpkg.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># dpkg -i linux-image-2.6.24-custom-i386.deb</pre></div></div>

<p>In seguito sarà possibile installare lo stesso kernel anche su altre macchine Debian senza dover eseguire un&#8217;altra volta tutta l&#8217;operazione.</p>
<h3>Boot Loader</h3>
<p>Ora che il nuovo kernel è installato potrebbe essere necessario aggiornare il boot loader.<br />
Nel caso di grub questo non è necessario, in quanto dopo l&#8217;installazione di un nuovo kernel viene automaticamente eseguito un <em>update-grub</em>.<br />
Nel caso di Lilo invece, è necessario modificare il file /etc/lilo.conf e aggiornare l&#8217;MBR.</p>
<p>A questo punto il nuovo kernel non è ancora in uso, per utilizzarlo è necessario riavviare la macchina e selezionarlo dal menu del boot loader.</p>
<p>Nel caso che qualcosa andasse storto, niente paura, riavviate il sistema con il vecchio kernel selezionandolo dal menu del boot loader.</p>
<p>E questo è tutto&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbio.ath.cx/2008/07/08/ricompilare-il-kernel-linux-debian-way/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
