<?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>Mia mamma usa Linux! &#187; Sistema</title>
	<atom:link href="http://www.miamammausalinux.org/tag/sistema/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.miamammausalinux.org</link>
	<description>Perché niente è impossibile da capire... Se lo spieghi bene !</description>
	<lastBuildDate>Mon, 02 Jan 2012 11:31:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Linux e la linea di comando, comandi particolari e poco conosciuti: manipolazione di stream e file di testo</title>
		<link>http://www.miamammausalinux.org/2009/10/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-manipolazione-di-stream-e-file-di-testo/</link>
		<comments>http://www.miamammausalinux.org/2009/10/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-manipolazione-di-stream-e-file-di-testo/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 08:26:19 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Sistema]]></category>
		<category><![CDATA[Comandi poco conosciuti]]></category>
		<category><![CDATA[Linea di comando]]></category>
		<category><![CDATA[Manipolazione file di testo]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=820</guid>
		<description><![CDATA[Nel primo articolo di questa serie sono stati affrontati i comandi interni alla shell Bash che permettono di agevolare il proprio lavoro ed ottimizzarne le tempistiche di realizzazione. In questa nuova puntata verranno trattati comandi di sistema, generalmente ignorati, richiamabili all&#8217;interno della shell Bash per la manipolazione degli stream di output e dei contenuti dei [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" title="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>Nel primo articolo di questa serie sono stati affrontati i comandi interni alla shell Bash che permettono di agevolare il proprio lavoro ed ottimizzarne le tempistiche di realizzazione.<br />
In questa nuova puntata verranno trattati comandi di sistema,  generalmente ignorati, richiamabili all&#8217;interno della shell Bash per la manipolazione degli stream di output e dei contenuti dei file.</p>
<p><strong>Comandi per l&#8217;elaborazione degli stream di testo</strong></p>
<p>Lo studio del contenuto dei file, dal filtro dei contenuti all&#8217;ordinamento di questi sono operazioni effettuate quotidianamente attraverso diffusissimi comandi come <em>cat</em>, <em>grep</em> e <em>sort</em>. Ma esiste un nutrito numero di comandi utilizzabili per l&#8217;elaborazione dei così detti &#8220;stream&#8221; di testo, eccone descritti alcuni.</p>
<p><em><strong>tac</strong></em></p>
<p>Il funzionamento di <em>tac</em> è quello dell&#8217;esatto opposto di <em>cat</em>. Esso infatti concatena e stampa il contenuto dei file in ordine inverso, partendo cioè dall&#8217;ultima riga. Supponendo di avere il seguente file di testo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat elenco
1
2
3
4
5
6</pre></div></div>

<p>l&#8217;output generato da <em>tac</em> sarà il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ tac elenco
6
5
4
3
2
1</pre></div></div>

<p><em><strong>tr</strong></em></p>
<p>Il comando <em>tr</em> permette di modificare o cancellare caratteri da uno stream di input. Dato ad esempio il file contenente l&#8217;elenco precedente, sarà possibile ad esempio sostituire i caratteri <em>newline</em> (accapo) con il carattere &#8220;#&#8221;, utilizzando il comando in questa forma:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat elenco_num | tr &quot;\n&quot; &quot;#&quot;
1#2#3#4#5#6#</pre></div></div>

<p>L&#8217;opzione &#8220;<em>-d</em>&#8221; del comando consente di eliminare e non sostituire le occorrenze trovate, applicato al comando precedente, correggerebbe l&#8217;output come segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat elenco | tr &quot;\n&quot; &quot;#&quot; | tr -d &quot;#&quot;
12345678910</pre></div></div>

<p><em>tr</em> permette di utilizzare anche specifici set di caratteri, senza che ne venga indicato uno specifico. Ad esempio dato il seguente file di testo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat elenco
A
B
C
D
E
F</pre></div></div>

<p>è possibile convertire tutte le lettere maiuscole in minuscole attraverso l&#8217;utilizzo dei seguenti set:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat elenco | tr &quot;[:upper:]&quot; &quot;[:lower:]&quot;
a
b
c
d
e
f</pre></div></div>

<p>L&#8217;elenco completo dei set di caratteri utilizzabili si trova nella <em>man page</em> del comando.</p>
<p><em><strong>nl</strong></em></p>
<p><em>nl</em> consente di numerare le righe proveniente da uno stream di input. La forma in cui la numerazione appare dipende dalle opzioni passate, senza alcuna opzione il comando numererà le righe con gli indici allineati a destra:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat elenco | nl
     1	A
     2	B
     3	C
     4	D
     5	E
     6	F</pre></div></div>

<p>è possibile specificare un formato diverso per l&#8217;indice di riga attraverso l&#8217;opzione &#8220;-n&#8221;, ad esempio per fare in modo che gli indici siano allineati a sinistra l&#8217;opzione da passare sarà &#8220;-n ln&#8221;, mentre per lasciare gli indici allineati a destra e fare in modo che gli spazi precedenti siano riempiti da zero l&#8217;opzione sarà &#8220;-n rz&#8221;.<br />
E&#8217; possibile specificare anche il carattere di separazione tra l&#8217;indice e la riga associata, che di default è tab, con un altro carattere attraverso l&#8217;opzione &#8220;-s&#8221;.<br />
Ecco un esempio:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat elenco | nl -n rz -s &quot;#&quot;
000001#A
000002#B
000003#C
000004#D
000005#E
000006#F</pre></div></div>

<p><em><strong>paste</strong></em></p>
<p>Il comando <em>paste</em> permette di unire due file riga per riga. Nell&#8217;esempio più banale paste è utilizzato come segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ paste elenco elenco_num 
A	1
B	2
C	3
D	4
E	5
F	6</pre></div></div>

<p>ed anche per questo comando è possibile sostituire con l&#8217;opzione &#8220;-d&#8221; il carattere che separa le righe, di default sempre tab, con un carattere a scelta:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ paste -d &quot;#&quot; elenco elenco_num
A#1
B#2
C#3
D#4
E#5
F#6</pre></div></div>

<p>paste può essere utilizzato per operare anche su stream di input in modo da unire le righe prodotte ad un&#8217;elaborazione a quelle di un file:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ tac elenco|paste - elenco
F	A
E	B
D	C
C	D
B	E
A	F</pre></div></div>

<p>lo stream generato dal comando <em>tac</em> viene utilizzato da <em>paste</em> attraverso l&#8217;introduzione del carattere &#8220;-&#8221; per ottenere l&#8217;unione di tutte le righe del file con quelle dello stesso, ma contrapposte.</p>
<p><em><strong>wc</strong></em></p>
<p><em>wc</em> effettua un conteggio e totalizza a seconda delle opzioni il numero di caratteri (&#8220;-m&#8221;), parole (&#8220;-w&#8221;), byte (&#8220;-c&#8221;) e linee (&#8220;-l&#8221;) di un file o di uno stream di input. Ad esempio per conoscere il numero di file nascosti presente in una directory, sarà sufficiente utilizzare il comando come segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ls .* | wc -l
681</pre></div></div>

<p>Lanciato senza argomenti <em>wc</em> restituisce tre valori: il numero di linee, di parole e di byte. Ad esempio nel caso di un calcolo su due file il comportamento del comando sarà il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ wc elenco elenco_num 
 6  6 12 elenco
 6  6 12 elenco_num
12 12 24 totale</pre></div></div>

<p><em><strong>tee</strong></em></p>
<p>Il comando <em>tee</em> permette di redirigere l&#8217;output di un comando all&#8217;interno di un file e nel contempo stamparlo a video. Mentre la ridirezione classica effettuata attraverso il carattere &#8220;>&#8221; non permette di consultare istantaneamente l&#8217;output, attraverso <em>tee</em> è possibile osservare riproporre il flusso output del comando lanciato ed al contempo salvarlo in un file:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ tac elenco | tee elenco_inv | wc -l
6</pre></div></div>

<p>L&#8217;esempio dimostra la peculiarità del comando <em>tee</em>: lo stream di output viene registrato all&#8217;interno del file <em>elenco_inv</em> e passato al comando <em>wc</em> che ne calcola il numero di righe.</p>
<p><strong>Conclusioni</strong></p>
<p>Chiaramente ciascuno dei comandi illustrati possiede numerosi altri parametri che ne alterano il funzionamento, questi sono consultabili attraverso le <em>man page</em> sempre complete e prodighe di importanti informazioni. Scopo di questa serie di articoli rimane quello di fornire spunti dietro i quali approfondire.<br />
Nel prossimo articolo verranno affrontati i comandi utilizzabili per la gestione delle code di stampa da linea di comando.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/10/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-manipolazione-di-stream-e-file-di-testo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creare un&#8217;immagine di un disco USB&#8230; senza disco USB.</title>
		<link>http://www.miamammausalinux.org/2009/09/creare-unimmagine-di-un-disco-usb-senza-disco-usb/</link>
		<comments>http://www.miamammausalinux.org/2009/09/creare-unimmagine-di-un-disco-usb-senza-disco-usb/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 09:27:18 +0000</pubDate>
		<dc:creator>Matteo Cappadonna</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Immagine disco]]></category>
		<category><![CDATA[Mount]]></category>
		<category><![CDATA[Sistema]]></category>
		<category><![CDATA[Usb]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=804</guid>
		<description><![CDATA[Eccoci ancora qui con un altro tutorial semplice semplice ma, in alcuni casi, molto utile. Il problema di oggi è stato il seguente: devo montare su una lama HP l&#8217;immagine di un disco USB per poter caricare dei file su un sistema &#8220;live&#8221; (quindi con lettore cd occupato) senza dover configurare la rete (e quindi, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" title="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>Eccoci ancora qui con un altro tutorial semplice semplice ma, in alcuni casi, molto utile.</p>
<p>Il problema di oggi è stato il seguente: devo montare su una lama HP l&#8217;immagine di un disco USB per poter caricare dei file su un sistema &#8220;live&#8221; (quindi con lettore cd occupato) senza dover configurare la rete (e quindi, far riconfigurare la porta degli switch).</p>
<p>Le soluzioni sono 2:<br />
1) Prendere una chiavetta USB, caricare i file, fare un&#8217;immagine e collegarla<br />
2) Creare direttamente da sistema l&#8217;immagine di una chiavetta USB, caricare i file, e collegarla.</p>
<p>Dato che la prima soluzione prevede comunque di avere una chiavetta di dimensione &#8220;trasportabile&#8221; via rete (personalmente ho un pendrive da 16GB: per due file da 2mb l&#8217;uno, farmi un&#8217;immagine da 16GB e spostarla via rete è assurdo), la seconda è molto più malleabile in termine di dimensioni dell&#8217;immagine che si andrà a creare.</p>
<p>Ma, andiamo a cominciare: per prima cosa ci interessa creare un file (che altro non sarà che l&#8217;immagine della nostra chiavetta) di una dimensione particolare; nel mio caso, 10mb sono più che sufficienti.<br />
Mano al buon, vecchio <strong>dd</strong> e dunque:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ dd if=/dev/zero of=usbDisk.img bs=1024 count=10000</pre></div></div>

<p>Quindi, partendo dal device &#8220;zero&#8221; (contenente, ovviamente, solo 0) creo un file &#8220;usbDisk.img&#8221; di dimensione 1024byte x 10000 = 1kb x 10000 = 10mb</p>
<p>Terminata la creazione, scatta la magia: andiamo a collegare questo file ad un device facendolo, in effetti, vedere al sistema come un dispositivo fisicamente collegato alla macchina:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ losetup -f usbDisk.img</pre></div></div>

<p>Questo comando prende il file usbDisk.img e lo collega al device /dev/loop0</p>
<p>Ora, come ogni disco che si rispetti, andiamo a crearci sopra una partizione; armiamoci di cfdisk (molto semplice, i puristi preferiranno fdisk, ma fate voi) e creiamo una singola partizione di tipo &#8220;Linux&#8221; sul disco:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cfdisk /dev/loop0</pre></div></div>

<p>Salviamo ed usciamo.<br />
In realtà quello che ci serve non è la partizione, bensì il fatto che cfdisk, in fase di scrittura, determina e scrive direttamente sul device informazioni come i cilindri, ecc. che servono successivamente per creare il filesystem.</p>
<p>Quindi, visto che vogliamo simulare un disco usb &#8220;standard&#8221;, andiamo a metterci sopra un filesystem che sia comune, e cosa meglio del vecchio fat32 per questo?</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mkdosfs -F 32 /dev/loop0</pre></div></div>

<p>Terminata la creazione possiamo montare il disco usb come un normalissimo device:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mkdir -p /mnt/fintoDisco
$ mount /dev/loop0 /mnt/fintoDisco</pre></div></div>

<p>e copiarci sopra i file interessati.</p>
<p>Quando abbiamo finito ricordiamoci di smontare il device:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ umount /mnt/fintoDisco</pre></div></div>

<p>e, soprattutto, di sganciare il device dal file reale:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ losetup -d /dev/loop0</pre></div></div>

<p>Ora possiamo portarci in giro il file come più ci aggrada.</p>
<p>Buon divertimento e buon lavoro</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/09/creare-unimmagine-di-un-disco-usb-senza-disco-usb/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Linux e la linea di comando, comandi particolari e poco conosciuti: Bash, comandi interni alla shell</title>
		<link>http://www.miamammausalinux.org/2009/09/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-bash-comandi-interni-alla-shell/</link>
		<comments>http://www.miamammausalinux.org/2009/09/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-bash-comandi-interni-alla-shell/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 16:40:20 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Sistema]]></category>
		<category><![CDATA[Comandi poco conosciuti]]></category>
		<category><![CDATA[Linea di comando]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=781</guid>
		<description><![CDATA[La linea di comando e più propriamente la console bash rappresentano lo strumento di cui ogni sistemista Linux non può fare a meno. Modificare file, elaborare contenuti ed operare sui processi sono parte del lavoro quotidiano di chiunque gestisca sistemi informatici più o meno ampi. Interessante è capire come esistano moltissimi comandi a disposizione di [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" title="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>La linea di comando e più propriamente la console bash rappresentano lo strumento di cui ogni sistemista Linux non può fare a meno. Modificare file, elaborare contenuti ed operare sui processi sono parte del lavoro quotidiano di chiunque gestisca sistemi informatici più o meno ampi.<br />
Interessante è capire come esistano moltissimi comandi a disposizione di un sistemista oltre a quelli comunemente usati che, per quanto ignorati, possono facilitare il lavoro quotidiano.<br />
Questo primo articolo cerca di effettuare una panoramica ricca di esempi di come sia possibile utilizzare comandi incorporati della shell come <em>set</em>, <em>declare</em>, <em>type</em> e molti altri.</p>
<p><strong>Comandi interni alla shell</strong></p>
<p>La prima panoramica riguarda i comandi interni alla shell. Caratteristica di questi comandi è di non avere binari corrispondenti installati nel sistema (in directory come /bin, /sbin, /usr/bin e così via), infatti è l&#8217;ambiente erogato dall&#8217;eseguibile bash (a sua volta un binario installato nel sistema) a renderli disponibili.</p>
<p><em><strong>set</strong></em></p>
<p>Il comando <em>set</em> permette di modificare molti comportamenti e funzionalità della bash. Per abilitare una funzionalità si antepone all&#8217;opzione interessata un carattere &#8220;-&#8221;, viceversa per disabilitarla è sufficiente anteporre un carattere &#8220;+&#8221; all&#8217;opzione.<br />
Lanciato senza parametri il programma restituisce le impostazioni generali della shell, comprensive di variabili e funzioni che si riferiscono all&#8217;ambiente.<br />
Alcuni esempi di utilizzo di set:<br />
Per fare in modo che le variabili create vengano automaticamente esportate è possibile attivare l&#8217;opzione &#8220;a&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ set -a
$ VARIABILE=&quot;VALORE&quot;
$ bash
$ echo $VARIABILE
VALORE</pre></div></div>

<p>Per fare in modo che i comandi lanciati all&#8217;interno del sistema siano stampati, sarà sufficiente attivare l&#8217;opzione &#8220;x&#8221;, prima dell&#8217;output di ogni comando successivo lanciato apparirà il comando effettivamente lanciato. Cosa questo significhi lo si capisce dal seguente listato:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">rasca@anomalia:~$ set -x
++ echo -ne '\033]0;rasca@anomalia: ~\007'
rasca@anomalia:~$ ls
+ ls --color=auto
...
...</pre></div></div>

<p>il comando lanciato è quindi in realtà un alias dello stesso con l&#8217;opzione &#8220;&#8211;color=auto&#8221;.</p>
<p>Le altre funzionalità relative al comando <em>set</em> si trovano nella voce omonima della <em>man page</em> del comando bash.</p>
<p><em><strong>declare</strong></em></p>
<p>Il comando <em>declare</em> è utilizzato per la dichiarazione delle variabili. Generalmente in bash una variabile viene dichiarata automaticamente con la sua definizione:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ FOO=bar</pre></div></div>

<p>dopodiché è utilizzabile con il nome $FOO. Il comando declare consente in fase di dichiarazione di specificare il tipo di variabile oltre che alcuni attributi inerenti al suo utilizzo.<br />
Ad esempio, per dichiarare un array utilizzando il comando declare si utilizzerà l&#8217;opzione &#8220;-a&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ declare -a elementi=(&quot;primo&quot; &quot;secondo&quot; &quot;terzo&quot;)</pre></div></div>

<p>mentre l&#8217;opzione &#8220;-i&#8221; dichiarerà una variabile di tipo integer:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ declare -i numero=10</pre></div></div>

<p><em>declare</em> torna utile in fase di definizione anche per esportare automaticamente le variabili, attraverso l&#8217;opzione &#8220;-x&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ declare -x -i numero=10</pre></div></div>

<p>questo comando ottiene lo stesso effetto di:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ export numero=10</pre></div></div>

<p>ma in più aggiunge anche la definizione del tipo. Infine, attraverso l&#8217;opzione &#8220;-r&#8221; è possibile rendere la variabile <em>readonly</em>, ossia non scrivibile all&#8217;interno della sessione.</p>
<p><em>NOTA: Le variabili di tipo array non sono esportabili a causa di un baco nella BASH (vedere la man page).</em></p>
<p><em><strong>type</strong></em></p>
<p>Il comando <em>type</em> può essere utilizzato per conoscere le caratteristiche relative agli argomenti passati. Attraverso l&#8217;opzione &#8220;-t&#8221; viene restituito il tipo di parametro passato:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ type -t ls
alias
$ type -t /bin/ls
file
$ type -t echo
builtin
$ type -t set_prefix
function
$ type -t while  
keyword</pre></div></div>

<p>E&#8217; da notare la differenza tra &#8220;ls&#8221; e &#8220;/bin/ls&#8221;, rispettivamente un <em>alias</em> (relativo ad un file eseguibile) ed un <em>file</em> eseguibile. Ad un comando di tipo <em>builtin</em> non corrisponde necessariamente un file eseguibile, mentre le ultime due righe rappresentano rispettivamente una funzione disponibile nell&#8217;ambiente ed una parola chiave relativa al linguaggio bash.<br />
Un&#8217;altra opzione supportata dal comando <em>type</em> è &#8220;-a&#8221; che indica tutte le corrispondenze al parametro passato. Ad esempio, relativamente ai comandi precedentemente esposti i risultati saranno i seguenti:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ type -a echo
echo is a shell builtin
echo is /bin/echo
$ type -a ls  
ls is aliased to `ls --color=auto'
ls is /bin/ls
$ type -a set_prefix
set_prefix is a function
set_prefix () 
{ 
    [ -z ${prefix:-} ] || prefix=${cur%/*}/;
    [ -r ${prefix:-}CVS/Entries ] || prefix=&quot;&quot;
}
$ type -a while     
while is a shell keyword</pre></div></div>

<p>il comando <em>echo</em> viene indicato come interno e disponibile inoltre con l&#8217;eseguibile <em>/bin/echo</em>, lo stesso avviene per il comando <em>ls</em> per il quale viene indicata la definizione dell&#8217;alias oltre che il path del file effettivo. Infine la funzione <em>set_prefix</em> viene stampata nella sua interezza, mentre per <em>while</em> rimane l&#8217;indicazione di <em>keyword</em>.</p>
<p><em><strong>exec</strong></em></p>
<p>Il comando <em>exec</em> permette di lanciare un comando utilizzando il <em>process ID</em> (PID) della shell corrente. Questo significa che la shell verrà rimpiazzata dal comando, non generando un nuovo <em>PID</em> e comporta inoltre che il termine del comando corrisponderà con il termine della shell.<br />
Ad esempio, se nell&#8217;ambiente grafico da una console viene lanciato il comando</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ exec xterm</pre></div></div>

<p>alla chiusura della shell del programma <em>xterm</em>, anche la console verrà automaticamente chiusa.</p>
<p><em><strong>jobs</strong></em></p>
<p>Se il comando interno <em>bg</em> viene utilizzato per mandare un processo in background (cioè sullo sfondo del sistema e non in primo piano, mantenendone l&#8217;esecuzione) ed il comando interno <em>fg</em> viene utilizzato invece per mandare in foreground (quindi, in primo piano) un processo, il comando <em>jobs</em> permette di effettuare il listato dei processi e di conoscere informazioni relative a questi.<br />
Supponendo di avere due script denominati <em>script</em> e <em>script1</em> lanciati entrambi automaticamente in background attraverso il carattere speciale <em>&#038;</em> alla fine dell&#8217;invocazione:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ./script &amp;
[1] 28548
$ ./script1 &amp;
[2] 29261</pre></div></div>

<p>Sarà possibile conoscere lo stato dei processi in sospeso attraverso <em>jobs</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ jobs
[1]-  Running                 ./script &amp;
[2]+  Running                 ./script1 &amp;</pre></div></div>

<p>Di questi attraverso l&#8217;opzione &#8220;-l&#8221; si potrà conoscere identificativo e <em>PID</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ jobs -l
[1]- 28548 Running                 ./script &amp;
[2]+ 29261 Running                 ./script1 &amp;</pre></div></div>

<p>O solamente il <em>PID</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ jobs -p
28548
29261</pre></div></div>

<p>Su tali processi sarà possibile effettuare operazioni di <em>kill</em> (considerando il <em>PID</em>):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ kill 28548
$ 
[1]-  Terminated              ./script</pre></div></div>

<p>Oppure operazioni di foregrounding/backgrounding, attraverso i già citati comandi interni <em>fg</em> e <em>bg</em>, considerando invece l&#8217;identificativo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ fg 2
./script1</pre></div></div>

<p>Il tutto grazie ai dati resi disponibili dal comando interno <em>jobs</em>.</p>
<p><strong>Conclusioni</strong></p>
<p>I comandi interni alla bash illustrati e molti altri sono tutti ottimamente documentati all&#8217;interno della già citata man page della Bash (<em>$ man bash</em>), più propriamente nel capitolo &#8220;<em>COMANDI INCORPORATI DELLA SHELL</em>&#8220;.<br />
Nella seconda parte di questo articolo verranno trattate utility di sistema come <em>paste</em>, <em>tee</em>, <em>apropos</em> e molte altre, generalmente poco utilizzate, ma di indubbio interesse.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/09/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-bash-comandi-interni-alla-shell/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RAID Software : Proteggere i dati con l’aiuto del kernel (5 di 5)</title>
		<link>http://www.miamammausalinux.org/2009/04/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-5-di-5/</link>
		<comments>http://www.miamammausalinux.org/2009/04/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-5-di-5/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 07:20:31 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[DRBD]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[NFS]]></category>
		<category><![CDATA[Raid]]></category>
		<category><![CDATA[Samba]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Condivisione dati]]></category>
		<category><![CDATA[Protezione dati]]></category>
		<category><![CDATA[Sistema]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=578</guid>
		<description><![CDATA[Dopo il primo case study relativo all&#8217;impiego di mdadm per la creazione di un sistema RAID 1 con disco estraibile, l&#8217;ultima puntata di questa serie di articoli presenta nel dettaglio una soluzione di network Raid 1 creata attraverso il software drbd, per una replica in rete del disco contenente i dati e la condivisione di [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" title="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>Dopo il primo case study relativo all&#8217;impiego di <em>mdadm</em> per la creazione di un sistema RAID 1 con disco estraibile, l&#8217;ultima puntata di questa serie di articoli presenta nel dettaglio una soluzione di network Raid 1 creata attraverso il software <em>drbd</em>, per una replica in rete del disco contenente i dati e la condivisione di questi attraverso i servizi NFS e SAMBA, in alta affidabilità.</p>
<p><strong>DRBD : Network RAID 1</strong></p>
<p>Fino ad ora sono state illustrate soluzioni RAID applicate a singole macchine, ma è possibile garantire la protezione dai dati anche attraverso RAID distribuiti, in soluzioni ad alta affidabilità. Uno fra i progetti più interessanti in questo ambito, giunto allo stato di piena maturità, è sicuramente DRBD (http://www.drbd.org).<br />
DRBD permette di replicare dati (in mirror, sul modello del RAID 1) da una macchina primaria definita “master” ad una secondaria definita “slave” attraverso una connessione di rete dedicata, tipicamente ottenuta dal collegamento di due schede di rete attraverso un cavo “cross” (senza disporre quindi di uno switch apposito).<br />
Tecnicamente DRBD è un modulo del kernel, proprio come sono moduli quelli del RAID e come per questi moduli la gestione di DRBD è affidata ad una serie di utilities che comprende (come per mdadm) un demone che gestisce ed attiva le configurazioni. La sostanziale differenza tra DRBD ed i moduli standard di RAID è che questo modulo non è ancora incluso nei sorgenti ufficiali del kernel. Per questo motivo prima di poter utilizzare DRBD è necessario compilare il moduli del kernel partendo dai sorgenti.<br />
Tipicamente DRBD viene utilizzato insieme al programma heartbeat, che consente di estenderne le funzionalità attraverso la gestione dei failover. Per failover si intendono tutte quelle situazioni in cui un servizio erogato da una macchina, se questa smette di funzionare, rimane accessibile attraverso una seconda che ne garantisce l&#8217;accessibilità costante.<br />
I servizi erogabili attraverso heartbeat sono molteplici e possono riguardare i più svariati utilizzi : da un webserver ad un database MySQL, per arrivare a dei filesystem condivisi via NFS o SAMBA.<br />
Nel case study di questo paragrafo verranno illustrate le operazioni necessarie all&#8217;installazione di DRBD e alla sua integrazione con heartbeat affinché condivida un filesystem in rete via NFS e SAMBA.</p>
<p><strong>Case Study 2 &#8211; DRBD in una soluzione di alta affidabilità con heartbeat, NFS e SAMBA.</strong></p>
<p>Il seguente case study descrive quanto è stato fatto per la società 3Dvision che effettua consulenza, supervisione e produzione di elaborazioni digitali destinate ai settori pubblicitario, promozionale e televisivo.<br />
La grande quantità di dati trattati e la criticità del loro contenuto hanno sempre imposto la memorizzazione di questi attraverso hardware proprietario. Nella rete era infatti installato un dispositivo NAS (Network Attached Storage), che attraverso un sistema operativo proprietario, rendeva disponibile il proprio spazio.<br />
Nel momento in cui il NAS si è guastato, si è optato per una scelta di radicale cambiamento, basata su hardware di consumo e software Opensource. E&#8217; stato quindi acquistato hardware per creare due macchine identiche ciascuna con processore AMD Sempron 3200 MegaHertz, un GigaByte di RAM, due schede di rete Gigabit e quattro dischi da 300 GigaByte.<br />
L&#8217;obiettivo finale è stato quello di ottenere 1,2 Tb di spazio debitamente protetto e condiviso in rete attraverso SAMBA ed NFS.</p>
<p><strong>Sviluppo del progetto</strong></p>
<p>Su entrambe le macchine è stato installato il sistema operativo Debian Sarge in forma minimale, senza cioè ambiente grafico, attraverso un lettore DVD esterno collegato via USB. In questo modo si sono potuti sfruttare tutti e due i canali IDE per il collegamento dei quattro dischi da 300 GigaByte gestiti attraverso il kernel in RAID 0, per un totale di 1,2 TeraByte di spazio disponibile.<br />
Per ovviare all&#8217;insicurezza dettata dalla scelta del RAID 0 (se un disco dei quattro cessa di funzionare, tutto il sistema cade) si è scelto di effettuare un RAID 1 in rete attraverso DRBD. In questo modo si è sfruttata la capacità di scrittura parallela del RAID 0 e l&#8217;affidabilità della copia dati del Network RAID 1 via DRBD.<br />
Il progetto è rappresentato in figura 5 :</p>
<div id="attachment_579" class="wp-caption alignnone" style="width: 282px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/04/raid-software_articolo_1-10-figura5.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/04/raid-software_articolo_1-10-figura5-272x300.png" alt="Figura 5" title="raid-software_articolo_1-10-figura5" width="272" height="300" class="size-medium wp-image-579" /></a><p class="wp-caption-text">Figura 5</p></div>
<p><strong>Configurazione di DRBD</strong></p>
<p>Al termine delle installazioni lo schema di partizionamento delle macchine è il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ fdisk -l
&nbsp;
Disk /dev/hda: 300.0 GB, 300090728448 bytes
255 heads, 63 sectors/track, 36483 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
&nbsp;
   Device Boot      Start         End      Blocks   Id  System
/dev/hda1               1          30      240943+  82  Linux swap / Solaris
/dev/hda2              31        1246     9767520   83  Linux
/dev/hda3            1247       36483   283041202+  fd  Linux raid autodetect
&nbsp;
Disk /dev/hdb: 300.0 GB, 300090728448 bytes
255 heads, 63 sectors/track, 36483 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
&nbsp;
   Device Boot      Start         End      Blocks   Id  System
/dev/hdb1               1          30      240943+  82  Linux swap / Solaris
/dev/hdb2              31       36483   292808722+  fd  Linux raid autodetect
&nbsp;
Disk /dev/hdc: 300.0 GB, 300090728448 bytes
255 heads, 63 sectors/track, 36483 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
&nbsp;
   Device Boot      Start         End      Blocks   Id  System
/dev/hdc1               1          30      240943+  82  Linux swap / Solaris
/dev/hdc2              31       36483   292808722+  fd  Linux raid autodetect
&nbsp;
Disk /dev/hdd: 300.0 GB, 300090728448 bytes
255 heads, 63 sectors/track, 36483 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
&nbsp;
   Device Boot      Start         End      Blocks   Id  System
/dev/hdd1               1          30      240943+  82  Linux swap / Solaris
/dev/hdd2              31       36483   292808722+  fd  Linux raid autodetect
&nbsp;
Disk /dev/md0: 1189.3 GB, 1189342216192 bytes
2 heads, 4 sectors/track, 290366752 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
&nbsp;
Disk /dev/md0 doesn't contain a valid partition table</pre></div></div>

<p>Ciascuno dei quattro dischi contiene un&#8217;area di swap ed un&#8217;area dedicata al RAID, solo il primo dei quattro contiene una partizione da 10 Giga destinata alla partizione root.<br />
Lo stato del RAID 0 sulle due macchine è il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid5] [multipath] [raid6] [faulty]
md0 : active raid0 hdd2[3] hdc2[2] hdb2[1] hda3[0]
      1161467008 blocks 64k chunks
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p>Entrambe possiedono una device <em>/dev/md0</em> di circa 1,2 TeraByte gestita in RAID 0 dal kernel.<br />
La prima fase del progetto riguarda l&#8217;installazione dei pacchetti necessari a ricompilare il kernel secondo la comodissima metodologia Debian, insieme alle utility ed ai sorgenti di DRBD  :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ apt-get install kernel-source kernel-package bzip2 libncurses5-dev drbd0.7-utils drbd0.7-module-source</pre></div></div>

<p>Per creare il kernel personalizzato vanno decompressi i sorgenti e lanciata la configurazione che va effettuata sulla base dell&#8217;hardware delle macchine impiegate :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cd /usr/src/
$ tar -xjvf kernel-source-2.6.8.tar.bz2
$ cd /usr/src/kernel-source-2.6.8
$ make menuconfig</pre></div></div>

<p>Terminata questa fase, andranno creati i pacchetti relativi al kernel ed ai moduli DRBD :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ make-kpkg --revision 1 --append-to-version rasca-3dv kernel_image
$ make-kpkg --revision 1 --append-to-version rasca-3dv modules_image
$ ls -1 /usr/src/
drbd0.7-module-2.6.8rasca-3dv_0.7.10-4+1_i386.deb
drbd0.7.tar.gz
kernel-image-2.6.8rasca-3dv_1_i386.deb
linux-source-2.6.8
linux-source-2.6.8.tar.bz2
modules</pre></div></div>

<p>E di conseguenza installati :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ dpkg -i kernel-image-2.6.8rasca-3dv_1_i386.deb drbd0.7-module-2.6.8rasca-3dv_0.7.10-4+1_i386.deb</pre></div></div>

<p>Il sistema va avviato col nuovo kernel (vanno ignorati gli errori in fase di boot del demone DRBD in quanto non è stato ancora configurato). Per verificare che il sistema sia stato avviato col nuovo kernel è sufficiente lanciare il comando “uname -a” :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ uname -a
Linux 3dv-ha-1 2.6.8rasca-3dv #1 PREEMPT Sat Jun 17 20:56:39 CEST 2006 i686 GNU/Linux</pre></div></div>

<p>Il sistema è quindi pronto per la configurazione di DRBD. Come da specifiche, le interfacce presenti nel sistema sono 3, eth0 (Gigabit, PCI) collegata alla LAN, eth1 (Gigabit, PCI) collegata attraverso il cavo cross all&#8217;altra macchina e eth2 (Megabit, integrata nella scheda madre) scollegata :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:14:C1:0F:50:AF
          inet addr:192.168.0.8  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:19841 errors:0 dropped:0 overruns:0 frame:0
          TX packets:32402 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:6882512 (6.5 MiB)  TX bytes:42354250 (40.3 MiB)
          Interrupt:177 Base address:0xe000
&nbsp;
eth1      Link encap:Ethernet  HWaddr 00:14:C1:0F:50:AA
          inet addr:10.0.0.1  Bcast:10.0.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:218 (218.0 b)  TX bytes:218 (218.0 b)
          Interrupt:185
&nbsp;
eth2      Link encap:Ethernet  HWaddr 00:15:F2:D0:FC:B9
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:193 Base address:0xa400</pre></div></div>

<p>Il file di configurazione di DRBD è /etc/drbd.conf ed è diviso a blocchi. Per ogni risorsa esiste un blocco nominato “resource” contenente dei sotto-blocchi. Ciascuno dei blocchi si apre e si chiude con una parentesi graffa. Per le esigenze del progetto, la compilazione ideale è la seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">resource drbd0 {
  protocol C;
  incon-degr-cmd &quot;echo '!DRBD! primario sui dati inconsistenti' | wall ; sleep 60 ; halt -f&quot;;
&nbsp;
  startup {
    degr-wfc-timeout 120;
  }
&nbsp;
  disk {
    on-io-error   detach;
  }
&nbsp;
  net {
    timeout       80;
    connect-int   10;
    ping-int      10;
    ko-count      4;
    max-buffers   4096;
    max-epoch-size  2048;
  }
&nbsp;
  syncer {
    rate 650M;
    group 0;
    al-extents 521;
  }
&nbsp;
  on 3dv-ha-1 {
    device     /dev/drbd0;
    disk       /dev/md0;
    address    10.0.0.1:7788;
    meta-disk  internal;
  }
&nbsp;
  on 3dv-ha-2 {
    device    /dev/drbd0;
    disk      /dev/md0;
    address   10.0.0.2:7788;
    meta-disk internal;
  }
}</pre></div></div>

<p>Le opzioni del file sono auto esplicative ed attraverso la man page di drbd.conf è possibile conoscerne tutti i particolare (digitando “man drbd.conf”).<br />
All&#8217;interno del blocco “resource” viene indicato il nome che la device DRBD avrà per il sistema ed il messaggio che il kernel riceverà in caso di malfunzionamento.<br />
Il blocco “startup” contiene il tempo di attesa che in fase di boot il demone DRBD attenderà per ricevere notifica di esistenza da parte della macchina associata.<br />
“disk” è il blocco contenente il tipo di comportamento che il demone dovrà assumere in caso di errori relativi alla device, nel caso descritto sarà “detach” ossia “Stacca”, “Sconnetti”.<br />
Nel blocco “net” sono presenti le dichiarazioni relative al collegamento di rete tra le due macchine ossia il tempo che deve trascorrere tra un ping e l&#8217;altro (necessario per capire se l&#8217;altra macchina è in linea), la grandezza del buffer e così via.<br />
Nel blocco “syncer” è contenuta una tra le opzioni più importanti per le performances, e cioè “rate”. Tale parametro infatti regola il numero massimo di byte per secondo che il demone utilizzerà per replicare i dati tra il computer master e lo slave. Nel caso illustrato tale parametro, in forza alle interfacce Gigabit con cui le due macchine sono collegate fra loro, è stato settato al massimo disponibile, ossia 650 MegaByte.<br />
Gli ultimi due blocchi descrivono le due macchine impiegate nel RAID 1 e per ciascuna la device DRBD utilizzata, il filesystem locale condiviso, l&#8217;IP della macchina, la porta di ascolto del demone DRBD ed il tipo di meta-disk (interno).<br />
Terminata la compilazione del file, che dovrà essere IDENTICO per ciascuna delle due macchine, si potrà procedere al riavvio del servizio DRBD su entrambi i nodi :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ /etc/init.d/drbd restart</pre></div></div>

<p>All&#8217;interno del file /var/log/syslog verranno riportate le fasi di attivazione del Network RAID 1 :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Jun 18 21:14:55 3dv-ha-1 kernel: drbd: module cleanup done.
Jun 18 21:14:55 3dv-ha-1 kernel: drbd: initialised. Version: 0.7.10 (api:77/proto:74)
Jun 18 21:14:55 3dv-ha-1 kernel: drbd: SVN Revision: 1743 build by phil@mescal, 2005-01-31 12:22:07
Jun 18 21:14:55 3dv-ha-1 kernel: drbd: registered as block device major 147
Jun 18 21:14:55 3dv-ha-1 kernel: drbd0: Creating state block
Jun 18 21:14:55 3dv-ha-1 kernel: klogd 1.4.1, ---------- state change ----------
Jun 18 21:14:55 3dv-ha-1 kernel: No module symbols loaded - kernel modules not enabled.
Jun 18 21:14:55 3dv-ha-1 kernel: drbd0: resync bitmap: bits=290333984 words=9072938
Jun 18 21:14:55 3dv-ha-1 kernel: drbd0: size = 1107 GB (1161335936 KB)
Jun 18 21:14:55 3dv-ha-1 kernel: drbd0: Assuming that all blocks are out of sync (aka FullSync)
Jun 18 21:15:00 3dv-ha-1 kernel: drbd0: 1161335936 KB now marked out-of-sync by on disk bit-map.
Jun 18 21:15:00 3dv-ha-1 kernel: drbd0: drbdsetup [3151]: cstate Unconfigured --&gt; StandAlone
Jun 18 21:15:00 3dv-ha-1 kernel: drbd0: drbdsetup [3154]: cstate StandAlone --&gt; Unconnected
Jun 18 21:15:00 3dv-ha-1 kernel: drbd0: drbd0_receiver [3155]: cstate Unconnected --&gt; WFConnection
Jun 18 21:15:10 3dv-ha-1 kernel: drbd0: drbd0_receiver [3155]: cstate WFConnection --&gt; WFReportParams
Jun 18 21:15:10 3dv-ha-1 kernel: drbd0: Handshake successful: DRBD Network Protocol version 74
Jun 18 21:15:10 3dv-ha-1 kernel: drbd0: Connection established.
Jun 18 21:15:10 3dv-ha-1 kernel: drbd0: I am(S): 0:00000001:00000001:00000001:00000001:00
Jun 18 21:15:10 3dv-ha-1 kernel: drbd0: Peer(S): 0:00000001:00000001:00000001:00000001:00
Jun 18 21:15:10 3dv-ha-1 kernel: drbd0: drbd0_receiver [3155]: cstate WFReportParams --&gt; Connected
Jun 18 21:15:10 3dv-ha-1 kernel: drbd0: I am inconsistent, but there is no sync? BOTH nodes inconsistent!
Jun 18 21:15:10 3dv-ha-1 kernel: drbd0: Secondary/Unknown --&gt; Secondary/Secondary</pre></div></div>

<p>I due host avviati da DRBD sono connessi ma il Network RAID 1 non è ancora attivo. Lo si evince dal messaggio “I am inconsistent, but there is no sync?”. Questo perché i due dischi non sono mai stati sincronizzati. Abbiamo comunque la conferma che il primo nodo è primario, quindi ciò che rimane da fare è forzare la prima sincronizzazione attraverso il seguente comando sul nodo master :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ drbdadm -- --do-what-I-say primary all</pre></div></div>

<p>Su entrambi i nodi si può osservare lo stato della ricostruzione, visualizzando lo stato del Network RAID 1 contenuto nel file “drbd” della directory /proc, nella stessa maniera in cui veniva visualizzata la ricostruzione per i RAID creati con mdadm :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/drbd
version: 0.7.10 (api:77/proto:74)
SVN Revision: 1743 build by phil@mescal, 2005-01-31 12:22:07
 0: cs:SyncSource st:Primary/Secondary ld:Consistent
    ns:54361636 nr:0 dw:0 dr:54378020 al:0 bm:3317 lo:27 pe:55 ua:4096 ap:0
        [&gt;...................] sync'ed:  4.9% (1036021/1089109)M
        finish: 5:18:23 speed: 55,492 (54,036) K/sec</pre></div></div>

<p>Lavorando con quantità di dati così ampie, la prima ricostruzione impiegherà poco più di quattro ore per completarsi :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/drbd
version: 0.7.10 (api:77/proto:74)
SVN Revision: 1743 build by phil@mescal, 2005-01-31 12:22:07
 0: cs:SyncSource st:Primary/Secondary ld:Consistent
    ns:738278800 nr:0 dw:0 dr:738295184 al:0 bm:45060 lo:0 pe:6 ua:4096 ap:0
        [=============&gt;......] sync'ed: 66.2% (368133/1089109)M
        finish: 1:53:34 speed: 55,288 (53,956) K/sec</pre></div></div>

<p>Al termine di tale ricostruzione, lo stato del Network RAID 1 è il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/drbd
version: 0.7.10 (api:77/proto:74)
SVN Revision: 1743 build by phil@mescal, 2005-01-31 12:22:07
 0: cs:Connected st:Primary/Secondary ld:Consistent
    ns:1115247744 nr:0 dw:0 dr:1115247744 al:0 bm:68070 lo:0 pe:0 ua:0 ap:0</pre></div></div>

<p>Dal nodo master è quindi possibile creare un filesystem ext3 sulla neo-creata device :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mke2fs -j /dev/drbd0
mke2fs 1.37 (21-Mar-2005)
Etichetta del filesystem=
Tipo SO: Linux
Dimensione blocco=4096 (log=2)
Dimensione frammento=4096 (log=2)
145178624 inode, 290333984 blocchi
14516699 blocchi (5.00%) riservati per l'utente root
Primo blocco dati=0
8861 gruppi di blocchi
32768 blocchi per gruppo, 32768 frammenti per gruppo
16384 inode per gruppo
Backup del superblocco salvati nei blocchi:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848
&nbsp;
Scrittura delle tavole degli inode: fatto
Creazione del journal (8192 blocchi): fatto
Scrittura delle informazioni dei superblocchi e dell'accounting del filesystem: fatto
&nbsp;
Questo filesystem verrà automaticamente controllato ogni 30 mount, o
180 giorni, a seconda di quale venga prima. Usare tune2fs -c o -i per cambiare.</pre></div></div>

<p>Ed infine montare il nuovo filesystem nella directory /store (sempre e solo sul nodo master) :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mount /dev/drbd0 /store</pre></div></div>

<p>Attraverso il comando “df”, è possibile osservare lo stato del Network RAID 1 :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ df -h
Filesystem         Dimens. Usati Disp. Uso% Montato su
/dev/hda2             9,2G 1001M  7,8G  12% /
tmpfs                 443M     0  443M   0% /dev/shm
/dev/drbd0            1,1T   33M  1,1T   1% /store</pre></div></div>

<p>Ma per ottenere quanto stabilito all&#8217;inizio del progetto è necessario spingersi oltre, configurando heartbeat in modo che controlli il filesystem DRBD e ne condivida il contenuto via NFS e SAMBA, in alta affidabilità.<br />
Su ciascuna delle due macchine andranno quindi configurati i due servizi insieme al demone heartbeat.</p>
<p><strong>Configurazione di NFS</strong></p>
<p>La configurazione di NFS va effettuata su entrambe le macchine, in quanto in caso di malfunzionamento di una di queste, l&#8217;altra attraverso heartbeat sarà in grado di continuare ad erogare il servizio.<br />
Per installare il pacchetto <em>nfs-kernel-server</em> è sufficiente lanciare il comando :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ apt-get install nfs-kernel-server</pre></div></div>

<p>l&#8217;installazione di NFS, implica l&#8217;avvio del servizio. Ma in funzione del fatto che tale servizio sarà controllato da heartbeat, il demone va fermato :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ /etc/init.d/nfs-kernel-server stop
Stopping NFS kernel daemon: mountd nfsd.
Unexporting directories for NFS kernel daemon...done.</pre></div></div>

<p>E rimosso dall&#8217;avvio automatico durante il boot del sistema :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ update-rc.d -f nfs-kernel-server remove
update-rc.d: /etc/init.d/nfs-kernel-server exists during rc.d purge (continuing)
 Removing any system startup links for /etc/init.d/nfs-kernel-server ...
   /etc/rc0.d/K80nfs-kernel-server
   /etc/rc1.d/K80nfs-kernel-server
   /etc/rc2.d/S20nfs-kernel-server
   /etc/rc3.d/S20nfs-kernel-server
   /etc/rc4.d/S20nfs-kernel-server
   /etc/rc5.d/S20nfs-kernel-server
   /etc/rc6.d/K80nfs-kernel-server</pre></div></div>

<p>Il servizio NFS tipicamente registra le informazioni di lock dei file nella directory <em>/var/lib/nfs</em>. Nel caso in esame però tale servizio, in caso di malfunzionamento, potrebbe cambiare da una macchina all&#8217;altra. E&#8217; facile capire come nel caso in cui un file venisse bloccato sulla macchina master (quindi con le informazioni di blocco scritte nella directory <em>/var/lib/nfs</em> della macchina master), se il servizio NFS effettuasse uno switch, tali informazioni non sarebbero più disponibili.<br />
Pertanto, è necessario configurare la cartella dei lock sul filesystem condiviso.<br />
Sulla macchina master quindi andrà copiata la cartella <em>/var/lib/nfs</em> in <em>/store</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mv /var/lib/nfs /store/</pre></div></div>

<p>Mentre sul nodo slave, tale directory andrà rimossa :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ rm -rf /var/lib/nfs</pre></div></div>

<p>Il vecchio path andrà infine collegato al nuovo su entrambi i sistemi :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ln -s /store/nfs /var/lib/nfs</pre></div></div>

<p>Sul nodo slave NON esiste la cartella <em>/store/nfs</em>, ma esisterà nel momento in cui il servizio NFS (e quindi il filesystem DRBD) effettuerà lo switch.<br />
Infine, nel file <em>/etc/default/nfs-common</em>, il parametro STATDOPTS andrà modificato così :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">STATDOPTS=&quot;-n 3dv-ha&quot;</pre></div></div>

<p>Questa opzione è necessaria in quanto il demone che controlla gli stati del servizio NFS (STATD) associa gli stati che controlla al nome dell&#8217;host. Anche in questo caso, nel momento in cui la macchina effettuerà lo switch del servizio, il nome host cambierà. Con questa opzione STATD non farà confusione e assocerà gli stati sempre al nome host “virtuale” 3dv-ha.</p>
<p>L&#8217;ultima operazione riguarda la configurazione delle directory condivise nel file /etc/exports su entrambi i nodi :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">/store/Progetti 192.168.0.0/255.255.255.0(rw,async)</pre></div></div>

<p>In questo modo è garantito il permesso a qualsiasi host della rete 192.168.0 di montare in lettura e scrittura la cartella <em>/store/Progetti</em>.</p>
<p><strong>Configurazione di SAMBA</strong></p>
<p>Dopo aver aggiornato i repositories di apt come spiegato nel case study precedente, si può procedere con l&#8217;installazione degli ultimi pacchetti SAMBA disponibili :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ apt-get install samba smbfs smbclient</pre></div></div>

<p>La più semplice delle configurazioni (personalizzabile a seconda delle esigenze) del file <em>/etc/samba/smb.conf</em> potrebbe essere la seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[global]
   workgroup = 3DVISION
   server string = %h server (Samba %v)
   dns proxy = no
   log file = /var/log/samba/log.%m
   max log size = 1000
   syslog = 0
   panic action = /usr/share/samba/panic-action %d
   encrypt passwords = true
   passdb backend = tdbsam guest
   obey pam restrictions = yes
   invalid users = root
   passwd program = /usr/bin/passwd %u
   passwd chat = *EntersnewsUNIXspassword:* %nn *RetypesnewsUNIXspassword:* %nn .
   load printers = no
   socket options = TCP_NODELAY
&nbsp;
[Progetti]
   comment = Progetti
   browsable = yes
   path = /store/Progetti
   guest ok = no
   writable = no
   share modes = no
   write list = @3dvision
   create mask = 0770
   directory mask = 0770</pre></div></div>

<p>Viene quindi garantito l&#8217;accesso in scrittura alla cartella “Progetti” (che è stata creata con maschera 770 ed appartiene all&#8217;utente “3dv_user”) a tutti gli utenti appartenenti al gruppo “3dvision” :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mkdir /store/Progetti
$ chown 3dv_user:3dvision /store/Progetti
$ chmod 770 /store/Progetti
$ ll /store/
totale 28
drwx------  2 root     root     16384 2006-06-19 04:01 lost+found
drwxr-xr-x  4 root     root      4096 2006-06-20 17:47 nfs
drwxrwx---  2 3dv_user 3dvision  4096 2006-06-20 17:52 Progetti</pre></div></div>

<p>Anche per il servizio SAMBA, è necessario rimuovere l&#8217;avvio automatico al boot del sistema :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ update-rc.d -f samba remove
update-rc.d: /etc/init.d/samba exists during rc.d purge (continuing)
 Removing any system startup links for /etc/init.d/samba ...
   /etc/rc0.d/K19samba
   /etc/rc1.d/K19samba
   /etc/rc2.d/S20samba
   /etc/rc3.d/S20samba
   /etc/rc4.d/S20samba
   /etc/rc5.d/S20samba
   /etc/rc6.d/K19samba</pre></div></div>

<p>In questo modo anche il servizio SAMBA è configurato.</p>
<p><strong>Configurazione di Heartbeat</strong></p>
<p>L&#8217;ultima fase relativa al nostro progetto riguarda l&#8217;installazione di heartbeat :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ apt-get install heartbeat</pre></div></div>

<p>Per il quale sarà necessario aggiungere l&#8217;utente “cluster”, necessario per le interrogazioni sullo stato del cluster :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ adduser cluster
Adding user `cluster'...
Adding new group `cluster' (1002).
Adding new user `cluster' (1002) with group `cluster'.
Creating home directory `/home/cluster'.
Copying files from `/etc/skel'
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Modifica delle informazioni relative all'utente cluster
Inserire il nuovo valore o premere INVIO per quello predefinito
        Nome completo []:
        Stanza n° []:
        Numero telefonico di lavoro []:
        Numero telefonico di casa []:
        Altro []:
Is the information correct? [y/N] y</pre></div></div>

<p>Il file di configurazione di heartbeat è <em>/etc/ha.d/ha.cf</em> e per il nodo master sarà il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">logfacility daemon
keepalive 1
deadtime 14
warntime 7
initdead 120
udpport 694
baud 19200
serial /dev/ttyS0
ucast eth1 10.0.0.2
ucast eth0 192.168.0.9
auto_failback off
watchdog /dev/watchdog
node    3dv-ha-1
node    3dv-ha-2
ping 192.168.0.69
respawn cluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=cluster uid=cluster
deadping 30
logfile /var/log/ha.log</pre></div></div>

<p>Senza studiare a fondo ciascuna delle opzioni, ciò che interessa di più sono i parametri “ucast” che dovranno variare dal nodo master al nodo slave, in quanto rappresentano gli indirizzi IP attraverso i quali avverrà lo scambio delle informazioni per l&#8217;alta affidabilità (l&#8217;heartbeat appunto o “battito cardiaco”). Tali opzioni infatti sul nodo slave saranno esattamente l&#8217;opposto :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">ucast eth1 10.0.0.1
ucast eth0 192.168.0.8</pre></div></div>

<p>Heartbeat necessita per la sicurezza della creazione di una chiave di autenticazione :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ dd if=/dev/urandom count=4 2&gt;/dev/null | md5sum | cut -c1-32
e0fb55565622e3a893a808ee16f70538</pre></div></div>

<p>Questo comando, da eseguire sulla sola macchina master, produrrà un output il cui contenuto andrà immesso nel file <em>/etc/ha.d/authkeys</em> su entrambe le macchine, con questa struttura :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">auth 1
1 sha1 e0fb55565622e3a893a808ee16f70538</pre></div></div>

<p>Su questo file andranno settati i permessi e la proprietà all&#8217;utente cluster :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ chmod 600 /etc/ha.d/authkeys
$ chown cluster:cluster /etc/ha.d/authkeys</pre></div></div>

<p>Rimangono quindi da creare due file su entrambi i nodi : il primo nominato “/etc/heartbeat/resource.d/sleep” con questo contenuto :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">sleep $1</pre></div></div>

<p>La cui funzione sarà quella di immettere una pausa (della durata del parametro passato) durante lo switch del servizio. Tale pausa eviterà di incorrere nell&#8217;errore “Stale NFS file handle” (per il quale esiste ampia documentazione in internet) che potrebbe influenzare il regolare funzionamento del servizio.<br />
Il secondo file da creare è <em>/etc/heartbeat/resource.d/killnfsd</em> con questo contenuto :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">killall -9 nfsd</pre></div></div>

<p>Che permetterà ad heartbet durante lo switch del servizio di uccidere eventuali processi NFS residui non più controllati.<br />
A questi script appena creati vanno assegnati i permessi di esecuzione :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ chmod 755 /etc/heartbeat/resource.d/killnfsd
$ chmod 755 /etc/heartbeat/resource.d/sleep</pre></div></div>

<p>Come ultimo passo per la configurazione, va creato il file <em>/etc/ha.d/haresources</em>, all&#8217;interno del quale verranno dichiarate le risorse condivise da heartbeat :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">3dv-ha-1 IPaddr::192.168.0.10/24/eth0 drbddisk::drbd0 Filesystem::/dev/drbd0::/store::ext3 killnfsd nfs-common nfs-kernel-server samba sleep::3</pre></div></div>

<p>La struttura del file è molto semplice, viene indicato il nodo master, ossia 3dv-ha-1, l&#8217;indirizzo IP virtuale a cui i servizi risponderanno ed i servizi stessi, cioè DRBD, NFS e SAMBA insieme agli script di controllo.<br />
Heartbeat è quindi pronto ad essere avviato :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ /etc/init.d/heartbeat start</pre></div></div>

<p>E ne si può seguire l&#8217;evoluzione nel file <em>/var/log/ha.log</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ tail -f /var/log/ha.log
heartbeat: 2006/06/20_18:34:07 info: Running /etc/ha.d/rc.d/ip-request-resp ip-request-resp
heartbeat: 2006/06/20_18:34:07 received ip-request-resp IPaddr::192.168.0.10/24/eth0 OK yes
heartbeat: 2006/06/20_18:34:07 info: Acquiring resource group: 3dv-ha-1 IPaddr::192.168.0.10/24/eth0 drbddisk::drbd0 Filesystem::/dev/drbd0::/store::ext3 killnfsd nfs-common nfs-kernel-server samba sleep::3
heartbeat: 2006/06/20_18:34:07 info: Running /etc/ha.d/resource.d/IPaddr 192.168.0.10/24/eth0 start
heartbeat: 2006/06/20_18:34:07 info: /sbin/ifconfig eth0:0 192.168.0.10 netmask 255.255.255.0   broadcast 192.168.0.255
heartbeat: 2006/06/20_18:34:07 info: Sending Gratuitous Arp for 192.168.0.10 on eth0:0 [eth0]
heartbeat: 2006/06/20_18:34:07 /usr/lib/heartbeat/send_arp -i 1010 -r 5 -p /var/lib/heartbeat/rsctmp/send_arp/send_arp-192.168.0.10 eth0 192.168.0.10 auto 192.168.0.10 ffffffffffff
heartbeat: 2006/06/20_18:34:07 info: Running /etc/ha.d/resource.d/drbddisk drbd0 start
heartbeat: 2006/06/20_18:34:07 info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /store ext3 start
heartbeat: 2006/06/20_18:34:08 info: Running /etc/ha.d/resource.d/killnfsd  start
heartbeat: 2006/06/20_18:34:08 ERROR: Return code 1 from /etc/ha.d/resource.d/killnfsd
heartbeat: 2006/06/20_18:34:08 info: Running /etc/init.d/nfs-common  start
heartbeat: 2006/06/20_18:34:08 info: Running /etc/init.d/nfs-kernel-server  start
heartbeat: 2006/06/20_18:34:08 info: Running /etc/init.d/samba  start
heartbeat: 2006/06/20_18:34:11 info: Running /etc/ha.d/resource.d/sleep 3 start</pre></div></div>

<p>L&#8217;unico errore rilevato (“ERROR: Return code 1 from /etc/ha.d/resource.d/killnfsd”) si può ignorare, in quanto non esistono processi residui per NFS e l&#8217;esito dell&#8217;operazione “killall” è comunque coerente.</p>
<p>Per effettuare un test, da una macchina remota, è possibile montare lo share in NFS :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mount -t nfs 192.168.0.10:/store/Progetti /mnt/</pre></div></div>

<p>Se l&#8217;esito del comando mount sarà positivo, si potrà provare a creare un file all&#8217;interno dello share:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ls -la /mnt/
$ touch /mnt/test-ha</pre></div></div>

<p>Per effettuare una prova di corretto failover basterà spegnere il nodo master e verificare che lo slave prenda il suo posto e sia quindi altamente affidabile.<br />
Mettendosi “in ascolto” sul file di log della macchina slave e spegnendo il nodo master si può controllare quanto succede :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ tail -f /var/log/ha.log
heartbeat: 2006/06/20_18:39:51 info: Received shutdown notice from '3dv-ha-1'.
heartbeat: 2006/06/20_18:39:51 info: Resources being acquired from 3dv-ha-1.
heartbeat: 2006/06/20_18:39:51 info: acquire local HA resources (standby).
heartbeat: 2006/06/20_18:39:51 info: local HA resource acquisition completed (standby).
heartbeat: 2006/06/20_18:39:51 info: Standby resource acquisition done [all].
heartbeat: 2006/06/20_18:39:51 info: No local resources [/usr/lib/heartbeat/ResourceManager listkeys 3dv-ha-2] to acquire.
heartbeat: 2006/06/20_18:39:51 info: Running /etc/ha.d/rc.d/status status
heartbeat: 2006/06/20_18:39:51 info: Taking over resource group IPaddr::192.168.0.10/24/eth0
heartbeat: 2006/06/20_18:39:51 info: Acquiring resource group: 3dv-ha-1 IPaddr::192.168.0.10/24/eth0 drbddisk::drbd0 Filesystem::/dev/drbd0::/store::ext3 killnfsd nfs-common nfs-kernel-server samba sleep::3
heartbeat: 2006/06/20_18:39:51 info: Running /etc/ha.d/resource.d/IPaddr 192.168.0.10/24/eth0 start
heartbeat: 2006/06/20_18:39:51 info: /sbin/ifconfig eth0:0 192.168.0.10 netmask 255.255.255.0   broadcast 192.168.0.255
heartbeat: 2006/06/20_18:39:51 info: Sending Gratuitous Arp for 192.168.0.10 on eth0:0 [eth0]
heartbeat: 2006/06/20_18:39:51 /usr/lib/heartbeat/send_arp -i 1010 -r 5 -p /var/lib/heartbeat/rsctmp/send_arp/send_arp-192.168.0.10 eth0 192.168.0.10 auto 192.168.0.10 ffffffffffff
heartbeat: 2006/06/20_18:39:51 info: Running /etc/ha.d/resource.d/drbddisk drbd0 start
heartbeat: 2006/06/20_18:39:51 info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /store ext3 start
heartbeat: 2006/06/20_18:39:51 info: Running /etc/ha.d/resource.d/killnfsd  start
heartbeat: 2006/06/20_18:39:51 ERROR: Return code 1 from /etc/ha.d/resource.d/killnfsd
heartbeat: 2006/06/20_18:39:52 info: Running /etc/init.d/nfs-common  start
heartbeat: 2006/06/20_18:39:52 info: Running /etc/init.d/nfs-kernel-server  start
heartbeat: 2006/06/20_18:39:52 info: Running /etc/init.d/samba  start
heartbeat: 2006/06/20_18:39:55 info: Running /etc/ha.d/resource.d/sleep 3 start
heartbeat: 2006/06/20_18:39:58 info: /usr/lib/heartbeat/mach_down: nice_failback: foreign resources acquired
heartbeat: 2006/06/20_18:39:58 info: mach_down takeover complete.
heartbeat: 2006/06/20_18:39:58 info: mach_down takeover complete for node 3dv-ha-1.
heartbeat: 2006/06/20_18:40:06 WARN: node 3dv-ha-1: is dead
heartbeat: 2006/06/20_18:40:06 info: Dead node 3dv-ha-1 gave up resources.
heartbeat: 2006/06/20_18:40:23 info: Link 3dv-ha-1:eth1 dead.
heartbeat: 2006/06/20_18:40:23 info: Link 3dv-ha-1:eth0 dead.</pre></div></div>

<p>Le due righe :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">heartbeat: 2006/06/20_18:39:58 info: mach_down takeover complete.
heartbeat: 2006/06/20_18:39:58 info: mach_down takeover complete for node 3dv-ha-1.</pre></div></div>

<p>confermano che il failover è stato eseguito con successo.<br />
Per il client che montava la cartella remota tutto si è svolto in maniera trasparente, ed il mount point risponde a dovere :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ls /mnt/
test-ha</pre></div></div>

<p>Stessi test possono essere effettuati per SAMBA.<br />
E&#8217; da notare che nel momento in cui si accenderà nuovamente il nodo master, ad erogare il servizio sarà sempre il nodo slave che cederà le risorse solo in caso di  spegnimento o di rottura di componenti hardware.</p>
<p>Anche la descrizione di questo progetto viene conclusa con il giudizio della società : &#8220;<em>Questo tipo di sistema ci ha permesso di memorizzare la totalità dei dati che gestiamo e di avere la sicurezza nella ridondanza dei dati. A questo si aggiunge il risparmio sensibile dettato dall&#8217;hardware impiegato.</em>&#8221; &#8211; Dario Colombo, Amministratore Delegato di 3Dvision</p>
<p><strong>Conclusioni</strong></p>
<p>Le potenzialità offerte dalla gestione del RAID software da parte del kernel Linux sono notevoli e questa lunga panoramica lo ha dimostrato. Quello che rimane da fare è cercare di spingere il più possibile le aziende a sperimentare queste soluzioni, perché dopo la logica diffidenza iniziale, rimane solo la soddisfazione di aver fatto una scelta che ha portato un incremento della produttività, un risparmio ed un sistema al passo con i tempi.</p>
<p><strong>Bibliografia essenziale</strong></p>
<p>“The Software-RAID HOWTO” di Jakob Østergaard ed Emilio Bueso <a href="http://www.tldp.org/HOWTO/Software-RAID-HOWTO.html">http://www.tldp.org/HOWTO/Software-RAID-HOWTO.html</a></p>
<p>“$ man mdadm”</p>
<p>“DRBD”<br />
<a href="http://www.drbd.org/">http://www.drbd.org/</a></p>
<p>“DRBD : Linux HA”</p>
<p>http://linux-ha.org/DRBD</p>
<p>“$ man drbd.conf”</p>
<p><strong>Ringraziamenti</strong></p>
<p>Questo documento esiste grazie anche ad alcune persone che mi hanno aiutato nei momenti critici. Grazie quindi a Lorenzo Panarello per le revisioni, al Morby per i consigli sull&#8217;applicazione pratica dei RAID ed a mia moglie per la pazienza, in quanto credo che ormai in fatto di RAID ne sappia più di me.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/04/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-5-di-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RAID Software : Proteggere i dati con l’aiuto del kernel (4 di 5)</title>
		<link>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-4-di-5/</link>
		<comments>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-4-di-5/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 08:19:29 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Raid]]></category>
		<category><![CDATA[Samba]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Condivisione dati]]></category>
		<category><![CDATA[Protezione dati]]></category>
		<category><![CDATA[Sistema]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=575</guid>
		<description><![CDATA[Nel precedente articolo è stato affrontato l&#8217;argomento della messa in RAID della partizione di root, partendo da un&#8217;installazione standard o da un sistema già esistente. In questa penultima parte della serie viene affrontato un case study relativo all&#8217;impiego di mdadm per la creazione di un sistema RAID 1 con disco estraibile. Case Study 1 &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" title="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>Nel precedente articolo è stato affrontato l&#8217;argomento della messa in RAID della partizione di root, partendo da un&#8217;installazione standard o da un sistema già esistente.<br />
In questa penultima parte della serie viene affrontato un case study relativo all&#8217;impiego di <em>mdadm</em> per la creazione di un sistema RAID 1 con disco estraibile.</p>
<p><strong>Case Study 1 &#8211; RAID 1 con HD ide “a cassetto”</strong></p>
<p>Il seguente Case study descrive il progetto realizzato per la società &#8220;Immagine &#038; Dettaglio&#8221; che si occupa di architettura d&#8217;interni, progettazione architettonica e di grafica.<br />
L&#8217;esigenza primaria della società era di ottenere la gestione centralizzata dei dati e rimpiazzare il vetusto impianto per i backup, rappresentato da un DAT (Digital Audio Tape) a cassette, con un progetto che offrisse maggiore sicurezza nella registrazione dei dati, minori costi e la possibilità di trasportare tali backup in luoghi diversi dall&#8217;ufficio in cui risiedeva il sistema, per ridurre al minimo la possibilità di perdita totale di tutti i dati.<br />
Il progetto ha quindi previsto il riutilizzo di una vecchia macchina (denominata “ied-storage” con processore Intel Celeron 1000 MegaHertz, 256 MegaByte di RAM ed un disco da 20 GigaByte), l&#8217;acquisto di tre dischi IDE da 300 GigaByte e due kit per hard disk estraibili.<br />
Questi kit, visibili nella Foto 1 risultano facilmente installabili in qualsiasi slot da 5 pollici e ¼ (ossia lo slot dei lettori cd/dvd) e consentono di collegare un cassetto ad uno dei canali IDE della scheda madre e di rendere il disco che viene inserito all&#8217;interno di questo, estraibile.</p>
<div id="attachment_576" class="wp-caption alignnone" style="width: 160px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-foto1.jpg"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-foto1-150x150.jpg" alt="Foto 1" title="raid-software_articolo_1-10-foto1" width="150" height="150" class="size-thumbnail wp-image-576" /></a><p class="wp-caption-text">Foto 1</p></div>
<p>Sul canale IDE primario della scheda madre sono stati quindi collegati il disco del sistema operativo da 20 GigaByte (come Master) ed il lettore DVD (come Slave) mentre sul canale IDE secondario è stato collegato uno dei dischi da 300 GigaByte (come Master) ed il cassetto IDE (come Slave).<br />
Utilizzando la tecnologia RAID software offerta dal kernel Linux per realizzare un mirror (RAID 1) sui dischi collegati al secondo canale IDE oltre ad avere 300 GigaByte di spazio disponibile in rete, ne si garantisce il completo backup.<br />
Inoltre, attraverso delle sostituzioni schedulate del disco (ad esempio una volta la settimana), si garantisce la possibilità di trasportare il contenuto del disco lontano dall&#8217;ufficio, avere tre copie dello stesso dato ad ogni sostituzione e nella peggiore delle ipotesi, ossia quella in cui entrambi i dischi collegati alla macchina si rompano, una sola settimana di ritardo nei backup (presenti sul disco estratto la settimana precedente).<br />
Sul disco primario da 20 GigaByte è stato installato come sistema operativo Debian Sarge 3.1, mentre i due dischi hdc e hdd non sono stati configurati.</p>
<p><strong>Sviluppo del progetto</strong></p>
<p>Lo stato del sistema al primo boot è il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ df -h
Filesystem         Dimens. Usati Disp. Uso% Montato su
/dev/hda2            19,2G 1001M 17,8G  12% /
tmpfs                 443M     0  443M   0% /dev/shm</pre></div></div>

<p>Una partizione root da 19 GigaByte, una swap da 500 MegaByte.<br />
Su ciascuno dei due dischi <em>hdc</em> e <em>hdd</em> vanno quindi create due partizioni <em>hdc1</em> ed <em>hdd1</em> (ad esempio attraverso il programma fdisk) della massima grandezza disponibile (quindi 300 GigaByte) ed il RAID 1 ad esse associato:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm --create /dev/md0 --level=1 --raid-disks=2 /dev/hdc1 /dev/hdd1
mdadm: array /dev/md0 started.</pre></div></div>

<p>Al termine della sincronizzazione lo stato del RAID è il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 hdd1[1] hdc1[0]
      2993440 blocks [2/2] [UU]
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p>La fase successiva prevede la creazione del filesystem sulla device <em>md0</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mke2fs -j /dev/md0</pre></div></div>

<p>Ed il suo montaggio nella directory <em>/mnt</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mount /dev/md0 /mnt</pre></div></div>

<p>In questo modo è possibile muovere l&#8217;attuale contenuto della cartella <em>/home</em> all&#8217;interno del nuovo filesystem, questo perché l&#8217;obiettivo finale vuole essere quello di rendere lo spazio offerto dal RAID 1 condiviso attraverso SAMBA, che nella configurazione standard condivide le directory home di ciascun utente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mv /home/* /mnt/</pre></div></div>

<p>Una volta smontata la cartella <em>/mnt</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ umount /mnt/</pre></div></div>

<p>E&#8217; possibile associare all&#8217;interno del file <em>/etc/fstab</em> la device <em>/dev/md0</em> al mount point <em>/home</em>, aggiungendo nel file <em>/etc/fstab</em> la seguente riga:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">/dev/md0        /home           ext3    defaults        0       0</pre></div></div>

<p>E forzarne il mount con il comando <em>mount -a</em>, verificando che sia poi correttamente montata:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mount -a
$ mount
...
...
/dev/md0 on /home type ext3 (rw)</pre></div></div>

<p><strong>Configurazione di SAMBA</strong></p>
<p>Nell&#8217;installare SAMBA come prima cosa, all&#8217;interno del file <em>/etc/apt/sources.list</em> di entrambe le macchine, vanno aggiunti i repositories SAMBA per le ultime versioni:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">deb http://it.samba.org/samba/ftp/Binary_Packages/Debian sarge samba</pre></div></div>

<p>In questo modo pur utilizzando una distribuzione stabile (Sarge) i cui pacchetti relativi a SAMBA sarebbero aggiornati a versioni precedenti alle ultime disponibili, si potrà disporre dei pacchetti allo stato dell&#8217;arte.<br />
Effettuata la modifica, è necessario lanciare l&#8217;aggiornamento dei repositories:</p>

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

<p>Quindi installare SAMBA lasciando il file di configurazione così com&#8217;è, in modo che condivida le cartelle homes di tutti gli utenti (configurazione di default):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ apt-get install samba smbfs smbclient</pre></div></div>

<p>Una volta creato un utente locale nel sistema ed in SAMBA:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ adduser ied-user1
$ passwd ied-user1
$ smbpasswd -a ied-user1</pre></div></div>

<p>Lo spazio presente nel RAID 1 è accessibile dai client Microsoft Windows della rete che effettuino il login con l&#8217;utenza “ied-user1”.</p>
<p><strong>Sostituire il disco estraibile</strong></p>
<p>A completamento del progetto, rimane da schedulare uno spegnimento forzato della macchina necessario alla sostituzione del disco. Inutile dire che il disco non può essere estratto a caldo, pertanto si è stato scelto di spegnere la macchina ogni venerdì, manualmente o attraverso la schedulazione del crontab sostituendo il disco prima di riaccenderla. L&#8217;unico accorgimento che va preso in questo senso riguarda la forzatura dell&#8217;aggiunta del nuovo disco esterno all&#8217;interno del RAID. La motivazione è che controller software del kernel, trovandosi un persistent superblock differente sul disco che è stato sostituito, giudica il RAID in stato inconsistente.<br />
Per ovviare, è sufficiente fare in modo che ad ogni avvio di sistema venga lanciato il seguente comando:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm -a /dev/md0 /dev/hdd1</pre></div></div>

<p>Tale comando nel caso che il disco non cambi non effettuerà alcuna operazione, giudicando il disco “already added”, nel caso che il disco ed il <em>persistent superblock</em> siano differenti, lo aggiungerà avviandone in contemporanea la re sincronizzazione, operazione che impiegherà per una capacità di 300 Giga circa 100 minuti.<br />
Il comando lanciato può essere incluso in uno script denominato ad esempio /etc/init.d/mdadm-raid-recovery, dal seguente contenuto:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Script per il recovery del secondo disco di RAID.</span>
&nbsp;
mdadm <span style="color: #660033;">-a</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>md0 <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>hdd1</pre></div></div>

<p>Ed incluso fra gli script di avvio in questo modo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ update-rc.d mdadm-raid-recovery start 20 2 3 4 5 .
 Adding system startup for /etc/init.d/mdadm-raid-recovery ...
   /etc/rc2.d/S20mdadm-raid-recovery -&gt; ../init.d/mdadm-raid-recovery
   /etc/rc3.d/S20mdadm-raid-recovery -&gt; ../init.d/mdadm-raid-recovery
   /etc/rc4.d/S20mdadm-raid-recovery -&gt; ../init.d/mdadm-raid-recovery
   /etc/rc5.d/S20mdadm-raid-recovery -&gt; ../init.d/mdadm-raid-recovery</pre></div></div>

<p>ad ogni avvio del sistema verrà effettuato questo controllo e l&#8217;eventuale aggiunta del disco inserito.<br />
In caso sia presente un nuovo disco, verrà sincronizzato e messo in linea, di modo da garantire, al momento della sostituzione e prima di qualsiasi altra nuova scrittura, tre copie identiche dello stesso dato.</p>
<p>Ecco il giudizio sul progetto espresso dalla società : “<em>L&#8217;utilizzo di un backup come questo ci ha permesso di avere la totale sicurezza per i dati e la possibilità di conservare una copia di essi lontano dalla sede. A tutto questo si aggiunge il risparmio dovuto al fatto di aver usato una macchina dismessa insieme all&#8217;acquisto dei tre dischi e dei relativi kit.</em>” &#8211; Luciana Ferrari, Amministratore unico di “Immagine &#038; Dettaglio”</p>
<p><strong>Conclusioni</strong></p>
<p>Nel prossimo ed ultimo articolo verrà illustrato il secondo <em>case study</em>: un network RAID 1 attraverso DRBD.</p>
<p><strong>Note</strong></p>
<p>Questa serie di articoli è apparsa in origine nel libro edito da Duke Italia <a href="http://www.hitechshop.it/detail.asp?idT=&#038;idC=&#038;idP=1&#038;Pid=34483&#038;testo=clustering%20e%20raid%20software">Clustering e raid software</a> allegato all&#8217;edizione italiana di <em>Linux Journal</em> dell&#8217;Ottobre 2006.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-4-di-5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RAID Software : Proteggere i dati con l’aiuto del kernel (3 di 5)</title>
		<link>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-3-di-5/</link>
		<comments>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-3-di-5/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 14:09:03 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Raid]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Protezione dati]]></category>
		<category><![CDATA[Sistema]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=565</guid>
		<description><![CDATA[Nel precedente articolo sono stati illustrati i metodi per la messa in RAID di partizioni nei diversi livelli disponibili. Di seguito viene affrontata la messa in RAID della partizione root del sistema, sia nel caso di una nuova installazione, sia nel caso di un&#8217;installazione già esistente. Il tutto sempre grazie al software Linux mdadm. Mettere [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" title="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>Nel precedente articolo sono stati illustrati i metodi per la messa in RAID di partizioni nei diversi livelli disponibili.<br />
Di seguito viene affrontata la messa in RAID della partizione root del sistema, sia nel caso di una nuova installazione, sia nel caso di un&#8217;installazione già esistente. Il tutto sempre grazie al software Linux <em>mdadm</em>.</p>
<p><strong>Mettere in RAID la partizione root</strong></p>
<p>Sino a questo punto sono state illustrate soluzioni RAID applicate a partizioni diverse da root (intesa come &#8220;/&#8221;, non come la directory /root), Linux però, offre anche la possibilità di montare la partizione root su una device RAID.<br />
Le situazioni di partenza possono essere due : costruire un sistema partendo da una situazione vergine, oppure disporre di un sistema che non può essere cancellato, ma che si vuole mettere sotto RAID.<br />
Se da una situazione vergine ogni distribuzione offre la possibilità di impostare in fase di configurazione la partizione root in modo che risieda su una device RAID, migrare un sistema esistente può risultare leggermente più complicato.<br />
Verranno descritti entrambi le situazioni possibili, supponendo che il sistema possieda due dischi da 300 Giga collegati al canale IDE primario (quindi hda e hdb) e che si voglia mettere la partizione root sotto RAID 1 (o mirror). </p>
<p><strong>Situazione 1 : Nuova installazione con RAID sulla partizione root creato attraverso l&#8217;installer</strong></p>
<p>La maggior parte delle distribuzioni offre la possibilità di configurare in fase di installazione la partizione root in modo che risieda sotto una device RAID. I passi descritti e gli screenshot associati si riferiscono all&#8217;installer di Debian Sarge 3.1, ma concettualmente sono applicabili a tutte le distribuzioni.<br />
Verranno descritte solo le fasi che riguardano la configurazione dei dischi in quanto a parte queste, l&#8217;installazione su RAID non si differenzia in alcun modo da una standard.<br />
Attraverso il tool di configurazione dei dischi, andranno per prima cosa create per ogni disco una partizione di tipo &#8220;Volume fisico per il RAID&#8221; e la relativa swap :</p>
<div id="attachment_564" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-1.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-1-300x225.png" alt="Screenshot 1" title="raid-software_articolo_1-10-screenshot-1" width="300" height="225" class="size-medium wp-image-564" /></a><p class="wp-caption-text">Screenshot 1</p></div>
<div id="attachment_566" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-2.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-2-300x225.png" alt="Screenshot 2" title="raid-software_articolo_1-10-screenshot-2" width="300" height="225" class="size-medium wp-image-566" /></a><p class="wp-caption-text">Screenshot 2</p></div>
<p>Successivamente, selezionando &#8220;Configurare il RAID software&#8221; si accederà al menu di configurazione multidisk per il RAID software :</p>
<div id="attachment_567" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-3.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-3-300x225.png" alt="Screenshot 3" title="raid-software_articolo_1-10-screenshot-3" width="300" height="225" class="size-medium wp-image-567" /></a><p class="wp-caption-text">Screenshot 3</p></div>
<p>Selezionando l&#8217;opzione &#8220;Creare un device multidisk&#8221;, si potrà scegliere il tipo di multidisk da creare. Come stabilito, la scelta che verrà adottata verterà sul RAID 1, o mirror :</p>
<div id="attachment_568" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-4.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-4-300x225.png" alt="Screenshot 4" title="raid-software_articolo_1-10-screenshot-4" width="300" height="225" class="size-medium wp-image-568" /></a><p class="wp-caption-text">Screenshot 4</p></div>
<p>A questo punto andranno indicate al programma di installazione il numero di partizioni attive nel RAID (nel nostro caso 2) :</p>
<div id="attachment_569" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-5.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-5-300x225.png" alt="Screenshot 5" title="raid-software_articolo_1-10-screenshot-5" width="300" height="225" class="size-medium wp-image-569" /></a><p class="wp-caption-text">Screenshot 5</p></div>
<p>Ed il numero di device &#8220;spare&#8221;, utile soprattutto nei livelli di RAID 4 e 5, e che in questo caso potrà quindi rimanere 0 :</p>
<div id="attachment_570" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-6.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-6-300x225.png" alt="Screenshot 6" title="raid-software_articolo_1-10-screenshot-6" width="300" height="225" class="size-medium wp-image-570" /></a><p class="wp-caption-text">Screenshot 6</p></div>
<p>Per completare le informazioni sul RAID necessarie al programma di installazione, andranno indicate le partizioni attive per il RAID. Le due che sono state indicate durante il partizionamento con il tipo &#8220;Volume fisico per il RAID&#8221; :</p>
<div id="attachment_571" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-7.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-7-300x224.png" alt="Screenshot 7" title="raid-software_articolo_1-10-screenshot-7" width="300" height="224" class="size-medium wp-image-571" /></a><p class="wp-caption-text">Screenshot 7</p></div>
<p>Sulla neo creata device &#8220;RAID 1 dispositivo n° 0&#8243; andrà infine creato il filesystem ext3 associato alla partizione root, e terminate queste modifiche, la situazione dei dischi sarà la seguente :</p>
<div id="attachment_572" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-8.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-screenshot-8-300x225.png" alt="Screenshot 8" title="raid-software_articolo_1-10-screenshot-8" width="300" height="225" class="size-medium wp-image-572" /></a><p class="wp-caption-text">Screenshot 8</p></div>
<p>Per completare il tutto, sarà necessario “Terminare il partizionamento e scrivere i cambiamenti sui dischi”, procedendo poi per il resto dell&#8217;installazione nella maniera consueta.</p>
<p><strong>Situazione 2 : Sistema preesistente, creazione del RAID sulla partizione root attraverso una distribuzione &#8220;Live&#8221;</strong></p>
<p>Nell&#8217;eventualità in cui non si possa cancellare un&#8217;installazione esistente e si voglia comunque fare in modo che la partizione root sia sotto RAID verrà proposta tra le tante disponibili una soluzione che prevede l&#8217;uso di una distribuzione “Live”, necessaria per l&#8217;avvio del sistema con la partizione root non montata, e di un disco USB, necessario per il backup dei dati presenti sulla partizione root.<br />
A sistema avviato, una volta collegato il disco USB, andranno copiate in una cartella nominata “oldroot” le cartelle di sistema ritenute critiche  :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mkdir /media/usb0/oldroot
$ cp -Rp /bin  /boot /dev /etc /home /lib /mnt /opt  /root  /sbin /tmp /usr /var /media/usb0/oldroot</pre></div></div>

<p>L&#8217;opzione -Rp del comando cp consente di percorrere ricorsivamente le directory e di copiarne il contenuto mantenendo permessi, proprietario, gruppo e date.<br />
Le cartelle indicate sono quelle giudicate &#8220;critiche&#8221;, ma nulla vieta in presenza di altri dati sensibili di copiarli nello stesso sistema.<br />
Essenziale è comunque avere nella directory <em>/meda/usb0/oldroot</em> del disco USB il contenuto attuale del sistema.<br />
Il sistema andrà riavviato quindi con una distribuzione &#8220;Live&#8221; recente come &#8220;Knoppix&#8221;, &#8220;Ubuntu&#8221; o qualsiasi altra tra le numerose disponibili.<br />
Una volta avviato il sistema si dovrà creare la device virtuale md0 composta dalle due partizioni appartenenti ai diversi dischi :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm --create /dev/md0 --level=1 --raid-disks=2 /dev/hda1 /dev/hdb1
mdadm: array /dev/md0 started.</pre></div></div>

<p>Terminata la sincronizzazione, sarà possibile creare il filesystem sulla device <em>md0</em>  :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mke2fs -j /dev/md0</pre></div></div>

<p>e montarlo su una cartella qualsiasi, copiandoci sopra le cartelle precedentemente salvate sul disco esterno :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mkdir /target
$ mount /dev/md0 /target
$ cd /media/usb0/oldroot
$ cp -Rp /bin  /boot /dev /etc /home /lib /mnt /opt  /root  /sbin /tmp /usr /var /target</pre></div></div>

<p>Alla struttura delle cartelle della partizione root andranno aggiunte le cartelle virtuali di sistema <em>/proc</em> e <em>/sys</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mkdir /target/proc
$ mkdir /target/sys</pre></div></div>

<p>Per completare i lavori ed installare il bootloader che dovrà avviare il sistema dalla device RAID, sarà sufficiente lanciare una shell interattiva nella cartella /target attraverso il comando chroot :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ chroot /target</pre></div></div>

<p>E dopo aver montato il filesystem <em>/proc</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mount -t proc - /proc</pre></div></div>

<p>Editare il file <em>/boot/grub/menu.lst</em> (supponendo che sia grub il bootloader installato nel sistema) con le specifiche necessarie all&#8217;avvio dalla device RAID :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">default	0
timeout	5
color		cyan/blue	white/blue
&nbsp;
title		Debian GNU/Linux , kernel 2.6.8-2-386
root		(hd0,0)
kernel	/boot/vmlinuz-2.6.8-2-386 root=/dev/md0 ro
initrd	/boot/initrd.img-2.6.8-2-386 root=/dev/md0 ro
savedefault
boot
&nbsp;
title		Debian GNU/Linux , kernel 2.6.8-2-386 (Single)
root		(hd0,0)
kernel	/boot/vmlinuz-2.6.8-2-386 root=/dev/md0 ro single
initrd	/boot/initrd.img-2.6.8-2-386 root=/dev/md0 ro
savedefault
boot</pre></div></div>

<p>Anche se a differenza di lilo, grub non necessita di essere reinstallato ogni volta che ne si modifica il contenuto del file di configurazione, lanciare il comando <em>grub-install</em> aiuta a comprendere come il bootloader debba risiedere comunque nel master boot record del disco primario, visto che sarà quella la posizione da cui il BIOS avvierà il sistema operativo :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ grub-install /dev/hda
Installation is finished. No errors reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the line is incorrect,
fix it and re-run the script 'grub-install'.
&nbsp;
(hd0)	/dev/hda
(hd1)	/dev/hdb</pre></div></div>

<p>Ultimo passo da eseguire prima del riavvio è la modifica nel file <em>/etc/fstab</em> della riga che fa riferimento alla partizione <em>/</em>, in modo che non venga più montata su <em>/dev/hda1</em> ma su <em>/dev/md0</em>. Il contenuto di tale file dovrà quindi essere il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# &lt;file system&gt; &lt;mount point&gt;   &lt;type&gt;  &lt;options&gt;       &lt;dump&gt;  &lt;pass&gt;
proc		/proc	proc	defaults			0       0
/dev/md0	/	ext3	defaults,errors=remount-ro	0       1
/dev/hda2	none	swap	sw				0       0
/dev/hdb2	none	swap	sw				0       0</pre></div></div>

<p>A questo punto il sistema è pronto ad essere riavviato ed utilizzato.</p>
<p><strong>Verifica del funzionamento</strong></p>
<p>In entrambe le situazioni, per verificare che le operazioni siano andate a buon fine, sarà sufficiente controllare attraverso il comando mount che la device <em>/dev/md0</em> sia montata nella cartella <em>/</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mount
/dev/md0 on / type ext3 (rw,errors=remount-ro)
...
...</pre></div></div>

<p>L&#8217;output conferma che tutto funziona come dovrebbe.</p>
<p><strong>Considerazione finale sulle aree di swap</strong></p>
<p>Anche se potrebbe risultare immediato pensare che volendo effettuare un mirror dell&#8217;intero sistema, anche la partizione di swap debba essere duplicata, non c&#8217;è niente di più sbagliato.<br />
Le aree di swap del sistema infatti sono gestite a livello di kernel ed è il kernel a sfruttarle a seconda delle necessità. Mettere in RAID 1 una partizione di swap comporterebbe una perdita di performance notevole. Nel momento in cui il kernel  scrivesse sulla partizione di swap primaria un&#8217;informazione, il sistema dovrebbe attendere che tale informazione venisse replicata anche sulla partizione swap secondaria. Tale informazione però non verrebbe mai utilizzata da nessuno ! Se a questo si aggiunge che il contenuto della partizione di swap è volatile, si capisce come sia molto più sensato indicare al sistema due aree di swap distinte, una sul primo disco ed una sul secondo, dichiarandole attraverso l&#8217;installer (si veda lo screenshot-8) o modificando a mano il file /etc/fstab in modo che contenga le seguenti righe :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">/dev/hda2       none            swap    sw              0       0
/dev/hdb2       none            swap    sw              0       0</pre></div></div>

<p>In questo modo il kernel avrà due aree swap a cui far riferimento, e le performance ne gioveranno.</p>
<p><strong>Conclusioni</strong></p>
<p>Nel prossimo articolo verrà illustrato il primo dei due &#8220;case study&#8221;, una soluzione RAID 1 con Hard Disk ide &#8220;a cassetto&#8221;.</p>
<p><strong>Note</strong></p>
<p>Questa serie di articoli è apparsa in origine nel libro edito da Duke Italia <a href="http://www.hitechshop.it/detail.asp?idT=&#038;idC=&#038;idP=1&#038;Pid=34483&#038;testo=clustering%20e%20raid%20software">Clustering e raid software</a> allegato all&#8217;edizione italiana di <em>Linux Journal</em> dell&#8217;Ottobre 2006.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-3-di-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RAID Software : Proteggere i dati con l’aiuto del kernel (2 di 5)</title>
		<link>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-2-di-5/</link>
		<comments>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-2-di-5/#comments</comments>
		<pubDate>Mon, 16 Mar 2009 09:26:56 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Raid]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Protezione dati]]></category>
		<category><![CDATA[Sistema]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=559</guid>
		<description><![CDATA[Nel precedente articolo sono state introdotte le diverse tipologie di RAID ed i concetti di parità per la gestione della ridondanza. Di seguito viene affrontata nel dettaglio la creazione e l&#8217;amministrazione dei RAID attraverso il software Linux mdadm per configurare il sistema in modo che gestisca i diversi tipi di ridondanza sui dischi disponibili. RAID [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" title="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>Nel precedente articolo sono state introdotte le diverse tipologie di RAID ed i concetti di parità per la gestione della ridondanza.<br />
Di seguito viene affrontata nel dettaglio la creazione e l&#8217;amministrazione dei RAID attraverso il software Linux <em>mdadm</em> per configurare il sistema in modo che gestisca i diversi tipi di ridondanza sui dischi disponibili.</p>
<p><strong>RAID software con Linux</strong></p>
<p>Per poter gestire via software i RAID, è necessario che il kernel utilizzato disponga del supporto   “Multiple devices driver support” insieme al “RAID Support” ed a tutti i moduli relativi ai livelli di RAID che si vogliono utilizzare. Nei kernel precompilati che vengono installati dalle più diffuse distribuzioni questi moduli sono compresi, quindi è necessario porre attenzione solo in caso di kernel compilati “a mano”.<br />
Il modulo principale che si occupa della gestione dei RAID è denominato “md” (Multiple Disk) che è un alias di “md-mod”. Per verificare che il kernel installato sulla macchina utilizzata abbia questo supporto è sufficiente provare a caricare il modulo :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ modprobe md</pre></div></div>

<p>Se il comando non restituisce errori, all&#8217;interno del filesystem virtuale /proc verrà creato un file denominato mdstat contenente le informazioni sullo stato della controller RAID software :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities :
unused devices: &lt;none&gt;</pre></div></div>

<p>Lo stato del RAID, non avendo effettuato alcuna configurazione, è nullo, ma l&#8217;output ricevuto conferma che il sistema supporta il tipo di operazioni che vogliamo effettuare.<br />
A questo punto andranno create le devices, i dispositivi virtuali associati ai RAID. Generalmente in Linux, tali devices vengono nominate con mdX dove X è un numero che partendo da 0 identifica tutti gli array gestiti dal sistema.</p>
<p><strong>Creare i RAID con mdadm</strong></p>
<p>In Linux originariamente, la gestione del RAID software era affidata ad una suite di programmi denominata raidtools che comprendeva una serie di eseguibili attraverso i quali era possibile creare, modificare ed amministrare i RAID software. Nelle recenti distribuzioni il pacchetto raidtools è stato rimpiazzato dal programma mdadm. Oltre a contenere notevoli migliorie, esso presenta l&#8217;indubbio vantaggio di consentire la gestione totale dei RAID di sistema attraverso un unico comando.<br />
mdadm è incluso come pacchetto binario in tutte le distribuzioni recenti, mentre i sorgenti sono disponibili a questo indirizzo : <a href="http://www.cse.unsw.edu.au/~neilb/source/mdadm/">http://www.cse.unsw.edu.au/~neilb/source/mdadm/</a> .</p>
<p>Prima di cominciare è necessario avere ben chiaro ciò che si vuole ottenere. Tenendo come riferimento i pregi ed i difetti di ciascun livello illustrati poco sopra bisogna capire quale livello si adatta di più all&#8217;obiettivo che si vuole raggiungere.<br />
Se ad esempio, la sicurezza dei dati è un fattore secondario e si necessita di performance e quanto più spazio possibile, sarà sensato creare un RAID 0, se invece i dati registrati sono di importanza critica, allora converrà optare per un RAID 1 a discapito delle performance, oppure per un RAID 5 nel caso in cui i dischi utilizzabili siano tre o più e si voglia aumentare la velocità di accesso ai dati.<br />
Una volta fatta la scelta sul livello da implementare, è necessario scegliere se si vuole mettere sotto RAID l&#8217;intero sistema, compresa quindi la partizione root (ossia “/”), oppure solo alcune partizioni. Tratteremo successivamente la messa in RAID della partizione root, gli esempi illustrati riguardano l&#8217;implementazione su partizioni diverse da quella principale. Nel caso particolare sono state utilizzate le partizioni hda5, hda6 ed hda7 tutte di 250 MegaByte. Avrebbe più senso utilizzare partizioni che risiedano su dischi differenti, ed in ambienti di produzione questo è vivamente consigliato, ma per comprendere i meccanismi di funzionamento di mdadm questo tipo di situazione è più che sufficiente. Vincolante è la dimensione delle partizioni che deve essere quantomeno simile per tutte quelle impiegate.<br />
Al comando mdadm, andranno passati come parametri il nome della device che si vorrà creare (ad esempio <em>/dev/md0</em>), il numero di dischi  impiegati nell&#8217;array ed infine le partizioni che ne faranno parte.</p>
<p><em>RAID 0</em></p>
<p>Come primo esempio verrà creato un RAID 0 (striping) con le due partizioni hda5 ed hda6. Il comando che andrà eseguito, sarà il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm --create /dev/md0 -a --level=0 --raid-disks=2 /dev/hda5 /dev/hda6
mdadm: array /dev/md0 started.</pre></div></div>

<p>il messaggio “mdadm: array /dev/md0 started.” indica che il processo di creazione del RAID 0 è stato avviato con successo. Ciò è verificabile consultando il contenuto del file <em>/proc/mdstat</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0]
md0 : active raid0 hda6[1] hda5[0]
      498688 blocks 64k chunks
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p>L&#8217;output mostra come tra le “Personalities” (i tipi di raid disponibili) sia presente il RAID 0 e che la controller software gestisce la device md0 che poggia su di un Raid0 formato da hda5 e hda6 (nell&#8217;ordine sono i dischi con identificativo 0 e 1).<br />
La device <em>md0</em> è composta da 498.688 blocchi (ciascuno da 1024 byte), per un totale di circa 500 Mb che equivale alla somma delle dimensioni dei nostri dischi.<br />
L&#8217;ultimo valore mostrato è la “Chunck size” che riguarda la dimensione dei blocchi minima registrabile su ciascun disco dell&#8217;array. Ad esempio se va registrato un dato da 128k, il sistema registrerà 64k sul primo disco ed i rimanenti 64 sul secondo. Nel caso del Raid1 la chunk size non viene indicata in quanto i dati registrati non devono essere divisi per i dischi ma replicati così come sono su ciascuno di questi. Nel RAID 5 la chunk size è la dimensione del blocco di parità.</p>
<p><em>RAID 1</em></p>
<p>Nell&#8217;ambito della creazione di un RAID 1 il comando non cambierà di molto, l&#8217;unico parametro differente sarà “level” per il quale andrà indicato 1, il numero corrispondente al RAID “striping” :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm --create /dev/md0 --level=1 --raid-disks=2 /dev/hda5 /dev/hda6
mdadm: array /dev/md0 started.</pre></div></div>

<p>Anche in questo caso è possibile seguire lo stato del nuovo RAID creato :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0] [raid1]
md0 : active raid1 hda6[1] hda5[0]
      249344 blocks [2/2] [UU]
      [=================&gt;...]  resync = 86.0% (216000/249344) finish=0.0min speed=6156K/sec
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p>Si nota dall&#8217;output ottenuto che la device md0 è in stato “resync”. Perché a differenza del RAID 0, unico RAID che non prevede la replicazione dei dati, i due dischi devono sincronizzarsi, processo per il quale, a seconda della grandezza relativa alle partizioni impiegate, è necessario del tempo.<br />
Terminato il “resync”, il contenuto di mdstat sarà il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0] [raid1]
md0 : active raid1 hda6[1] hda5[0]
      249344 blocks [2/2] [UU]
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p>Adesso il RAID 1 è completamente attivo. L&#8217;output rispetto alle operazioni precedenti è leggermente differente, infatti oltre alle informazioni relative al tipo di raid impiegato ed al numero di blocchi disponibili nella device <em>md0</em> esistono anche due voci che indicano lo stato dei dischi che fanno parte del RAID. La voce <em>[2/2]</em>  indica con il primo numero il totale dei dischi che fanno parte dell&#8217;array ed il secondo il numero di device attive nell&#8217;array. La voce <em>[UU]</em> indica invece che entrambi i dischi sono in stato “Up”. Come vedremo in seguito, se uno dei dischi entra in stato “Failure” la lettera “U” verrà rimpiazzata dal carattere “_”.</p>
<p><em>RAID 4</em></p>
<p>La creazione di un Raid4 implica che le partizioni impiegate debbano essere tre o più. Una di queste andrà dichiarata come “spare” e conterrà le informazioni di parità :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm --create /dev/md0 --level=4 --raid-disks=2 /dev/hda5 /dev/hda6 --spare-disks=1 /dev/hda
mdadm: array /dev/md0 started.</pre></div></div>

<p>Osservando attraverso il filesystem <em>/proc</em> lo stato del RAID, si nota come le partizioni <em>hda6</em> ed <em>hda5</em> risultano entrambe in stato UP, mentre è in corso la sincronizzazione della partizione <em>hda7</em>, che presenta la dicitura “(S)” che sta ad indicare come questa sia la partizione di spare :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid5]
md0 : active raid5 hda7[2](S) hda6[1] hda5[0]
      249344 blocks level 4, 64k chunk, algorithm 0 [2/2] [UU]
      [=================&gt;...]  resync = 88.1% (220368/249344) finish=0.0min speed=6485K/sec
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p>Quando l&#8217;operazione di sincronizzazione verrà completata lo stato del RAID sarà il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid5]
md0 : active raid5 hda7[2](S) hda6[1] hda5[0]
      249344 blocks level 4, 64k chunk, algorithm 0 [2/2] [UU]
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p><em>RAID 5</em></p>
<p>Anche nel caso di un Raid5 le partizioni impiegate devono essere tre o più di tre :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm --create /dev/md0 --level=5 --raid-disks=3 /dev/hda5 /dev/hda6 /dev/hda7
mdadm: array /dev/md0 started.</pre></div></div>

<p>A differenza delle precedenti operazioni di “resync”, la controller software  effettua un “recovery”. Questo perché il Raid5 non replica i dati in maniera lineare tra i dischi impiegati ma li divide gestendone la parità :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid5]
md0 : active raid5 hda7[3] hda6[1] hda5[0]
      498688 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
      [================&gt;....]  recovery = 84.0% (209920/249344) finish=0.1min speed=3463K/sec
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p>Terminata la fase di “recovery” lo stato del Raid5 sarà il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid5]
md0 : active raid5 hda7[2] hda6[1] hda5[0]
      498688 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p>I blocchi impiegati in questo livello sono  498688, corrispondenti a circa 500 Mb, come nell&#8217;esempio del Raid0, con la sola differenza che le partizioni impiegate in questo caso sono tre e che quindi il totale di spazio disponibile equivale a due terzi della somma delle dimensioni delle tre partizioni.<br />
La “chunk size” è la stessa, mentre viene indicato il tipo di algoritmo utilizzato dalla controller software che è 2 ed equivale al default. Se approfondendo i metodi di gestione della parità (che non verranno trattati nell&#8217;articolo) si volessero scegliere altri tipi di algoritmo implementabili, basterà in fase di creazione dell&#8217;array indicare con il parametro “&#8211;parity” il tipo di algoritmo desiderato.</p>
<p><strong>SET FAULTY o come simulare la sostituzione di un disco :</strong></p>
<p>Prima di procedere con la creazione del filesystem sulla device md0 creata, verrà simulato il crash di un disco all&#8217;interno del Raid5 appena creato, in modo da capire come agire in questo tipo di situazioni.<br />
Supponiamo infatti che anziché essere tre partizioni locali, queste siano divise in tre dischi distinti.<br />
Forziamo il malfunzionamento della prima partizione dell&#8217;array, hda5 :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm /dev/md0 --set-faulty /dev/hda5
mdadm: set /dev/hda5 faulty in /dev/md0</pre></div></div>

<p>Il RAID 5 è ancora attivo, ma sta funzionando con solo due partizioni su tre. In caso di rottura di un&#8217;ulteriore disco, cesserebbe di funzionare :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid5]
md0 : active raid5 hda7[2] hda6[1] hda5[3](F)
      498688 blocks level 5, 64k chunk, algorithm 2 [3/2] [_UU]
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p><em>[_UU]</em> indica che i dischi disponibili sono due su tre ed il primo di questi non sta funzionando.<br />
Procediamo quindi con la rimozione dall&#8217;array e successivamente con la rimozione fisica dalla macchina :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm /dev/md0 --remove /dev/hda5
mdadm: hot removed /dev/hda5</pre></div></div>

<p>A questo punto, una volta collegato il nuovo disco, questo andrà reintrodotto nell&#8217;array :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm /dev/md0 --add /dev/hda5
mdadm: hot added /dev/hda5</pre></div></div>

<p>La controller di sistema inizierà ad effettuare il “recovery” del nuovo disco introdotto ed al termine di questa operazione, l&#8217;array sarà nuovamente attivo :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid5]
md0 : active raid5 hda5[0] hda7[2] hda6[1]
      498688 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
&nbsp;
unused devices: &lt;none&gt;</pre></div></div>

<p><em>[UUU]</em> indica infatti che i tre dischi sono di nuovo attivi.</p>
<p><strong>Registrare la struttura del RAID</strong></p>
<p>Durante la creazione del RAID mdadm ha registrato su ogni disco facente parte dell&#8217;array il “Persistent SuperBlock”. Quest&#8217;area, posta all&#8217;inizio del disco, memorizza le informazioni di appartenenza del disco all&#8217;interno del RAID. Questo consente al kernel di rilevare la struttura del RAID in fase di boot senza doversi leggere le informazioni da un file di configurazione ed ovviamente facilita la possibilità di far risiedere la partizione root su RAID.<br />
Può succedere però che in caso di rottura di uno dei dischi si debba ricostruire la struttura senza le informazioni presenti nel “Persistent Superblock”.<br />
Per ovviare a questo inconveniente è consigliabile registrare le informazioni del RAID creato all&#8217;interno del file <em>/etc/mdadm.conf</em>, che verrà consultato solo all&#8217;occorrenza.<br />
I semplici passi da seguire sono questi :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ echo 'DEVICE /dev/hda[567]' &gt; /etc/mdadm/mdadm.conf
$ mdadm  --examine  --scan --config=mdadm.conf &gt;&gt; /etc/mdadm/mdadm.conf</pre></div></div>

<p>A questo punto il file <em>mdadm.conf</em> conterrà quanto segue :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat /etc/mdadm/mdadm.conf
DEVICE /dev/hda[567]
ARRAY /dev/md0 level=raid5 num-devices=3 UUID=59e81780:c30962ed:c4aa02bd:4dd9dcae</pre></div></div>

<p>Ovviamente il parametro “DEVICE” rispecchia gli esempi proposti sinora, se si impiegheranno dischi diversi questi andranno indicati con le stesse modalità. Se nell&#8217;array che si è costruito vengono utilizzate ad esempio le partizioni <em>hda1</em>, <em>hda2</em> e <em>hdb1</em> e <em>hdb2</em> e <em>hdc3</em>, il parametro “DEVICE” sarà il seguente  :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">DEVICE /dev/hd[ab][12] /dev/hdc3</pre></div></div>

<p><strong>Creare un filesystem sulla device /dev/md0</strong></p>
<p>L&#8217;ultimo passo da effettuare prima di cominciare ad utilizzare l&#8217;array per la registrazione di dati è quello di creare un filesystem sulla device <em>/dev/md0</em> :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mke2fs -j /dev/md0
mke2fs 1.39-WIP (31-Dec-2005)
Etichetta del filesystem=
Tipo SO: Linux
Dimensione blocco=1024 (log=0)
Dimensione frammento=1024 (log=0)
124928 inode, 498688 blocchi
24934 blocchi (5.00%) riservati per l'utente root
Primo blocco dati=1
61 gruppi di blocchi
8192 blocchi per gruppo, 8192 frammenti per gruppo
2048 inode per gruppo
Backup del superblocco salvati nei blocchi:
        8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409
...
...</pre></div></div>

<p>A questo punto, montando la device su una directory locale, il filesystem sarà disponibile per l&#8217;utilizzo nel sistema :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mount /dev/md0 /raid5
$ df -h /raid5/
Filesystem         Dimens. Usati Disp. Uso% Montato su
/dev/md0              472M  8,1M  440M   2% /raid5</pre></div></div>

<p>Per rendere permanente la disponibilità del filesystem sarà necessario aggiungere la seguente riga in /etc/fstab :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">/dev/md0        /raid5          ext3    defaults        0       0</pre></div></div>

<p>Ad ogni riavvio del sistema, il RAID verrà montato nella directory /raid5.</p>
<p><strong>Monitorare i RAID</strong></p>
<p>In Debian, oltre ad avere un eseguibile richiamabile da linea di comando, il pacchetto mdadm contiene anche un demone che monitora lo stato dei RAID e segnala con una e-mail eventuali malfunzionamenti. La configurazione di questo demone è contenuta nel file /etc/default/mdadm :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">START_DAEMON=true
MAIL_TO=&quot;root&quot;
AUTOSTART=true</pre></div></div>

<p>I parametri sono auto esplicativi, si può scegliere se avviare mdadm come un demone, a quale mail segnalare malfunzionamenti ed infine se il demone si deve avviare durante il boot di sistema.<br />
Per le distribuzioni che non prevedono l&#8217;impiego di un demone per la gestione delle notifiche di malfunzionamento, è comunque possibile monitorare lo stato dei RAID passando il parametro “&#8211;monitor” al comando mdadm :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mdadm --monitor –mail=casella@dominio.com --delay=1800 /dev/md0</pre></div></div>

<p><strong>Conclusioni</strong></p>
<p>Nel prossimo articolo verranno presentate diverse soluzioni per mettere in Raid la partizione / del filesystem.</p>
<p><strong>Note</strong></p>
<p>Questa serie di articoli è apparsa in origine nel libro edito da Duke Italia <a href="http://www.hitechshop.it/detail.asp?idT=&#038;idC=&#038;idP=1&#038;Pid=34483&#038;testo=clustering%20e%20raid%20software">Clustering e raid software</a> allegato all&#8217;edizione italiana di <em>Linux Journal</em> dell&#8217;Ottobre 2006.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-l%e2%80%99aiuto-del-kernel-2-di-5/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>RAID Software : Proteggere i dati con l&#8217;aiuto del kernel (1 di 5)</title>
		<link>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-laiuto-del-kernel-1-di-5/</link>
		<comments>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-laiuto-del-kernel-1-di-5/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 09:31:08 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Raid]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Protezione dati]]></category>
		<category><![CDATA[Sistema]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=543</guid>
		<description><![CDATA[In questo saggio verranno analizzate le diverse tipologie di RAID esistenti e come queste possano essere implementate in Linux attraverso il kernel ed il programma mdadm. Attraverso poi l&#8217;illustrazione di due storie di successo, verranno presentate delle soluzioni di RAID che permettano di gestire dei backup programmati e di avere sistemi ad alta affidabilità che [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" title="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>In questo saggio verranno analizzate le diverse tipologie di RAID esistenti e come queste possano essere implementate in Linux attraverso il <em>kernel</em> ed il programma <em>mdadm</em>.<br />
Attraverso poi l&#8217;illustrazione di due storie di successo, verranno presentate delle soluzioni di RAID che permettano di gestire dei backup programmati e di avere sistemi ad alta affidabilità che gestiscano quantità di dati nell&#8217;ordine dei <em>TeraByte</em>.<br />
In questa prima parte verranno illustrate le diverse tipologie di RAID ed analizzati i concetti di parità per la gestione della ridondanza.</p>
<p><strong>RAID : Redundant Array of Inexpensive Disks</strong></p>
<p>Quando si parla di RAID, in italiano “batteria ridondante di dischi a basso costo”, si intende una collezione di due o più dischi sui quali vengono registrati dei dati secondo determinati livelli logici. Tali livelli sono generalmente gestiti attraverso hardware specifico, in alcuni casi integrato nelle schede madri ed in altri presente in schede esterne denominate <em>controller</em>.<br />
Meno frequente è l&#8217;impiego di sistemi RAID gestiti via software. Tali sistemi, grazie alla rapida evoluzione dei software non rappresentano più qualcosa di pionieristico e con l&#8217;abbassamento del costo dell&#8217;hardware, studiare soluzioni affidabili che impieghino RAID software è sicuramente una scelta vincente.<br />
Linux può funzionare da <em>controller</em> RAID software nella stessa maniera in cui funzionano quelle hardware. Tutto questo è reso possibile oltre che dalla struttura del <em>kernel</em>, anche dall&#8217;elevata potenza di calcolo dei moderni processori (anche di fascia medio-bassa) che consentono di gestire i dati registrati sui dischi non riducendo in maniera sensibile le performance del sistema.<br />
Ma lo sfruttamento delle potenzialità del <em>kernel</em> Linux non si ferma qui. Esistono progetti Opensource che consentono estendere le funzionalità di RAID verso obiettivi insperati. E&#8217; il caso del progetto “DRBD”, che consente la creazione di RAID su computer diversi connessi in rete (in soluzioni ad alta affidabilità).<br />
Come tutto questo sia applicabile alla realtà verrà illustrato nelle prossime pagine.</p>
<p><strong>I livelli di RAID disponibili in Linux</strong></p>
<p>I livelli di RAID implementabili via software attraverso il kernel Linux sono essenzialmente quattro. Quale livello utilizzare dipende essenzialmente da tre fattori che sono la disponibilità di dischi, la sicurezza e le prestazioni. Definita l&#8217;importanza di questi fattori, si potrà proseguire nell&#8217;analisi delle soluzioni disponibili.</p>
<p><em>RAID 0 (Striping)</em></p>
<p>Viene impiegato laddove si hanno a disposizione un minimo di due dischi approssimativamente della stessa grandezza. La capacità di memoria viene combinata tramite la suddivisione in blocchi dei dati su dischi diversi. L&#8217;accesso ai blocchi può avvenire parallelamente, garantendo performances ottimali. Inconveniente di questo tipo di RAID è che non esiste ridondanza, che significa perdita dei dati in caso di malfunzionamento di uno dei dischi.</p>
<div id="attachment_544" class="wp-caption alignnone" style="width: 265px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-figura1.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-figura1-255x300.png" alt="Figura1" title="raid-software_articolo_1-10-figura1" width="255" height="300" class="size-medium wp-image-544" /></a><p class="wp-caption-text">Figura1</p></div>
<p><em>RAID 1 (Mirroring)</em></p>
<p>Viene scelto generalmente quando non si può prescindere dall&#8217;integrità dei dati. La struttura prevede l&#8217;esistenza di due dischi, l&#8217;uno replica esatta dell&#8217;altro. Il dato viene scritto su entrambi i dischi e se uno dei due cessa di funzionare, l&#8217;informazione rimane comunque disponibile sull&#8217;altro. A sfavore di questa scelta sono la limitazione dello spazio disponibile (in pratica quello di un solo disco) e la perdita di performances in caso di massicce scritture.</p>
<div id="attachment_545" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-figura2.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-figura2-300x155.png" alt="Figura2" title="raid-software_articolo_1-10-figura2" width="300" height="155" class="size-medium wp-image-545" /></a><p class="wp-caption-text">Figura2</p></div>
<p><em>RAID 4 (Dedicated parity)</em></p>
<p>Questa tipologia di RAID si rifà al concetto di parità dedicata. Su uno dei tre, o più dischi impiegati, verranno registrate le informazioni di parità, ossia le informazioni che servono a preservare la ridondanza dei dati.<br />
Ad esempio utilizzando tre dischi (Figura3), i dati verranno distribuiti sui primi due mentre il terzo conterrà le parità. In caso di rottura di uno dei tre dischi, se questo è uno dei due contenente i dati, una volta sostituito, potrà essere ricostruito partendo dalle informazioni di parità. Se invece a rompersi sarà il disco di parità, i dati saranno ancora accessibili, ma nel nuovo disco andranno ricalcolate le stesse.<br />
La sicurezza è legata, quindi, all&#8217;affidabilità dei dischi ed in particolare al disco di parità, rotto quello, il RAID assume uno stato instabile. Le prestazioni sono elevate in quanto è possibile l&#8217;accesso parallelo a blocchi su dischi differenti. Lo spazio disponibile sarà la somma delle dimensioni di tutti i dischi escluso quello di parità.</p>
<div id="attachment_546" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-figura3.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-figura3-300x145.png" alt="Figura3" title="raid-software_articolo_1-10-figura3" width="300" height="145" class="size-medium wp-image-546" /></a><p class="wp-caption-text">Figura3</p></div>
<p><em>RAID 5 (Distributed parity)</em></p>
<p>Il RAID 5 differisce dal RAID 4 solo nel fatto che le informazioni di parità anziché essere registrate su di un disco a parte sono invece distribuite su tutti i dischi facenti parte dell&#8217;array. Anche in questo caso devono esserci un minimo di tre dischi, ed in caso di rottura di uno dei tre, i dati contenuti in questo saranno ricostruiti partendo dalle informazioni di parità presenti negli altri due (Figura4).<br />
Il livello garantisce sicurezza e performances, ma sono necessari un minimo di tre dischi per la sua realizzazione. Lo spazio disponibile sarà anche in questo caso la somma delle dimensioni di tutti i dischi meno uno (che rappresenta le parità distribuite tra i dischi).</p>
<div id="attachment_547" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-figura4.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/raid-software_articolo_1-10-figura4-300x139.png" alt="Figura4" title="raid-software_articolo_1-10-figura4" width="300" height="139" class="size-medium wp-image-547" /></a><p class="wp-caption-text">Figura4</p></div>
<p>Oltre ai livelli illustrati, Linux rende disponibile anche il livello Linear che prevede la concatenazione dei dischi sulla linea del Raid 0 ma senza scritture parallele (in pratica quando un disco viene riempito, si passa al successivo) ed il livello 6, un livello 5 con parità raddoppiata. E&#8217; difficile vedere entrambi impiegati in ambienti di produzione e pertanto non verranno trattati negli esempi.</p>
<p><strong>Il calcolo delle parità</strong></p>
<p>Prima di proseguire è necessario approfondire il discorso relativo al calcolo delle parità.<br />
La parità viene ottenuta attraverso il risultato di un&#8217;operazione di XOR sui bit che fanno parte dell&#8217;informazione. Un&#8217;operazione di XOR tra due bit fornisce risultato 0 quando i due bit hanno uguale valore (cioè sono entrambi 1 o entrambi 0), mentre restituisce 1 quando i bit hanno valori opposti (il primo 1 ed il secondo 0, o viceversa).<br />
Si supponga che A, B, C e D rappresentino quattro dischi impiegati in un ipotetico Raid4 mentre “P” rappresenti il disco contenente le parità :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">A B C D  P
1 0 0 1  0
0 0 0 1  1
0 0 1 1  0
0 1 1 0  0</pre></div></div>

<p>Il valore contenuto nella colonna P è il risultato delle operazioni di XOR. Nella prima riga il bit di A è 0, in XOR con il bit di B 0 che risulta 1, che in XOR con il bit C 0 risulta 1, che in XOR con il bit di D 1 risulta 0. 0 è il bit di parità. La verifica immediata la si ottiene facendo il percorso inverso. Simulando cioè un disco in stato “failure” che viene rimpiazzato :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">A B C D  P
1 0 X 1  0
0 0 X 1  1
0 0 X 1  0
0 1 X 0  0</pre></div></div>

<p>il valore del bit C sarà il seguente :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">C = (((P XOR D) XOR B) XOR A)</pre></div></div>

<p>Per la prima riga ad esempio :</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">C = (((0 XOR 1) XOR 0) XOR 1) = 0</pre></div></div>

<p>Compreso questo si capisce come l&#8217;informazione di parità consenta di ricostruire il dato presente sul disco guasto partendo dal confronto con il dato associato ancora presente.<br />
L&#8217;applicazione di quanto dimostrato è visibile in Figura3 e Figura4.</p>
<p><strong>Conclusioni</strong></p>
<p>Terminata la panoramica teorica delle soluzioni RAID, nel prossimo articolo queste verranno applicate alla realtà di Linux.</p>
<p><strong>Note</strong></p>
<p>Questa serie di articoli è apparsa in origine nel libro edito da Duke Italia <a href="http://www.hitechshop.it/detail.asp?idT=&#038;idC=&#038;idP=1&#038;Pid=34483&#038;testo=clustering%20e%20raid%20software">Clustering e raid software</a> allegato all&#8217;edizione italiana di <em>Linux Journal</em> dell&#8217;Ottobre 2006.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/03/raid-software-proteggere-i-dati-con-laiuto-del-kernel-1-di-5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

