<?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; Virtualizzazione</title>
	<atom:link href="http://alexbio.ath.cx/category/virtualizzazione/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>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>
	</channel>
</rss>
