<?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!</title>
	<atom:link href="http://www.miamammausalinux.org/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>Tue, 27 Jul 2010 12:03:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Introduzione alla virtualizzazione con KVM</title>
		<link>http://www.miamammausalinux.org/2010/07/introduzione-alla-virtualizzazione-con-kvm/</link>
		<comments>http://www.miamammausalinux.org/2010/07/introduzione-alla-virtualizzazione-con-kvm/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 10:30:31 +0000</pubDate>
		<dc:creator>Francesco Pedrini</dc:creator>
				<category><![CDATA[KVM]]></category>
		<category><![CDATA[Virtualizzazione]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1082</guid>
		<description><![CDATA[La virtualizzazione è una tecnologia che sta prendendo sempre più piede nell&#8217;informatica moderna grazie alla diffusione di hardware sempre più potente, in grado di far girare più sistemi operativi in maniera concorrente. In questo articolo introdurremo i concetti di base della virtualizzazione e ci soffermeremo su KVM, uno dei progetti liberi più attivi nel campo [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/07/kvm.png" alt="kvm" title="kvm" width="100" height="31" class="alignnone size-full wp-image-1116" /></p>
<p>La virtualizzazione è una tecnologia che sta prendendo sempre più piede nell&#8217;informatica moderna grazie alla diffusione di hardware sempre più potente, in grado di far girare più sistemi operativi in maniera concorrente.</p>
<p>In questo articolo introdurremo i concetti di base della virtualizzazione e ci soffermeremo su <a href="http://www.linux-kvm.org/">KVM</a>, uno dei progetti liberi più attivi nel campo della virtualizzazione.</p>
<p><strong><br />
Pro e contro della virtualizzazione<br />
</strong></p>
<p>La virtualizzazione che in quest&#8217;ultimo periodo occupa un sacco di spazio sulle riviste specializzate e sembra essere l&#8217;ultimo baluardo tecnologico, è in realtà una tecnologia che ha origini addirittura negli anni &#8217;60, nei laboratori di IBM dove nacque il <a href="http://en.wikipedia.org/wiki/IBM_CP-40">CP-40</a>, precursore del sistema CP-67 e di tutta la &#8220;<a href="http://ttp://en.wikipedia.org/wiki/VM_(operating_system)">VM Family</a>&#8221; di IBM, che era alla base dei sistemi operativi per i mainframe IBM s370 prima e s390 dopo.</p>
<p>Ma come mai solo ora la virtualizzazione (e il suo diretto discendente il Cloud Computing) sta tornando così di moda e occupa in maniera prepotente una fetta sempre più grande del mercato?</p>
<p>Come accennato poco sopra, ogni mese l&#8217;hardware diventa sempre più potente ed economico, basti pensare all&#8217;evoluzione dei processori che dai modelli single core di pochi anni fa siamo arrivati a sei core impacchettati sul singolo processore.</p>
<p>Grazie a questa potenza smisurata, siamo in grado di poter far girare più sistemi operativi sullo stesso hardware in maniera concorrente, senza dover ogni volta riavviare per passare da un sistema all&#8217;altro, tramite tecniche di virtualizzazione.</p>
<p>Come dice il nome stesso, la virtualizzazione permette di creare dei sistemi virtuali all&#8217;interno del sistema operativo vero e proprio, in modo da far girare un qualsiasi sistema operativo su dell&#8217;hardware virtuale messo a disposizione del sistema di virtualizzazione.</p>
<p>In questo modo, avendo abbastanza risorse hardware a disposizione potremo far girare sulle nostre workstation una serie sterminata di virtual machine con i più disparati sistemi operativi, da varie distribuzioni Linux ad altri sistemi proprietari come Windows e MacOs (a patto di rispettare le licenze, ovviamente!).</p>
<p>Il vantaggio più grande è proprio quello di poter disporre di sistemi di test per i più svariati usi, ad esempio uno sviluppatore potrà testare i propri software sui vari sistemi senza avere una pletora di installazioni diverse, mentre un sistemista potrà testare diverse configurazioni in tutta tranquillità senza dover cercare server per creare gli ambienti di test.</p>
<p>Se ci spostiamo invece su ambienti più grandi, come quelli aziendali, la virtualizzazione permette di ridurre i costi e consolidare la propria infrastruttura aziendale, accorpando su un sistema fisico più macchine virtuali, in modo da ridurre sia il costo dell&#8217;hardware che i consumi energetici (che spesso e volentieri sono la spesa più grande del reparto IT delle aziende).<br />
Il cloud computing porta addirittura al limite il concetto di virtualizzazione, creando pool di risorse virtuali sparse su vari nodi, proprio nell&#8217;ottica di sfruttare sempre meglio le risorse inutilizzate dei vari server.</p>
<p>Ovviamente non è tutto oro quello che luccica, virtualizzare un sistema, specialmente quando si tratta di server, pone seri problemi di performance e ridondanza, visto che bisogna calcolare con molta precisione quante macchine virtuali potranno essere ospitate dal singolo sistema di virtualizzazione per evitare di sovraccaricare la macchina fisica e avere performance poco soddisfacenti, e predisporre sistemi di migrazione automatici delle virtual machine su altri nodi di virtualizzazione per evitare che in caso di guasto hardware si perda una serie di servizi che possono essere vitali, ma questi sono temi decisamente avanzati rispetto allo scopo di questo articolo.</p>
<p><strong><br />
KVM in dettaglio<br />
</strong><br />
KVM sta per Kernel-based Virtual Machine e, come dice il nome, è composto da un modulo integrato nel kernel linux (dalla release 2.6.20) che permette di sfruttare le estensioni di virtualizzazione dei processori moderni.</p>
<p>Di per sè KVM non effettua nessun tipo di emulazione, si limita ad attivare le estensioni della CPU e a mettere a disposizione dello userspace un dispositivo in grado di riservare le risorse hardware da mettere a disposizione dei sistemi virtuali.<br />
Un programma userspace (in particolare le <em>libvirt</em> o <em>QEMU</em>, come vedremo in fase di implementazione nel prossimo articolo) si occuperà di richiedere al modulo di riservare questa o quella risorsa e di svolgere le operazioni necessarie per l&#8217;esecuzione della VM.<br />
Inoltre si KVM occupa di aggiungere una terza modalità all&#8217;esecuzione del kernel, la <em>Guest Mode</em>.</p>
<p>Normalmente il kernel ha due modalità di esecuzione, la <em>Kernel mode </em>(o <em>Ring0</em>) in cui solo software fidato (quindi, di fatto, solo il kernel) può essere eseguito con la massima priorità per operazioni privilegiate come l&#8217;accesso diretto all&#8217;hardware, e la <em>User Mode</em>, in cui vengono eseguite tutte le operazioni non privilegiate relative ai programmi userspace.</p>
<p>L&#8217;introduzione di KVM ha introdotto la <em>Guest Mode</em>, una modalità particolare in cui il kernel del sistema <em>host</em> (che è il sistema vero e proprio che ospita i sistemi <em>guest</em>, cioè le virtual machine) permette ai kernel dei sistemi virtualizzati di eseguire operazioni privilegiate come l&#8217;accesso diretto all&#8217;hardware virtuale.</p>
<p>Il punto di forza di KVM sta proprio in questa sua semplicità, il cuore del sistema di virtualizzazione (l&#8217;hypervisor come vedremo poco più avanti) svolge poche fondamentali operazioni, mentre tutta la parte di emulazione dell&#8217;hardware viene demandata a componenti esterne e specializzate (come le libvirt o Qemu).</p>
<p>La semplicità dell&#8217;hypervisor è però legata anche al suo punto debole (se così si può definire) di KVM: la dipendenza da hardware specializzato.<br />
KVM riesce ad essere così semplice e rapido proprio grazie all&#8217;utilizzo delle estensioni speciali inserite nei processori x86 di ultima generazione: AMD-V per i processori AMD e VT-x per i processori Intel, senza le quali KVM non può proprio funzionare.</p>
<p><strong><br />
Come funziona<br />
</strong></p>
<p>Abbiamo parlato dei vantaggi e svantaggi della virtualizzazione, ed in particolare di KVM, ma esattamente cosa sta sotto a questa meravigliosa tecnologia?<br />
In tutti i sistemi di virtualizzazione dai primi sistemi di IBM (il CP-40 nato alla fine degli anni &#8217;60), passando per Xen, VMWare e KVM troviamo un elemento comune chiamato <a href="http://en.wikipedia.org/wiki/Hypervisor">Hypervisor</a>.</p>
<p>L&#8217;hypervisor è quel componente (sia esso hardware come nel CP-40 di IBM o software come avviene oggi) che si inserisce tra i sistemi guest (le virtual machine) e l&#8217;hardware sottostante e gestisce i meccanismi di virtualizzazione dell&#8217;hardware da mettere a disposizione dei sistemi guest.</p>
<div id="attachment_1085" class="wp-caption aligncenter" style="width: 262px"><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/07/Hypervisor1.png" alt="Hypervisor Architecture" width="252" height="157" class="size-full wp-image-1085" /><p class="wp-caption-text">Architettura di un sistema di virtualizzazione</p></div>
<p>Si possono riconoscere due tipologie di hypervisor, i cosiddetti &#8220;Native&#8221; (o &#8220;Bare Metal&#8221;) e gli hypervisor &#8220;Hosted&#8221;.<br />
La prima famiglia è la più anziana e trova le sue origini sempre nei laboratori di IBM: si tratta di un piccolissimo strato di software che gira direttamente su hardware specializzato e permette la gestione dei sistemi host. </p>
<p>I sistemi &#8216;Hosted&#8217; invece, sono i più giovani, si tratta di hypervisor che girano come processo all&#8217;interno di sistemi operativi general purpose, i software di virtualizzazione come <a href="http://www.virtualbox.org/">VirtualBox</a> o VMWare Workstation ne sono  un esempio.</p>
<p>Ovviamente come in tutte le cose la distinzione non è più così netta, KVM ad esempio è un ibrido tra le due famiglie dal momento che necessita sia di hardware specializzato (le estensioni per la virtualizzazione del processore), sia di un sistema operativo che permetta a tutti i suoi compontenti di essere eseguiti.</p>
<div id="attachment_1092" class="wp-caption aligncenter" style="width: 282px"><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/07/Hypervisor-KVM1.png" alt="Hypervisor-KVM" width="272" height="181" class="size-full wp-image-1092" /><p class="wp-caption-text">Architettura di KVM</p></div>
<p>Come si può vedere dalla figura, la parte dell&#8217;hypervisor (in arancione) è divisa in due parti, la prima legata allo userspace, le <em>libvirt</em> e <em>QEMU</em> che si occupano di fornire la parte di emulazione dell&#8217;hardware (forniscono cioè i virtual device che verranno visti dai sistemi guest), mentre la seconda risiede all&#8217;interno del kernel, il modulo di KVM, l&#8217;hypervisor appunto che permette la gestione dell&#8217;hardware di virtualizzazione (le famose estensioni VTX e AMD-V) e che espone un device file in /dev/kvm usato per associare i sistemi guest alle risorse assegnate.</p>
<p><strong><br />
Conclusioni<br />
</strong></p>
<p>La virtualizzazione è un mercato in continua espansione, sempre più vendor stanno impegnando risorse nella ricerca e nello sviluppo di soluzioni alternative.<br />
In questo calderone di soluzioni emergenti, il primo beneficiario è senza dubbio Linux, che grazie alla sua architettura flessibile sta giocando un ruolo chiave per lo sviluppo di nuove tecnologie come KVM che, assieme a <a href="http://lguest.ozlabs.org/">lguest</a> e <a href="http://www.xen.org/">Xen</a> stanno portando a grossi cambiamenti volti all&#8217;incremento di performance di tutto il kernel.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2010/07/introduzione-alla-virtualizzazione-con-kvm/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Evoluzione dell’alta affidabilità su Linux: confronto pratico tra Heartbeat classico ed Heartbeat con Pacemaker</title>
		<link>http://www.miamammausalinux.org/2010/06/evoluzione-dellalta-affidabilita-su-linux-confronto-pratico-tra-heartbeat-classico-ed-heartbeat-con-pacemaker/</link>
		<comments>http://www.miamammausalinux.org/2010/06/evoluzione-dellalta-affidabilita-su-linux-confronto-pratico-tra-heartbeat-classico-ed-heartbeat-con-pacemaker/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 07:00:44 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Linux HA]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=966</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160; Nel precedente articolo è stata affrontata l&#8217;evoluzione del progetto Heartbeat, dalla versione iniziale in cui il supporto era limitato a due macchine e con un CRM (Cluster Resource Manager) dalle funzionalità ridotte, per arrivare all&#8217;evoluzione del progetto culminata in Pacemaker, il CRM avanzato con il quale è possibile specificare priorità, ordini e dipendenze delle [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux-ha.png" alt="linux-ha" title="linux-ha" width="100" height="100" class="alignnone size-full wp-image-259" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.miamammausalinux.org/wp-content/uploads/2009/11/pacemaker.png" alt="Pacemaker" title="pacemaker" width="100" height="100" class="size-full wp-image-872" /></p>
<p>Nel precedente articolo è stata affrontata l&#8217;evoluzione del progetto Heartbeat, dalla versione iniziale in cui il supporto era limitato a due macchine e con un <em>CRM</em> (<em>Cluster Resource Manager</em>) dalle funzionalità ridotte, per arrivare all&#8217;evoluzione del progetto culminata in <em>Pacemaker</em>, il CRM avanzato con il quale è possibile specificare priorità, ordini e dipendenze delle risorse al fine di ottenere il controllo totale su quanto erogato dal cluster.<br />
In questo nuovo articolo viene analizzata a fondo, con un esempio pratico, la configurazione delle due modalità operative di Heartbeat, al fine di effettuare un confronto sul funzionamento del cluster con e senza <rasca@cutaway.item>Pacemaker</em>.</p>
<p><strong>Versioni di Heartbeat ed installazione</strong></p>
<p>Fino alla versione 3 il progetto Heartbeat era un unico monolite contenente tutte le componenti funzionali all&#8217;esecuzione del software. L&#8217;evoluzione del programma ha comportato la suddivisione dello stesso in sotto progetti, ciascuno sviluppato indipendentemente rispetto agli altri, ma critico per una specifica funzione all&#8217;interno dell&#8217;architettura cluster.<br />
Ad oggi l&#8217;intero progetto Heartbeat è quindi suddiviso in tre componenti:</p>
<ol>
<li><em><strong>Heartbeat</strong></em>: comprendente il demone heartbeat, fornitore dell&#8217;infrastruttura cluster;</li>
<li><strong><em>Cluster Glue</em></strong>: un insieme di librerie con scopi specifici:
<ul>
<li><em>LRM</em> (<em>Local Resource Manager</em>): incaricato di ricevere le istruzioni dal CRM, passarle ai <em>Resource Agents</em> e riportarne l&#8217;esito;</li>
<li><em>STONITH</em> (<em>Shoot The Other Node In The Head</em>): incaricato di gestire situazioni ambigue in cui una risorsa potrebbe essere utilizzata contemporaneamente da più nodi;</li>
<li><em>hb_report</em>: incaricato di fornire dettagli sugli errori che si verificano nel sistema;</li>
<li><em>Cluster Plumbing Library</em>:una libreria per la comunicazioni interne al cluster;</li>
</ul>
<li><strong><em>Resource Agents</em></strong>: comprendente un insieme di script standard per le risorse del cluster;</li>
</ol>
<p>A ciascuna di queste componenti corrisponde un pacchetto scaricabile dalla sezione downloads del sito di Heartbeat: <a href="http://www.linux-ha.com/wiki/Downloads">http://www.linux-ha.com/wiki/Downloads</a>.<br />
Le maggiori distribuzioni al momento distribuiscono ancora pacchetti di Heartbeat nelle versioni precedenti alla 3.<br />
Scegliendo di utilizzare la versione più recente di ciascun software, è quindi possibile ricompilare manualmente i pacchetti partendo dai sorgenti oppure utilizzare pacchetti ricompilati.<br />
Nel caso si usasse <em>Debian Lenny</em> è possibile dichiarare il seguente repository all&#8217;interno del file <em>/etc/apt/sources.list</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">deb http://people.debian.org/~madkiss/ha lenny main</pre></div></div>

<p>Mentre per <em>Ubuntu Hardy Heron</em> i repository sono i seguenti:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">deb http://ppa.launchpad.net/ubuntu-ha/ppa/ubuntu karmic main</pre></div></div>

<p><em>Ubuntu Lucid Lynx</em> supporta invece la versione più recente della suite Heartbeat.</p>
<p>Per l&#8217;installazione sarà quindi necessario utilizzare lo strumento di gestione pacchetti fornito con la propria distribuzione: <em>apt</em> per <em>Debian</em> ed <em>Ubuntu</em>, <em>yast</em> per <em>SuSe/OpenSuse</em> e <em>yum</em> per <em>CentOS/RedHat</em>.</p>
<p>L&#8217;esempio che verrà implementato nel corso dell&#8217;articolo prevede la messa in alta affidabilità di due servizi nelle due versioni di Heartbeat: un indirizzo IP ed il webserver apache2. Il presupposto da cui si partirà è quello di avere un cluster composto da due nodi, collegati ciascuno alla rete locale (192.168.1.0/24) e l&#8217;uno all&#8217;altro da un cavo cross (10.0.0.0/24).</p>
<p><strong>Configurazione di Heartbeat in modalità classica (senza CRM)</strong></p>
<p>Sebbene Heartbeat sia giunto ormai alla versione 3.0.3 ed il CRM sia stato introdotto dalla versione 2, la modalità predefinita con cui il software viene avviato è quella senza CRM.<br />
Qualsiasi configurazione Heartbeat 1.x quindi funzionerà verosimilmente su tutte le versioni successive.<br />
Al di là delle innovazioni a livello software apportate al progetto, il principio di funzionamento senza CRM rimane quindi invariato, così come i file di configurazione necessari al funzionamento del cluster, come illustrato nel precedente articolo.<br />
Il primo di questi è <em>/etc/ha.d/ha.cf</em>, il cui contenuto dovrà essere simile a quanto segue (ed identico in entrambi i nodi):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">##      keepalive: how long between heartbeats?
keepalive 1
##      deadtime: how long-to-declare-host-dead?
deadtime 10
##      warntime: how long before issuing &quot;late heartbeat&quot; warning?
warntime 5
##      Very first dead time (initdead)
initdead 20
##      What interfaces to unicast heartbeats over?
ucast eth1 10.0.0.1
ucast eth1 10.0.0.2
ucast eth0 192.168.1.86
ucast eth0 192.168.1.66
##      Should we autofailback?
auto_failback off
##      Who is part of the cluster?
node    debian-lenny-nodo1
node    debian-lenny-nodo2
##      Network monitoring
ping 192.168.1.50
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster</pre></div></div>

<p>I commenti presenti all&#8217;interno del listato rendono le opzioni autoesplicative. Particolare attenzione va posta relativamente ad alcune opzioni:</p>
<p><em>auto_failback</em> si riferisce alle risorse: se impostata ad &#8220;on&#8221; nel momento in cui una risorsa effettua uno switch su un nodo differente dall&#8217;attuale (per via di un malfunzionamento di quest&#8217;ultimo) nel momento in cui il nodo tornerà attivo la risorsa effettuerà un nuovo switch.</p>
<p><em>ping</em> definisce un indirizzo ip che verrà usato come riferimento per capire se un nodo è parte della rete: &#8220;vedendo&#8221; l&#8217;indirizzo indicato il nodo avrà coscienza di essere presente sulla rete. A tutti gli effetti l&#8217;ip indicato è considerato un nodo del cluster, pertanto dovrà essere un ip affidabile, ad esempio quello del gateway di rete. E&#8217; inoltre possibile definire un gruppo di ip, attraverso la direttiva <em>ping_group</em> in modo da non affidarsi ad un unico host per il monitoring.</p>
<p><em>respawn</em> e <em>apiauth</em> definiscono rispettivamente un comando e l&#8217;utente con cui questo deve essere lanciato. Insieme alla definizione del nodo ping completano la parte di monitoraggio della connettività necessaria ad Heartbeat per regolarsi in caso di connettività limitata od assente.</p>
<p>Le ultime tre opzioni descritte, come apparirà chiaro in seguito, risultano di importanza critica in configurazioni senza CRM.</p>
<p>Il secondo file essenziale alla costruzione del cluster è <em>/etc/ha.d/haresources</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">debian-lenny-nodo1 IPaddr::192.168.1.200/24/eth0 apache2</pre></div></div>

<p>Il contenuto definisce il nodo master per le due risorse definite: l&#8217;indirizzo ip 192.168.1.200 (associato all&#8217;interfaccia eth0) e apache2, il demone che controlla il webserver. Entrambe le risorse verranno quindi, in condizioni normali, avviate sul nodo identificato come <em>debian-lenny-nodo1</em>.</p>
<p>L&#8217;ultimo file ad essere creato è <em>/etc/ha.d/authkeys</em> e contiene le informazioni per la sicurezza delle comunicazioni tra i due nodi. Non essendo vincolante ai fini del progetto avere una comunicazione criptata tra i nodi, il contenuto del file può essere il seguente:</p>

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

<p>Che sta ad indicare come non esisterà sicurezza nella comunicazione fra i nodi (eccettuato il controllo sulla corruzione dei pacchetti).</p>
<p>Prima di avviare il demone per la prima volta ed effettuare i test è necessario accertarsi che il demone apache non venga avviato al boot del sistema, poiché verrà gestito da heartbeat. In <em>Debian/Ubuntu</em> si può rimuovere così:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># update-rc.d -f apache2 remove</pre></div></div>

<p>Mentre in <em>RedHat/Centos/Opensuse</em> il comando da usare è chkconfig:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># chkconfig --level 123456 apache2 off</pre></div></div>

<p>A questo punto è possibile avviare su entrambi i nodi il demone heartbeat:</p>

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

<p>dopo alcuni minuti i servizi dovrebbero salire sul nodo che secondo quanto impostato nella configurazione sarà master, <em>debian-lenny-nodo1</em>. Il tutto è verificabile attraverso il controllo sullo stato dell&#8217;interfaccia <em>eth0:0</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ifconfig eth0:0
eth0:0    Link encap:Ethernet  HWaddr 08:00:27:59:18:22  
          inet addr:192.168.1.200  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:10 Base address:0xd020</pre></div></div>

<p>E sull&#8217;effettiva esecuzione del demone apache2:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ps -ef| grep apache
root      2052     1  0 11:30 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  2053  2052  0 11:30 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  2054  2052  0 11:30 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  2057  2052  0 11:30 ?        00:00:00 /usr/sbin/apache2 -k start</pre></div></div>

<p><strong>Test di Heartbeat in modalità classica (senza CRM)</strong></p>
<p>Il comportamento nelle varie situazione del demone heartbeat è osservabile attraverso il principale file di log di sistema, su entrambi i nodi:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">tail -f /var/log/syslog</pre></div></div>

<p><span style="color: #505050;"><em>Primo test: disconnessione cavo LAN</em></span></p>
<p>Il primo test riguarderà la disconnessione del cavo di rete LAN relativo al nodo master, l&#8217;operazione genererà alcune righe di log, la più importante delle quali, sull&#8217;unico nodo rimasto attivo in rete, riporterà quanto segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">...
ResourceManager[14403]: [14415]: info: Acquiring resource group: debian-lenny-nodo1 IPaddr::192.168.1.200/24/eth0 apache2
...</pre></div></div>

<p>l&#8217;indicazione è chiara: le risorse sono state acquisite dal nodo secondario. A rilevare l&#8217;assenza di connettività è stato, come precedentemente illustrato, l&#8217;esegubile <em>ipfail</em>.</p>
<p><span style="color: #505050;"><em>Secondo test: disconnessione cavo Heartbeat</em></span></p>
<p>Il secondo test prevede la rimozione del cavo che collega i due nodi del cluster:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">...
Apr  8 16:24:16 debian-lenny-nodo1 kernel: [17722.012482] eth1: link down
Apr  8 16:24:25 debian-lenny-nodo1 heartbeat: [14269]: info: Link debian-lenny-nodo2:eth1 dead.
Apr  8 16:24:25 debian-lenny-nodo1 ipfail: [14297]: info: Link Status update: Link debian-lenny-nodo2/eth1 now has status dead
Apr  8 16:24:25 debian-lenny-nodo1 ipfail: [14297]: debug: Found ping node 192.168.1.50!
Apr  8 16:24:26 debian-lenny-nodo1 ipfail: [14297]: info: Asking other side for ping node count.
Apr  8 16:24:26 debian-lenny-nodo1 ipfail: [14297]: debug: Message [num_ping] sent.
Apr  8 16:24:26 debian-lenny-nodo1 ipfail: [14297]: info: Checking remote count of ping nodes.
Apr  8 16:24:27 debian-lenny-nodo1 ipfail: [14297]: debug: Got asked for num_ping.
Apr  8 16:24:27 debian-lenny-nodo1 ipfail: [14297]: debug: Found ping node 192.168.1.50!
Apr  8 16:24:28 debian-lenny-nodo1 ipfail: [14297]: info: Ping node count is balanced.
Apr  8 16:24:28 debian-lenny-nodo1 ipfail: [14297]: debug: Abort message sent.
Apr  8 16:24:28 debian-lenny-nodo1 ipfail: [14297]: info: No giveup timer to abort.
...</pre></div></div>

<p>I messaggi riguardano l&#8217;interfaccia secondaria e, come è osservabile, la perdita di questa interfaccia non provoca alcun tipo di switch, in quanto la comunicazione tra i nodi funziona ancora attraverso l&#8217;interfaccia primaria, quindi attraverso la LAN.</p>
<p><span style="color: #505050;"><em>Terzo test: spegnimento improvviso nodo master</em></span></p>
<p>Il terzo test consiste nella rimozione improvvisa dell&#8217;alimentazione relativa al nodo master:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Apr  8 16:24:16 debian-lenny-nodo2 heartbeat: [8170]: WARN: node debian-lenny-nodo1: is dead
Apr  8 16:24:16 debian-lenny-nodo2 ipfail: [8233]: info: Status update: Node debian-lenny-nodo1 now has status dead
...
...
Apr  8 16:24:16 debian-lenny-nodo2 ResourceManager[8913]: [8925]: info: Acquiring resource group: debian-lenny-nodo1 IPaddr::192.168.1.200/24/eth0 apache2
Apr  8 16:24:17 debian-lenny-nodo2 ipfail: [8233]: debug: Found ping node 192.168.1.50!
Apr  8 16:24:17 debian-lenny-nodo2 IPaddr[8937]: [8972]: INFO:  Resource is stopped
Apr  8 16:24:17 debian-lenny-nodo2 ResourceManager[8913]: [8987]: info: Running /etc/ha.d/resource.d/IPaddr 192.168.1.200/24/eth0 start
Apr  8 16:24:17 debian-lenny-nodo2 ipfail: [8233]: info: NS: We are still alive!
...
...</pre></div></div>

<p>Lo switch avviene in maniera corretta, è possibile notare il messaggio &#8220;We are still alive!&#8221; che indica come il nodo secondario abbia rilevato che il nodo primario sia assente, acquisendone le risorse, una volta accertato il proprio grado di connettività con la rete.</p>
<p><span style="color: #505050;"><em>Quarto test: migrazione manuale delle risorse</em></span></p>
<p>Heartbeat dispone di un ristretto set di comandi che consentono di interagire con le risorse. Questi comandi sono contenuti nella cartella <em>/usr/share/heartbeat/</em>, ed il comando che consente di gestire le risorse dichiarate è <em>hb_takeover</em>, la cui sintassi d&#8217;impiego è la seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># /usr/share/heartbeat/hb_standby all|foreign|local|failback</pre></div></div>

<p>I parametri passabili al comando comprendono la possibilità da parte di un nodo di acquisire tutte le risorse (<em>all</em>), le risorse del nodo secondario (<em>foreign</em>), le risorse di proprietà (<em>local</em>), le risorse precedentemente migrate (<em>failback</em>).<br />
Nel caso che si vuole simulare il nodo secondario lancerà il seguente comando:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># /usr/share/heartbeat/hb_standby foreign</pre></div></div>

<p>Ed il comportamento del cluster, osservabile dal nodo primario, sarà il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Apr  8 16:28:36 debian-lenny-nodo1 heartbeat: [14269]: info: debian-lenny-nodo1 wants to go standby [local]
Apr  8 16:28:36 debian-lenny-nodo1 heartbeat: [14269]: info: standby: debian-lenny-nodo2 can take our local resources
Apr  8 16:28:36 debian-lenny-nodo1 heartbeat: [14859]: info: give up local HA resources (standby).
Apr  8 16:28:36 debian-lenny-nodo1 ResourceManager[14872]: [14884]: info: Releasing resource group: debian-lenny-nodo1 IPaddr::192.168.1.200/24/eth0 apache2
Apr  8 16:28:36 debian-lenny-nodo1 ResourceManager[14872]: [14895]: info: Running /etc/init.d/apache2  stop
Apr  8 16:28:38 debian-lenny-nodo1 ResourceManager[14872]: [14929]: info: Running /etc/ha.d/resource.d/IPaddr 192.168.1.200/24/eth0 stop
Apr  8 16:28:38 debian-lenny-nodo1 IPaddr[14956]: [14968]: INFO: ifconfig eth0:0 down
Apr  8 16:28:38 debian-lenny-nodo1 IPaddr[14930]: [14972]: INFO:  Success</pre></div></div>

<p>Le risorse sono state correttamente spostate su <em>debian-lenny-nodo2</em>.</p>
<p><span style="color: #505050;"><em>Quinto test: standby manuale di un nodo</em></span></p>
<p>Il quinto test della serie prevederà la messa in standby del nodo attivo, al fine di verificare il corretto spostamento delle risorse. Il controllo di questa funzionalità da parte del cluster è possibile mediante lo stesso comando precedentemente illustrato, lanciato senza argomenti (che equivale a lanciarlo parametro &#8220;all&#8221;) sul secondo nodo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># /usr/share/heartbeat/hb_standby</pre></div></div>

<p>Il comportamento è il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Apr  8 16:29:48 debian-lenny-nodo1 heartbeat: [14269]: info: debian-lenny-nodo2 wants to go standby [all]
Apr  8 16:29:49 debian-lenny-nodo1 ipfail: [14297]: debug: Other side is unstable.
Apr  8 16:29:51 debian-lenny-nodo1 heartbeat: [14269]: info: standby: acquire [all] resources from debian-lenny-nodo2
Apr  8 16:29:51 debian-lenny-nodo1 heartbeat: [14974]: info: acquire all HA resources (standby).
Apr  8 16:29:51 debian-lenny-nodo1 ResourceManager[14987]: [14999]: info: Acquiring resource group: debian-lenny-nodo1 IPaddr::192.168.1.200/24/eth0 apache2
Apr  8 16:29:52 debian-lenny-nodo1 IPaddr[15011]: [15046]: INFO:  Resource is stopped
Apr  8 16:29:52 debian-lenny-nodo1 ResourceManager[14987]: [15061]: info: Running /etc/ha.d/resource.d/IPaddr 192.168.1.200/24/eth0 start
Apr  8 16:29:53 debian-lenny-nodo1 IPaddr[15088]: [15121]: INFO: Using calculated netmask for 192.168.1.200: 255.255.255.0
Apr  8 16:29:53 debian-lenny-nodo1 IPaddr[15088]: [15143]: INFO: eval ifconfig eth0:0 192.168.1.200 netmask 255.255.255.0 broadcast 192.168.1.255
Apr  8 16:29:53 debian-lenny-nodo1 IPaddr[15062]: [15162]: INFO:  Success
Apr  8 16:29:53 debian-lenny-nodo1 ResourceManager[14987]: [15183]: info: Running /etc/init.d/apache2  start</pre></div></div>

<p>Tutte le risorse vengono acquisite dal nodo <em>debian-lenny-nodo2</em>.</p>
<p><span style="color: #505050;"><em>Sesto test: interruzione manuale di un servizio</em></span></p>
<p>L&#8217;ultimo test della serie comprende lo stop manuale di uno dei servizi erogati. Ad esempio apache:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># /etc/init.d/apache2 stop</pre></div></div>

<p>è facile verificare come nessuna azione venga svolta da Heartbeat, il servizio infatti rimane spento, e l&#8217;unica via per fare in modo che il cluster lo riavvii è quella di mandare in standby manualmente il nodo.</p>
<p>Gli ultimi tre test mostrano come in realtà il controllo manuale del cluster sia unicamente la simulazione della messa in standby di un nodo o lo stop di un servizio attivo. Lo standby non avviene in maniera totale, il nodo non viene escluso dal cluster, semplicemente rilascia le proprie risorse e lo stesso vale per i servizi.<br />
Quanto descritto rappresenta una grossa differenza nei confronti dell&#8217;utilizzo del CRM Pacemaker, ed il concetto sarà ancora più chiaro nei paragrafi successivi.</p>
<p><strong>Configurazione di Heartbeat in modalità CRM con Pacemaker</strong></p>
<p>L&#8217;esecuzione di Heartbeat in modalità CRM prevede che nel sistema sia installato il pacchetto Pacemaker. Questo pacchetto è disponibile nelle maggiori distribuzioni (e nei repository indicati nel primo capitolo dell&#8217;articolo) e tra le varie librerie e file che installa uno su tutti sarà fondamentale nel proseguo dell&#8217;articolo: <em>/usr/sbin/crm</em>. Come verrà illustrato in seguito il comando <em>crm</em> consente di interagire direttamente con il cluster, il suo comportamento e la sua configurazione.<br />
Prima di procedere è necessario predisporre nuovamente il file di configurazione <em>/etc/ha.d/ha.cf</em> con questo contenuto, su entrambi i nodi:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">autojoin none
keepalive 1
deadtime 10
warntime 5
initdead 20
mcast eth0 239.0.0.43 694 1 0
bcast eth1
node    debian-lenny-nodo1
node    debian-lenny-nodo2
crm respawn</pre></div></div>

<p>Le differenze con la precedente configurazione sono subito evidenti. Esiste una nuova opzione chiamata <em>autojoin none</em> che disabilita la funzione automatica di scoperta ed aggiunta di nodi sulla rete, inoltre sono state modificate le informazioni relative alla rete: non viene più definito un <a href="http://it.wikipedia.org/wiki/Unicast">unicast</a> per ciascuna interfaccia interessate alla comunicazione del cluster, i pacchetti viaggeranno in <a href="http://it.wikipedia.org/wiki/Multicast">multicast</a> per la rete locale ed in <a href="http://it.wikipedia.org/wiki/Broadcasting_(informatica)">broadcast</a> per la rete non condivisa (il cavo cross che collega le due macchine).<br />
Infine, l&#8217;opzione <em>crm respawn</em> indica che il cluster userà il Cluster Resource Manager, Pacemaker.<br />
Va sottolineato come siano assenti i parametri relativi al monitoraggio della connettività, che verrà gestita in maniera totale da Pacemaker.<br />
E&#8217; chiaro come in questa configurazione il file /etc/ha.d/haresources non ha più ragione di esistere in quanto, così come spiegato nel precedente articolo, a preoccuparsi della gestione delle risorse è il CRM stesso.<br />
Il file relativo al protocollo di comunicazione e sicurezza <em>/etc/ha.d/authkeys</em> rimane invece identico.</p>
<p>E&#8217; quindi possibile avviare Heartbeat per la prima volta:</p>

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

<p>Le fasi di avvio sono visibili attraverso il log, oppure utilizzando il già citato comando <em>crm</em> con il parametro <em>status</em>.<br />
Inizialmente lo stato del cluster sarà il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm status
============
Last updated: Wed Jun 16 11:34:38 2010
Current DC: NONE
0 Nodes configured, unknown expected votes
0 Resources configured.
============</pre></div></div>

<p>Dopo qualche minuto, una volta che i nodi avranno avviato le comunicazioni la situazione varierà in questa forma:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm status
============
Last updated: Wed Jun 16 11:35:48 2010
Stack: Heartbeat
Current DC: debian-lenny-nodo2 (e1f7faf3-7152-4c51-bfc4-b5382944a62e) - partition with quorum
Version: 1.0.8-2c98138c2f070fcb6ddeab1084154cffbf44ba75
2 Nodes configured, unknown expected votes
0 Resources configured.
============
&nbsp;
Online: [ debian-lenny-nodo1 debian-lenny-nodo2 ]</pre></div></div>

<p>Il cluster può dirsi così avviato. Sebbene non ci siano risorse configurate (&#8220;<em>0 Resources configured.</em>&#8220;) i due nodi configurati risultano &#8220;Online&#8221;, pronti cioè ad erogare risorse e <em>debian-lenny-nodo2</em> ha il ruolo di <em>DC</em>, <em>Designated Coordinator</em>, il nodo &#8220;master&#8221; che guiderà cioè le operazioni.</p>
<p>Qualsiasi tipo di configurazione sul cluster può essere effettuata attraverso il comando <em>crm</em>, mediante il parametro <em>configure</em> seguito dalle impostazioni da modificare.<br />
Di seguito in quattro fasi viene illustrata una configurazione che rispetti fedelmente quanto fatto per la versione senza CRM.</p>
<p><span style="color: #505050;"><strong>Prima fase: comportamento generale del cluster</strong></span></p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure property stonith-enabled=&quot;false&quot;</pre></div></div>

<p>Disabilitazione dello <em>stonith</em>: come anticipato in apertura di articolo, lo stonith prevede la configurazione di device specifici che possano essere guidati al fine di spegnere immediatamente un nodo in situazioni in cui non si ha la certezza di quale nodo sia ancora vivo. Nel caso illustrato la configurazione dello stonith verrà pertanto disabilitato.<br />
Una interessante documentazione su come configurare lo stonith su Heartbeat è disponibile sul sito Novell, a <a href="http://www.novell.com/documentation/sles10/heartbeat/?page=/documentation/sles10/heartbeat/data/b8nrkl5.html"><br />
questo indirizzo</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure property no-quorum-policy=&quot;ignore&quot;</pre></div></div>

<p>Non considerazione dell&#8217;assenza di quorum: se la locazione comune dei dati relativi al cluster (quorum) non sarà accessibile da parte dei nodi, il cluster non dovrà prendere alcun provvedimento. Le opzioni disponibili sono <em>ignore</em>, <em>stop</em>, <em>freeze</em> e <em>suicide</em>.<br />
Il valore <em>stop</em> porterà il cluster a fermare ordinatamente tutte le risorse.<br />
Il valore <em>freeze</em> consentirà al cluster di continuare ad erogare le risorse in esecuzione senza però avviarne di nuove.<br />
Il valore <em>suicide</em> obbligherà il cluster a spegnere immediatamente tutti i nodi con limitato accesso al quorum.</p>
<p>Chiaramente le due opzioni <em>stonith-enabled</em> e <em>no-quorum-policy</em> non vengono considerate nella configurazione classica. Il concetto di <em>quorum</em> e <em>stonith</em> si applica solo a cluster gestiti da CRM, in cui esiste una memoria comune.</p>
<p><span style="color: #505050;"><strong>Seconda fase: controllo della connettività</strong></span></p>
<p>Il controllo della connettività con Pacemaker è possibile attraverso la definizione di una risorsa denominata &#8220;ping&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure primitive ping ocf:pacemaker:ping params host_list=&quot;192.168.1.1&quot; name=&quot;ping&quot; op monitor interval=&quot;10s&quot; timeout=&quot;60s&quot; op start timeout=&quot;60s&quot; op stop timeout=&quot;60s&quot;</pre></div></div>

<p>Il comando crea una risorsa (<em>primitive</em>) denominata <em>ping</em>, il cui <em>Resource Agent</em> (RA) è di tipo <em>ocf</em>, fornito da <em>pacemaker</em>: il path effettivo dell&#8217;eseguibile sarà quindi <em>/usr/lib/ocf/resource.d/pacemaker/ping</em> (si veda l&#8217;articolo precedente per l&#8217;approfondimento sulle tipologie di resource agent e loro posizionamento).<br />
Il RA supporta diversi parametri, fra questi <em>host_list</em> deve contenere la lista degli host da controllare per verificare la connettività (in questo caso il gateway di rete) e <em>name</em> dovrà corrispondere al nome interno della risorsa (si veda la quarta fase).<br />
Infine le indicazioni che seguono le voci &#8220;op&#8221; (abbreviazione di <em>operations</em>) consentono di definire le politiche di monitoring della risorsa: come deve essere controllata (ad intervalli di 10 secondi e con 60 secondi di timeout) ed in quanto tempo si deve avviare e fermare (entro i 60 secondi di timeout).</p>
<p>La definizione della risorsa ping non è però sufficiente per fornire ad ogni nodo uno strumento per il controllo della connettività, poiché, definita nel modo indicato, la risorsa <em>ping</em> verrà eseguita su un unico nodo. Proprio per ovviare a questo problema e fare in modo che la stessa risorsa possa girare su più nodi è possibile <em>clonarla</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure clone ping_clone ping meta globally-unique=&quot;false&quot;</pre></div></div>

<p>Il comando indica al cluster di creare la risorsa <em>ping_clone</em> che girerà su tutti i nodi, indistintamente (meta globally-unique=&#8221;false&#8221;).</p>
<p><span style="color: #505050;"><strong>Terza fase: definizione delle risorse</strong></span></p>
<p>Per riprodurre il test e confrontarlo con il precedente rimangono da definire le due risorse scelte ip e apache. La risorsa ip verrà dichiarata come segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure primitive cluster-ip ocf:heartbeat:IPaddr2 params ip=&quot;192.168.1.200&quot; nic=&quot;eth0&quot; op monitor interval=&quot;10s&quot; timeout=&quot;20s&quot; op start timeout=&quot;20s&quot; op stop timeout=&quot;20s&quot;</pre></div></div>

<p>il nome della risorsa è <em>cluster-ip</em> ed il resource agent utilizzato sarà di tipo OCF, con fornitore heartbeat.<br />
I parametri comprendono l&#8217;indirizzo ip che verrà erogato ed il nic (la scheda di rete) a cui verrà associato.<br />
Per quanto riguarda le politiche di monitoring vale quanto detto poco sopra per la risorsa ping.</p>
<p>Il servizio apache2 verrà dichiarato in maniera similare:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">crm configure primitive cluster-apache2 ocf:heartbeat:apache params configfile=&quot;/etc/apache2/apache2.conf&quot; httpd=&quot;/usr/sbin/apache2&quot; port=&quot;80&quot; op monitor interval=&quot;10s&quot; timeout=&quot;60s&quot; op start timeout=&quot;40s&quot; op stop timeout=&quot;60s&quot;</pre></div></div>

<p>E&#8217; da notare che il Resource Agent utilizzato non è, come per la configurazione di Heartbeat senza CRM, lo script di avvio del demone presente in /etc/init.d, ma un vero e proprio resource agent di tipo OCF. I parametri necessari al funzionamento sono il file di configurazione (configfile), l&#8217;eseguibile del demone (httpd) e la porta su cui apache sarà in ascolto (port).<br />
Anche in questo caso per le opzioni di monitoring vale quanto espresso in precedenza.</p>
<p>Per completare la configurazione delle risorse verrà definito un gruppo, denominato <em>cluster</em>, a cui verranno associate le risorse definite:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure group cluster cluster-ip cluster-apache2</pre></div></div>

<p>Il gruppo <em>cluster</em> potrà essere utilizzato nella configurazione come un unica risorsa, le cui operazioni di avvio e stop rispetteranno l&#8217;ordine indicato nella definizione: in fase di start del gruppo cluster verrà avviato prima <em>cluster-ip</em> e poi <em>cluster-apache2</em>, in fase di stop verrà prima stoppato <em>cluster-apache2</em> e poi <em>cluster-ip</em>.</p>
<p><span style="color: #505050;"><strong>Quarta fase: associazione delle risorse al nodo attivo</strong></span></p>
<p>La configurazione del cluster, definiti i parametri di monitoraggio della connessione ed il gruppo delle risorse, potrebbe sembrare a questo punto completa:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm status
============
Last updated: Wed Jun 16 15:36:43 2010
Stack: Heartbeat
Current DC: debian-lenny-nodo2 (e1f7faf3-7152-4c51-bfc4-b5382944a62e) - partition with quorum
Version: 1.0.8-2c98138c2f070fcb6ddeab1084154cffbf44ba75
2 Nodes configured, unknown expected votes
2 Resources configured.
============
&nbsp;
Online: [ debian-lenny-nodo1 debian-lenny-nodo2 ]
&nbsp;
 Clone Set: ping_clone
     Started: [ debian-lenny-nodo1 debian-lenny-nodo2 ]
 Resource Group: cluster
     cluster-ip	(ocf::heartbeat:IPaddr2):	Started debian-lenny-nodo1
     cluster-apache2	(ocf::heartbeat:apache):	Started debian-lenny-nodo1</pre></div></div>

<p>Ma non è così. E&#8217; vero che al momento il cluster eroga quanto stabilito, ma non è ancora stato definito il comportamento da assumere in caso di assenza di connettività. Se infatti si dovesse rimuovere il cavo di rete LAN dal nodo debian-lenny-nodo1 le risorse non verrebbero automaticamente migrate sul secondo nodo.<br />
Questo perché il cluster non è istruito a dovere in merito al comportamento da assumere a fronte di un esito negativo delle operazioni effettuate dalla risorsa clonata ping.<br />
Quanto descritto rappresenta un&#8217;altra grossa differenza tra le due tipologie di funzionamento: in un caso la definizione di ipfail forzava lo standby delle risorse in autonomia (e minor controllo), con Pacemaker la filosofia cambia: tutto va definito, aggiungendo certamente complessità all&#8217;architettura, ma rendendo il controllo sul cluster totale.<br />
Per definire quindi un vincolo sull&#8217;erogazione delle risorse è necessario definire una &#8220;location&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure location cluster_on_connected_node cluster rule -inf: not_defined ping or ping lte 0</pre></div></div>

<p>Viene definita cioè una regola denominata <em>cluster_on_connected_node</em> associata alla risorsa <em>cluster</em> che prevede di dare il peso di meno infinito (<em>-inf</em>, rendere cioè incapace di erogare risorse) al nodo in cui la risorsa nominata <em>ping</em> non sia definita (<em>not_defined</em>) o il cui codice di uscita sia minore o uguale a zero (<em>lte 0</em> e quindi il comando ping non ha avuto esito positivo, il ping node non risponde).</p>
<p>Grazie a questa regola la struttura realizzata con Heartbeat e Pacemaker risulta l&#8217;esatta replica della soluzione Heartbeat senza CRM per comportamento e configurazione.</p>
<p><span style="color: #505050;"><strong>La configurazione completa</strong></span></p>
<p>E&#8217; possibile ottenere il resoconto della configurazione, completo di <em>highlight</em> attraverso il comando <em>crm configure show</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure show
node $id=&quot;1984521f-539f-4967-b0ff-eb23f3cf9ccf&quot; debian-lenny-nodo1
node $id=&quot;e1f7faf3-7152-4c51-bfc4-b5382944a62e&quot; debian-lenny-nodo2
primitive cluster-apache2 ocf:heartbeat:apache \
	params configfile=&quot;/etc/apache2/apache2.conf&quot; httpd=&quot;/usr/sbin/apache2&quot; port=&quot;80&quot; \
	op monitor interval=&quot;10s&quot; timeout=&quot;60s&quot; \
	op start interval=&quot;0&quot; timeout=&quot;40s&quot; \
	op stop interval=&quot;0&quot; timeout=&quot;60s&quot;
primitive cluster-ip ocf:heartbeat:IPaddr2 \
	params ip=&quot;192.168.1.200&quot; nic=&quot;eth0&quot; \
	op monitor interval=&quot;10s&quot; timeout=&quot;20s&quot; \
	op start interval=&quot;0&quot; timeout=&quot;20s&quot; \
	op stop interval=&quot;0&quot; timeout=&quot;20s&quot;
primitive ping ocf:pacemaker:ping \
	params host_list=&quot;192.168.1.1&quot; name=&quot;ping&quot; \
	op stop interval=&quot;0&quot; timeout=&quot;60s&quot; \
	op start interval=&quot;0&quot; timeout=&quot;60s&quot; \
	op monitor interval=&quot;10s&quot; timeout=&quot;60s&quot;
group cluster cluster-ip cluster-apache2
clone ping_clone ping \
	meta globally-unique=&quot;false&quot;
location cluster_on_connected_node cluster \
	rule $id=&quot;cluster_on_connected_node-rule&quot; -inf: not_defined ping or ping lte 0
property $id=&quot;cib-bootstrap-options&quot; \
	dc-version=&quot;1.0.8-2c98138c2f070fcb6ddeab1084154cffbf44ba75&quot; \
	cluster-infrastructure=&quot;Heartbeat&quot; \
	stonith-enabled=&quot;false&quot; \
	no-quorum-policy=&quot;ignore&quot; \
	last-lrm-refresh=&quot;1276694458&quot;</pre></div></div>

<p>E&#8217; da notare che oltre ad essere un comando invocabile con specifiche opzioni, <em>crm</em> può essere lanciato senza argomenti, in modo da accedere alla console di amministrazione interattiva che permette di controllare il cluster su tutti i livelli. Ad esempio digitando in sequenza:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm
crm(live)# configure
crm(live)configure# edit</pre></div></div>

<p>Si accederà alla configurazione riportata sopra all&#8217;interno dell&#8217;editor di testo <em>vi</em>, questa configurazione potrà essere modificata a piacimento e salvata attraverso il comando <em>vi</em> &#8220;:wq&#8221;.<br />
Le modifiche verranno applicate digitando:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">crm(live)configure# commit</pre></div></div>

<p>L&#8217;interfaccia analizzerà quanto digitato ed applicherà alla configurazione effettiva del cluster le modifiche, ovviamente se e soltanto se queste rispettano la sintassi e la struttura del cluster.</p>
<p><strong>Test di Heartbeat in modalità CRM con Pacemaker</strong></p>
<p>Anche nella configurazione con Pacemaker il comportamento di Heartbeat è osservabile dal file di log di sistema <em>/var/log/syslog</em>. La quantità di log relativa a questa configurazione di Heartbeat è decuplicata rispetto alla configurazione classica, il che rende a volte complicato seguire quanto avviene nel cluster. Un buon approccio in caso di disservizi o comportamenti divergenti da quanto ci si aspetta è quello di cercare parole chiave come &#8220;error&#8221; o &#8220;warning&#8221; in modo da evidenziare subito potenziali problemi.</p>
<p><span style="color: #505050;"><em>Primo test: disconnessione cavo LAN</em></span></p>
<p>Il comportamento di Heartbeat nei confronti della disconnessione del cavo LAN è il seguente (vengono riportate solo alcune righe del log del nodo attivo):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Jun 17 17:11:42 debian-lenny-nodo1 attrd: [2426]: info: attrd_trigger_update: Sending flush op to all hosts for: ping (0)
...
Jun 17 17:11:43 debian-lenny-nodo1 lrmd: [2424]: info: rsc:cluster-apache2:16: stop
...
Jun 17 17:11:46 debian-lenny-nodo1 lrmd: [2424]: info: rsc:cluster-ip:17: stop
...
Jun 17 17:11:49 debian-lenny-nodo1 lrmd: [2424]: info: perform_op:2873: operation monitor[11] on ocf::ping::ping:1 for client 2427, its parameters: CRM_meta_clone=[1] host_list=[192.168.1.1]</pre></div></div>

<p>Il nodo attivo segnala di aver perso connettività (leggendo la risposta del comando clonato ping) e procede con lo stop delle due risorse interessate (che verranno attivate sul nodo secondario, ovviamente se questo ha connettività).<br />
Il nodo debian-lenny-nodo1 continua a tentare la connessione al nodo ping.<br />
Da notare che debian-lenny-nodo1 non viene in alcuna maniera escluso dal cluster poiché l&#8217;interfaccia Heartbeat (il cavo che collega fra loro le due macchine) è attiva, garantendo la comunicazione dei due nodi.</p>
<p><span style="color: #505050;"><em>Secondo test: disconnessione cavo Heartbeat</em></span></p>
<p>La rimozione del cavo heartbeat, così come il secondo test di Heartbeat senza CRM, non comporta alcuna variazione nello stato del cluster:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Jun 18 10:57:12 debian-lenny-nodo1 kernel: [ 3020.112982] eth1: link down
Jun 18 10:57:20 debian-lenny-nodo1 heartbeat: [11076]: info: Link debian-lenny-nodo2:eth1 dead.</pre></div></div>

<p>Viene unicamente rilevata (sia dal kernel che da heartbeat) l&#8217;assenza di connettività sull&#8217;interfaccia eth1, ma la comunicazione del cluster è ancora garantita dal link <em>eth0</em>.</p>
<p><span style="color: #505050;"><em>Terzo test: spegnimento improvviso nodo master</em></span></p>
<p>Ecco cosa avviene all&#8217;atto di spegnimento improvviso del nodo erogante i servizi:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="console" style="font-family:monospace;">Jun 18 11:00:44 debian-lenny-nodo1 heartbeat: [11076]: WARN: node debian-lenny-nodo2: is dead
Jun 18 11:00:44 debian-lenny-nodo1 heartbeat: [11076]: info: Link debian-lenny-nodo2:eth0 dead.
Jun 18 11:00:44 debian-lenny-nodo1 heartbeat: [11076]: info: Link debian-lenny-nodo2:eth1 dead.
...
Jun 18 11:00:45 debian-lenny-nodo1 crmd: [11091]: WARN: check_dead_member: Our DC node (debian-lenny-nodo2) left the cluster
...
Jun 18 11:00:48 debian-lenny-nodo1 crmd: [11091]: info: do_dc_takeover: Taking over DC status for this partition
...
Jun 18 11:00:53 debian-lenny-nodo1 pengine: [12660]: notice: unpack_config: On loss of CCM Quorum: Ignore
...
Jun 18 11:00:53 debian-lenny-nodo1 lrmd: [11088]: info: rsc:cluster-ip:13: start
...
Jun 18 11:00:53 debian-lenny-nodo1 lrmd: [11088]: info: rsc:cluster-apache2:15: start</pre></td></tr></table></div>

<p>In sequenza quanto avviene sul nodo sopravvissuto è:</p>
<ul>
<li>linea 1,2,3) Rilevazione della perdita di connettività totale con l&#8217;altro nodo;</li>
<li>linea 5) Rilevazione della perdita di <em>DC</em>;</li>
<li>linea 7) Presa i carico da parte del nodo attuale del ruolo di <em>DC</em>;</li>
<li>linea 9) Come da configurazione l&#8217;assenza di quorum viene ignorata;</li>
<li>linea 11,13) Avvio dei servizi;</li>
</ul>
<p>Il nodo <em>debian-lenny-nodo1</em> ha quindi preso in carico la totalità delle risorse, in maniera automatica.</p>
<p><span style="color: #505050;"><em>Quarto test: migrazione manuale delle risorse</em></span></p>
<p>La migrazione manuale delle risorse è possibile sempre attraverso l&#8217;utilizzo del comando <em>crm</em>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="console" style="font-family:monospace;"># crm resource migrate cluster debian-lenny-nodo2</pre></td></tr></table></div>

<p>In questo caso, il gruppo di risorse <em>cluster</em> viene migrato dal nodo attuale al nodo <em>debian-lenny-nodo2</em>: è possibile migrare indistintamente un gruppo o una singola risorsa, ma se questa fa parte del gruppo, allora tutto il gruppo verrà migrato.<br />
La migrazione della risorsa genera automaticamente un&#8217;aggiunta nella configurazione del cluster di questo tipo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">location cli-prefer-cluster cluster \
	rule $id=&quot;cli-prefer-rule-cluster&quot; inf: #uname eq debian-lenny-nodo2</pre></div></div>

<p>il cui scopo è chiaro: la regola infatti indica al cluster di dare priorità <em>inf</em> (ossia infinità) all&#8217;esecuzione della risorsa cluster sul nodo il cui comando <em>uname</em> equivale a <em>debian-lenny-nodo2</em>. Non a caso, la regola viene automaticamente battezzata &#8220;cli-prefer-cluster&#8221;. Va chiarito che sebbene il peso della regola sia infinito, questa decade in caso il nodo preferito smetta di funzionare.<br />
E&#8217; possibile ripristinare la migrazione attraverso il comando inverso:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm resource unmigrate cluster</pre></div></div>

<p>Tale operazione ripristinerà la situazione precedente, rimuovendo la regola aggiunta all&#8217;interno della configurazione.</p>
<p><span style="color: #505050;"><em>Quinto test: standby manuale di un nodo</em></span></p>
<p>Anche la messa in standby di un nodo è effettuabile attraverso il comando <em>crm</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm node standby debian-lenny-nodo1</pre></div></div>

<p>Lo stato del cluster al termine di questa operazione sarà quindi il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">...
Node debian-lenny-nodo1 (1984521f-539f-4967-b0ff-eb23f3cf9ccf): standby
Online: [ debian-lenny-nodo2 ]
&nbsp;
 Clone Set: ping_clone
     Started: [ debian-lenny-nodo2 ]
     Stopped: [ ping:0 ]
 Resource Group: cluster
     cluster-ip (ocf::heartbeat:IPaddr2):       Started debian-lenny-nodo2
     cluster-apache2    (ocf::heartbeat:apache):        Started debian-lenny-nodo2</pre></div></div>

<p>Le risorse vengono correttamente migrate sul nodo secondario ed il nodo primario viene messo in stato &#8220;standby&#8221;. Per ripristinare la situazione è sufficiente anche in questo caso forzare <em>debian-lenny-nodo1</em> a tornare online:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm node online debian-lenny-nodo1</pre></div></div>

<p><span style="color: #505050;"><em>Sesto test: interruzione manuale di un servizio</em></span></p>
<p>L&#8217;ultimo test della serie prevede l&#8217;interruzione manuale di un servizio. Verrà simulato il <em>crash</em> del servizio <em>apache2</em> tramite un comando <em>kill</em>, Il presupposto è che il servizio <em>apache2</em> sia in esecuzione su <em>debian-lenny-nodo1</em>:</p>

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

<p>Ecco le operazioni che il cluster esegue per porre rimedio alla situazione:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="console" style="font-family:monospace;">Jun 18 11:29:21 debian-lenny-nodo1 apache[24129]: [24187]: INFO: apache not running
...
Jun 18 11:29:21 debian-lenny-nodo1 crmd: [11091]: WARN: update_failcount: Updating failcount for cluster-apache2 on debian-lenny-nodo1 after failed monitor: rc=7 (update=value++, time=1276853361)
...
Jun 18 11:29:22 debian-lenny-nodo1 lrmd: [11088]: info: rsc:cluster-apache2:45: start</pre></td></tr></table></div>

<p>In sequenza quello che avviene è:</p>
<ul>
<li>linea 1) Il monitor ha rilevato che il servizio non sta funzionando;</li>
<li>linea 3) Pacemaker aggiorna il conteggio dei disservizi relativi alla risorsa cluster-apache2;</li>
<li>linea 5) La risorsa viene nuovamente eseguita;</li>
</ul>
<p>La risorsa è di nuovo attiva e funzionante.</p>
<p>E&#8217; possibile monitorare in maniera costante lo stato del cluster attraverso il comando <em>crm_mon</em> il cui funzionamento consiste nell&#8217;esecuzione del comando <em>crm status</em> ad intervalli regolari. <em>crm_mon</em> supporta il parametro <em>&#8211;failcount</em> che permette di avere un sommario dei disservizi rilevati sul cluster. Nell&#8217;esempio illustrato, l&#8217;output del comando sarà il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">...
Online: [ debian-lenny-nodo1 debian-lenny-nodo2 ]
&nbsp;
 Clone Set: ping_clone
     Started: [ debian-lenny-nodo1 debian-lenny-nodo2 ]
 Resource Group: cluster
     cluster-ip (ocf::heartbeat:IPaddr2):       Started debian-lenny-nodo1
     cluster-apache2    (ocf::heartbeat:apache):        Started debian-lenny-nodo1
&nbsp;
Migration summary:
* Node debian-lenny-nodo1: 
   ping:0: migration-threshold=1000000 fail-count=1
   cluster-apache2: migration-threshold=1000000 fail-count=1
* Node debian-lenny-nodo2:</pre></div></div>

<p>Il Migration summary presenta la situazione relativa alle risorse intaccate dai nostri test, il cui conteggio dei disservizi è 1 (fail-count=1).<br />
E&#8217; possibile azzerare tale conteggio effettuando un cleanup della risorsa:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm resource cleanup cluster-apache2
Cleaning up cluster-apache2 on debian-lenny-nodo1
Cleaning up cluster-apache2 on debian-lenny-nodo2</pre></div></div>

<p><strong>Conclusioni</strong></p>
<p>Giunti al termine di questo lunghissimo articolo le conclusioni da trarre sono molteplici. La prima di queste è che l&#8217;argomento Heartbeat/Pacemaker risulta tutt&#8217;altro che esaurito: esistono moltissime altre componenti del progetto che qui non sono state nemmeno accennate. Certo è che da questo confronto balza subito all&#8217;occhio come le differenze tra i due tipi di impiego siano sostanziali. La soluzione Heartbeat/Pacemaker sebbene sia evidentemente complicata offre un controllo insperato su tutte le componenti del cluster, oltre ad un monitoraggio costante di tutte le risorse configurate. L&#8217;implementazione della soluzione classica è immediata, ma come si è visto limitata.<br />
La scelta su quale sia la scelta migliore per la propria infrastruttura è unicamente dell&#8217;utente, che come sempre nel mondo OpenSource è libero di scegliere, sperimentare e realizzare.<br />
Nel prossimo articolo verrà presentata una soluzione Heartbeat/Pacemaker per implementare uno <em>Storage NFS Active/Active</em> basato su <em>DRBD</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2010/06/evoluzione-dellalta-affidabilita-su-linux-confronto-pratico-tra-heartbeat-classico-ed-heartbeat-con-pacemaker/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>OpenVPN: connessione sicura attraverso Internet di molti client ad un server</title>
		<link>http://www.miamammausalinux.org/2010/05/openvpn-connessione-sicura-attraverso-internet-di-molti-client-ad-un-server/</link>
		<comments>http://www.miamammausalinux.org/2010/05/openvpn-connessione-sicura-attraverso-internet-di-molti-client-ad-un-server/#comments</comments>
		<pubDate>Tue, 04 May 2010 15:23:37 +0000</pubDate>
		<dc:creator>Francesco Pedrini</dc:creator>
				<category><![CDATA[Network]]></category>
		<category><![CDATA[OpenVPN]]></category>
		<category><![CDATA[VPN]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=976</guid>
		<description><![CDATA[VPN significa, letteralmente Rete Privata Virtuale, cioè una serie di collegamenti virtuali e privati creati su un&#8217;infrastruttura ad accesso pubblico, come ad esempio Internet. Una rete privata virtuale consente di comunicare in maniera sicura attraverso un canale insicuro in una forma efficiente ed economica. In questo articolo vedremo come creare un server VPN a cui [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.miamammausalinux.org/wp-content/uploads/2010/05/openvpn.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/05/openvpn.png" alt="" width="100" height="26" class="alignnone size-full wp-image-1002" /></a></p>
<p>VPN significa, letteralmente Rete Privata Virtuale, cioè una serie di collegamenti virtuali e privati creati su un&#8217;infrastruttura ad accesso pubblico, come ad esempio Internet. Una rete privata virtuale consente di comunicare in maniera sicura attraverso un canale insicuro in una forma efficiente ed economica.</p>
<p>In questo articolo vedremo come creare un server VPN a cui far collegare diversi client, con l&#8217;obiettivo di creare una rete estesa e sicura. Il tutto verrà realizzato mediante il celebre software opensource <a title="OpenVPN" href="http://openvpn.net/">OpenVPN</a>.</p>
<p><strong>Un po&#8217; di teoria</strong></p>
<p>Prima di incominciare con la parte pratica, vediamo quali sono i concetti di base di una VPN.</p>
<p>L&#8217;esigenza alla base di una VPN è quella di creare un canale di comunicazione sicuro tra diversi soggetti, appoggiandosi ad un&#8217;infrastruttura già esistente, in modo da poter scambiare i propri dati come se si fosse connessi ad una grande rete LAN senza affrontare i costi altissimi per l&#8217;installazione di un&#8217;infrastruttura fisica tra diverse sedi.</p>
<p>Seguendo l&#8217;analogia che rappresenta Internet come un sistema idraulico, si può pensare ad una VPN come un &#8220;tubo dentro ad un tubo&#8221;.</p>
<p><strong>Tipologie di VPN</strong></p>
<p>Esistono innumerevoli tipi di tecnologie per la creazione di VPN che differiscono per diversi fattori, come ad esempio:</p>
<ul>
<li>I protocolli usati per creare i tunnel privati sulla rete sottostante;</li>
<li>La posizione degli endpoint dei tunnel;</li>
<li>Il livello di sicurezza fornito;</li>
<li>Il livello <a title="OSI" href="http://en.wikipedia.org/wiki/OSI_model">OSI</a> usato per l&#8217;interconnessione delle diverse reti;</li>
</ul>
<p>Attualmente vengono identificati tre tipologie principali di VPN:</p>
<ul>
<li>Trusted VPN</li>
<li>Secured VPN</li>
<li>Hybrid VPN</li>
</ul>
<p>Le VPN di tipo &#8216;Trusted&#8217; sono state le prime ad essere create e sono ancora in uso in alcuni ambienti come quelli bancari, si tratta di reti virtuali create a partire dall&#8217;hardware di rete: in questo caso esiste un <em>ISP</em> (<em>Internet Service Provider</em>) che stabilisce indirizzi e politiche di routing per il proprio cliente, creando così una vera e propria rete virtuale sulla propria infrastruttura. Il grosso vantaggio che forniscono queste reti è il fatto che il traffico viaggia su percorsi ben definiti ed è possibile stabilire in maniera molto semplice politiche di <em>QoS</em> (<em>la qualità del servizio offerto dalla rete</em>), anche se è necessario sacrificare un po&#8217; di flessibilità.</p>
<p>Le VPN di tipo &#8216;Secured&#8217; invece prevedono che il traffico venga incanalato su tunnel cifrati e spedito attraverso Internet come se fosse normale traffico. Nel caso in cui uno di questi pacchetti finisca nelle proverbiali mani sbagliate, le informazioni in esso contenute saranno comunque inaccessibili. Lo svantaggio rispetto alle trusted VPN è la mancanza di predeterminazione dei percorsi effettuati dai pacchetti.</p>
<p>L&#8217;ultima tipologia di VPN è, come suggerisce il nome, un mix tra le due tipologie precedenti, prendendo la sicurezza intrinseca nata dalla cifratura di tutto il traffico di rete delle Secured VPN e la possibilità di fare <em>QoS</em> in maniera semplice, tipica delle Trusted VPN.</p>
<p>OpenVPN permette di creare proprio Secured VPN.</p>
<p><strong>Installazione</strong></p>
<p>Giungiamo così alla parte più pratica dell&#8217;articolo, l&#8217;installazione e configurazione del servizio OpenVPN. L&#8217;articolo tratta l&#8217;installazione del software su un sistema operativo Debian Lenny, ma a pacchetti installati, le informazioni sono utilizzabili sulle più diffuse distribuzioni.</p>
<p>Verrà assunto inoltre che il router con il quale si accede ad internet permetta di fare l&#8217;apertura della porta 1194 TCP (e anche UDP se possibile) verso il vostro server.</p>
<p>Il primo step è naturalmente quello di installare openvpn:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># aptitude install openvpn</pre></div></div>

<p>Una volta installati i vari pacchetti, siamo pronti per sporcarci le mani.</p>
<p><strong>Generazione dei certificati</strong></p>
<p>Per la cifratura dei pacchetti OpenVPN usa il protocollo SSL, e per tanto è necessario generare tutta la serie di certificati per permettere sia la cifratura della connessione che l&#8217;autenticazione dei vari client.</p>
<p>Fortunatamente il pacchetto di OpenVPN fornisce una serie di script già pronti atti a tale scopo nel path <em>/usr/share/doc/openvpn/examples/easy-rsa/2.0/</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ls /usr/share/doc/openvpn/examples/easy-rsa/2.0/
build-ca          build-key-server  Makefile              sign-req
build-dh          build-req         openssl-0.9.6.cnf.gz  vars
build-inter       build-req-pass    openssl.cnf           whichopensslcnf
build-key         clean-all         pkitool
build-key-pass    inherit-inter     README.gz
build-key-pkcs12  list-crl          revoke-full</pre></div></div>

<p>Nulla vieta di lasciare gli script li dove sono e copiare solo i file generati nella directory di configurazione di OpenVPN, io per comodità preferisco spostare tutta la directory sotto <em>/etc/openvpn/easy-rsa/</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/easy-rsa
# cd /etc/openvpn/easy-rsa</pre></div></div>

<p>Tra i vari file potrete notare un file di testo chiamato &#8220;vars&#8221;, è un file che contiene tutte le variabili necessarie agli script di generazione di certificati e chiavi.<br />
Sebbene non sia necessario modificare i parametri preimpostati (poichè possono essere sovrascritti durante l&#8217;esecuzione dei vari script) risulta più comodo in caso di generazione di un gran numero di certificati.</p>
<p>I parametri da modificare sono i seguenti:</p>
<ul>
<li>KEY_SIZE</li>
<li>KEY_COUNTRY</li>
<li>KEY_PROVINCE</li>
<li>KEY_CITY</li>
<li>KEY_ORG</li>
<li>KEY_EMAIL</li>
</ul>
<p>Sono parametri abbastanza auto esplicativi, ecco come si presenta il mio file vars:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">export KEY_SIZE=2048
...
export KEY_COUNTRY=&quot;IT&quot;
export KEY_PROVINCE=&quot;IT&quot;
export KEY_CITY=&quot;Milano&quot;
export KEY_ORG=&quot;VostraAzienda&quot;
export KEY_EMAIL=&quot;my-email@vostraazienda.it&quot;</pre></div></div>

<p>A questo punto siamo pronti per generare la nostra <a href="http://it.wikipedia.org/wiki/Certificate_authority">certificate authority</a>, ossia la componente (auto generata) che validerà i certificati per la comunicazione, ed i certificati stessi.<br />
Prima di tutto dobbiamo fare in modo di esportare tutto ciò che è contenuto dentro al file &#8216;vars&#8217; appena modificato:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># source vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
# ./clean-all</pre></div></div>

<p>È necessario richiamare anche lo script &#8220;clean-all&#8221; per avere la certezza di partire con un ambiente pulito.</p>
<p>Ora possiamo generare la nostra <em>Certificate Authority</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ./build-ca
Generating a 1024 bit RSA private key
..................................................++++++
...++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [IT]:
State or Province Name (full name) [IT]:
Locality Name (eg, city) [Milano]:
Organization Name (eg, company) [VostraAzienda]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [VostraAzienda CA]:
Email Address [my-email@vostraazienda.it]:</pre></div></div>

<p>Alla richiesta di input mi sono limitato semplicemente a premere invio, i dati erano già corretti poichè sono stati modificati nel file &#8216;vars&#8217;.<br />
Ora possiamo creare il certificato per il server VPN:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ./build-key-server Gateway</pre></div></div>

<p><em>Gateway</em> è il nome della macchina su cui sto installando il server VPN, per coerenza la coppia chiave/certificato avrà il nome dell&#8217;host su cui viene usato. Vediamo l&#8217;esecuzione dello script:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Generating a 1024 bit RSA private key
..................++++++
.++++++
writing new private key to 'Gateway.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [IT]:
State or Province Name (full name) [IT]:
Locality Name (eg, city) [Milano]:
Organization Name (eg, company) [VostraAzienda]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [Gateway]:
Email Address [me@myhost.mydomain]:
&nbsp;
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'IT'
stateOrProvinceName   :PRINTABLE:'IT'
localityName          :PRINTABLE:'Milano'
organizationName      :PRINTABLE:'VostraAzienda'
commonName            :PRINTABLE:'Gateway'
emailAddress          :IA5STRING:'my-email@vostraazienda.it'
Certificate is to be certified until Apr 25 13:50:00 2020 GMT (3650 days)
Sign the certificate? [y/n]:y
&nbsp;
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated</pre></div></div>

<p>Quando lo script chiede una password è lecito premere semplicemente invio per evitare di dover immettere la password ogni (ri)avvio di OpenVPN.</p>
<p>Generiamo ora il file <a href="http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange">Diffie-Hellman</a>, necessario per l&#8217;avvio delle connessioni cifrate.<br />
Attenzione, è un&#8217;operazione MOLTO lunga, quindi preparatevi a prendervi un paio di caffè&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ./build-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
........+............</pre></div></div>

<p>Dopo la vostra ristorante pausa caffè, passiamo a generare l&#8217;ultima chiave necessaria per l&#8217;instaurazione di una connessione sicura, questa chiave dovrà essere copiata anche su tutti i client.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># openvpn --genkey --secret keys/ta.key</pre></div></div>

<p><strong>Generazione dei certificati per i client</strong></p>
<p>La generazione del certificato per il client è letteralmente identica alla generazione di un certificato per il server.<br />
Personalmente preferisco generare dei certificati nominali:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ./build-key fpedrini</pre></div></div>

<p>e seguirà una procedura identica a quella della generazione del certificato per il server.</p>
<p><strong>Configurazione del server</strong></p>
<p>Passiamo ora configurazione vera e propria del demone di OpenVPN.<br />
Anche in questo caso il pacchetto debian ci viene in aiuto con un file di configurazione già precotto e adatto ai nostri scopi, dobbiamo solo aggiustare qualche piccolo parametro.</p>
<p>Innanzitutto è necessario copiare il file di esempio nella directory giusta:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
# cd /etc/openvpn
# gunzip server.conf.gz</pre></div></div>

<p>Ora siamo pronti a modificare la configurazione, per brevità citerò solo le direttive che andremo a toccare:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">local 192.168.0.1
port 1194
proto udp</pre></div></div>

<p>Queste direttiva indicano ad OpenVPN rispettivamente:</p>
<ul>
<li>Su quale indirizzo ip locale mettersi in attesa di connessioni, se omessa il demone userà tutte le interfacce</li>
<li>Su quale porta ascoltare, la 1194 è il default</li>
<li>Che tipo di protocollo utilizzare per il tunnel, le possibilità sono &#8216;TCP&#8217; e &#8216;UDP&#8217;, vedremo più avanti le differenze</li>
</ul>

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

<p>Indica a OpenVPN di creare un tunnel al layer 3 del livello OSI, utilizzando &#8216;tap&#8217; invece, andremmo a creare un bridge di rete a livello 2.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">ca easy-rsa/keys/ca.crt
cert easy-rsa/keys/Gateway.crt
key easy-rsa/keys/Gateway.key  # This file should be kept secret
dh easy-rsa/keys/dh2048.pem</pre></div></div>

<p>Queste direttive invece indicano al demone dove andare a prendere i file relativi alla Certification Authority, al certificato del server e il file <em>Diffie-Hellman</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push &quot;route 192.168.1.0 255.255.255.0&quot;</pre></div></div>

<p>Questi parametri stabiliscono:</p>
<ul>
<li>la subnet e la maschera della rete della VPN, il server prenderà automaticamente il primo indirizzo</li>
<li>il file in cui salvare la lista degli ip assegnati dal dhcp interno di OpenVPN</li>
<li>la rotta che il server deve comunicare al client per fare in modo che possano raggiungere la rete dietro alla VPN.</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">;push &quot;redirect-gateway def1 bypass-dhcp&quot;</pre></div></div>

<p>Questa riga fa in modo che tutto il traffico generato dai client passi attraverso la VPN. Non sempre è consigliabile attivare questa opzione, poichè causa un notevole rallentamento nella connessione dei client dal momento che i pacchetti del traffico &#8220;normale&#8221; dovranno transitare sulla VPN prima di poter uscire su internet.<br />
Nella mia configurazione è stata lasciata commentata.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">push &quot;dhcp-option DNS 192.168.1.1&quot;
push &quot;dhcp-option DNS 208.67.220.220&quot;
push &quot;dhcp-option WINS 192.168.1.3&quot;</pre></div></div>

<p>Le prime tre righe permettono di forzare i server DNS e i server WINS tramite il DHCP interno di OpenVPN, mentre l&#8217;ultima permette ai client di comunicare tra di loro.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">keepalive 10 120</pre></div></div>

<p>Il keepalive di OpenVPN permette di tenere vive le sessioni che passano attraverso i firewall, il primo parametro stabilisce ogni quanti secondi mandare un messaggio verso il client (è qualcosa di simile ad un ping ICMP), il secondo invece stabilisce il periodo massimo di inattività di una connessione.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">tls-auth keys/ta.key 0</pre></div></div>

<p>È il file necessario per la creazione della connessione cifrata, il secondo parametro settato a 0 indica che la chiave sta venendo usata dal server, mentre sui client sarà impostato a 1.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">log-append  /var/log/openvpn/openvpn.log
verb 3</pre></div></div>

<p>E per concludere i parametri dedicati al logging, che sono abbastanza auto esplicativi. Il livello di verbosità può variare da 1 a 20.</p>
<p>Per testare rapidamente la configurazione è sufficiente lanciare direttamente OpenVPN (assicurandosi prima di aver fermato il demone lanciato dall&#8217;init script durante l&#8217;installazione):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># invoke-rc.d openvpn stop
Stopping virtual private network daemon: server.
# openvpn server.conf</pre></div></div>

<p>Se non ricevete nessun errore allora la vostra configurazione è corretta, potete interrompere l&#8217;esecuzione con Ctrl+C.</p>
<p>Come ultima cosa è necessario configurare il file <em>/etc/default/openvpn</em> per permettere l&#8217;avvio automatico del demone in fase di boot:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">...
...
AUTOSTART=&quot;server&quot;
...
...</pre></div></div>

<p>La riga fondamentale è <em>AUTOSTART=&#8221;server&#8221;</em>, che permette all&#8217;initscript di far partire il demone usando la configurazione &#8220;server&#8221;, quella da noi creata.</p>
<p><strong>Configurazione di IPTables</strong></p>
<p>Per consentire ai pacchetti che viaggiano sulla vpn di passare sulla rete vera è necessario abilitare il forwarding tramite iptables, con due semplici regolette:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">iptables -A INPUT -i tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT</pre></div></div>

<p>e ovviamente attivare il forward con</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">sysctl -w net.ipv4.ip_forward=1</pre></div></div>

<p><strong>Configurazione dei client</strong></p>
<p>La configurazione dei client è abbastanza rapida, innanzitutto vediamo cosa serve per un client:</p>
<ul>
<li>La coppia certificato/chiave per il client (i due file .key e .crt)</li>
<li>Il certificato della CA del server (il file ca.crt)</li>
<li>La chiave di autenticazione TLS (il file ta.key)</li>
<li>Il file di configurazione per il client.</li>
</ul>
<p>I primi tre pezzettini li possiamo recuperare tranquillamente dal server, li abbiamo generati nei passi precedenti, vediamo ora la struttura del file di configurazione:</p>

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

<p>Specifica che si tratta appunto di un client <img src='http://www.miamammausalinux.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">dev tun
proto udp</pre></div></div>

<p>queste righe specificano rispettivamente che stiamo creando una connessione a livello IP e che ci vogliamo connettere usando un tunnel UDP,<br />
Ovviamente questi dati devono coincidere con le impostazioni lato server</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">remote mightyvpn.vostraazienda.it 1194</pre></div></div>

<p>l&#8217;hostname e la porta a quale connettersi, anche in questo caso la porta deve coincidere con quella specificata nella configurazione del server.<br />
È possibile specificare più server remoti, nel caso in cui uno di essi sia inattivo, OpenVPN passerà al successivo.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun</pre></div></div>

<p>Queste direttive stabiliscono che:</p>
<ul>
<li>Il client OpenVPN dovrà tentare all&#8217;infinito di risolvere il nome del server (ovviamente è utile solo se come remote server si specifica un nome e non un indirizzo IP)</li>
<li>Il client non deve fare &#8216;bind&#8217; su una porta specifica</li>
<li>Il client deve fare &#8220;privilege dropping&#8221; dopo l&#8217;inizializzazione (inutile su sistemi windows)</li>
<li>Il client deve tentare di rendere persistenti il tunnel</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">ca ca.crt
cert fpedrini.crt
key fpedrini.key
ns-cert-type server
tls-auth ta.key 1</pre></div></div>

<p>Ed infine questi sono i parametri relativi ai certificati. Come potete vedere la configurazione è identica al lato server, con l&#8217;eccezione della riga &#8216;tls-auth&#8217;, che finisce per &#8220;1&#8243;.</p>
<p>Una volta salvato il file di configurazione come &#8216;/etc/openvpn/client.conf&#8217; e affiancato da tutti i vari file a corredo è possibile avviare la connessione ad OpenVPN.</p>
<p>Analogamente a quanto fatto per il server, è possibile fare in modo che il proprio pc avvii la connessione all&#8217;avvio del demone OpenVPN modificando opportunamente il file /etc/default/openvpn:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">...
...
AUTOSTART=&quot;client&quot;
...
...</pre></div></div>

<p><strong>Conclusioni</strong></p>
<p>Il test principale di funzionamento è quanto di più banale possa esserci: vedere cioè se dai client che si connettono alla rete si riesce ad accedere a computer presenti nella sotto rete, controllando servizi che si conosce come attivi o attraverso banali <em>ping</em>.<br />
In pochi passi un&#8217;intera infrastruttura può essere accessibile ovunque, grazie ad OpenVPN!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2010/05/openvpn-connessione-sicura-attraverso-internet-di-molti-client-ad-un-server/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Evoluzione dell&#8217;alta affidabilità su Linux: come orientarsi fra Hertbeat, Pacemaker, OpenAIS e Corosync</title>
		<link>http://www.miamammausalinux.org/2010/04/evoluzione-dellalta-affidabilita-su-linux-come-orientarsi-fra-hertbeat-pacemaker-openais-e-corosync/</link>
		<comments>http://www.miamammausalinux.org/2010/04/evoluzione-dellalta-affidabilita-su-linux-come-orientarsi-fra-hertbeat-pacemaker-openais-e-corosync/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 12:51:39 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Corosync]]></category>
		<category><![CDATA[Heartbeat]]></category>
		<category><![CDATA[OpenAIS]]></category>
		<category><![CDATA[Pacemaker]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=871</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160; Orientarsi nell&#8217;attuale panorama dei cluster sotto Linux potrebbe essere, particolarmente per un neofita, molto complicato. L&#8217;insieme di progetti, nomi e versioni è certamente variegato. Ottenere alta affidabilità di servizi sotto Linux è possibile in svariati modi: si può optare per una soluzione completamente commerciale come Veritas Cluster (http://www.symantec.com/it/it/business/cluster-server), si può considerare un prodotto Opensource [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux-ha.png" alt="linux-ha" title="linux-ha" width="100" height="100" class="alignnone size-full wp-image-259" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.miamammausalinux.org/wp-content/uploads/2009/11/pacemaker.png" alt="Pacemaker" title="pacemaker" width="100" height="100" class="size-full wp-image-872" /></p>
<p>Orientarsi nell&#8217;attuale panorama dei cluster sotto Linux potrebbe essere, particolarmente per un neofita, molto complicato. L&#8217;insieme di progetti, nomi e versioni è certamente variegato.<br />
Ottenere alta affidabilità di servizi sotto Linux è possibile in svariati modi: si può optare per una soluzione completamente commerciale come <em>Veritas Cluster</em> (<a href="http://www.symantec.com/it/it/business/cluster-server">http://www.symantec.com/it/it/business/cluster-server</a>), si può considerare un prodotto Opensource sponsorizzato da un&#8217;azienda commerciale come la <em>RedHat Cluster Suite</em> (<a href="http://www.redhat.com/cluster_suite/">http://www.redhat.com/cluster_suite/</a>), prodotta e manutenuta come dice il nome stesso da RedHat (ma disponibile per quasi tutte le distribuzioni) oppure utilizzare <em>Hertbeat</em> (<a href="http://www.linux-ha.org/">http://www.linux-ha.org/</a>) prodotto e manutenuto dalla comunità del progetto <strong>Linux-HA</strong>.<br />
Questo primo articolo cerca di analizzare l&#8217;evoluzione del progetto Heartbeat, facendo luce su quali siano oggi i software da utilizzare per creare un&#8217;architettura ad alta affidabilità attraverso i software OpenSource disponibili: Hertbeat stesso, Pacemaker sino ad arrivare alla Standard Based Cluster Framework con OpenAIS e Corosync.</p>
<p><strong>In principio era Heartbeat</strong></p>
<p>Il progetto Heartbeat nasce nel 1999 con l&#8217;obiettivo di creare e diffondere un software Opensource in grado di garantire l&#8217;alta affidabilità nei servizi erogati da sistemi Linux.<br />
Heartbeat è di fatto un software per creare cluster di servizi. Un cluster di servizi è composto da un insieme di macchine, definite <em>nodi</em>, sulle quali vengono distribuiti programmi definiti <em>risorse</em>. Se un nodo per qualsiasi ragione smette di funzionare, al suo posto ne subentra un altro in grado di garantire il funzionamento delle stesse risorse, con lo scopo di recare il minor disservizio possibile all&#8217;utente finale.<br />
Questa tipologia di funzionamento è definita <em>active-passive</em>. Una risorsa è attiva su un nodo <em>active</em> mentre gli altri nodi <em>passive</em> sono in attesa, pronti ad erogare la risorsa in caso di malfunzionamenti relativi al nodo attivo.</p>
<p>Prima della versione 2.0, Heartbeat supportava cluster composti unicamente da due macchine ed aveva strumenti integrati in grado di svolgere operazioni sulle risorse stesse in maniera limitata. Non era possibile definire priorità nell&#8217;avvio delle risorse o dipendenze di una risorsa rispetto ad un&#8217;altra. Relativamente alla singola risorsa Heartbeat si preoccupava solamente dell&#8217;avvio, del termine e del posizionamento della stessa all&#8217;interno di un nodo specifico.<br />
Il modo in cui il cluster gestiva una risorsa era definito dall&#8217;<em>RA</em>, il <em>Resource Agent</em>.<br />
Un Resource Agent era uno script a cui il sistema faceva riferimento per avviare, fermare e controllare lo stato delle risorse. I Resource Agent di Heartbeat 1 erano contenuti all&#8217;interno delle directory <em>/etc/ha.d/resource.d</em> e <em>/etc/init.d</em>. Questi altro non erano che script di avvio dei demoni che supportavano operazioni di start, stop e status. Potenzialmente quindi QUALSIASI servizio poteva essere posto sotto cluster (purché supportasse le tre operazioni citate), sebbene il controllo da parte del sistema di questi servizi fosse essenzialmente nullo.</p>
<p>I limiti insiti in un&#8217;architettura simile sono subito evidenti. Basti pensare ad uno scenario in cui Heartbeat eroga il database MySQL. Il cluster si preoccupa di avviare il servizio sul nodo attivo. Se però MySQL per qualsiasi ragione (carico di utenti eccessivo, saturazione del buffer, mancanza di spazio o banalmente uno stop manuale) smette di funzionare, Heartbeat non ovvia in alcuna maniera all&#8217;inconveniente e solo un eventuale crash del nodo attivo provoca il cosiddetto <em>switch della risorsa</em>, lo spostamento cioè della stessa sul nodo rimanente, che a sua volta diventa attivo.<br />
La possibilità di effettuare controlli sullo stato di salute delle risorse e di agire autonomamente in funzione di disservizi nelle versioni precedenti alla 2.0 di Heartbeat poteva essere abilitata mediante l&#8217;utilizzo di programmi esterni (ad esempio <a href="http://www.keepalived.org/">keepalived</a>), ma non era parte integrante del cluster.</p>
<p><strong>L&#8217;avvento del CRM</strong></p>
<p>Un gestore delle risorse è sempre esistito all&#8217;interno del software Heartbeat. In origine infatti le informazioni relative al posizionamento della risorse ed alla struttura del cluster venivano lette in fase di avvio da due file di testo:</p>
<ul>
<li><em>/etc/ha.d/ha.cf</em> contenente la definizione della struttura del cluster (numero ed indirizzo dei nodi, tempistiche di controllo, politica relativa ai log);
</li>
<li><em>/etc/ha.d/haresources</em> contenente la definizione delle risorse erogate dal cluster;
</li>
</ul>
<p>Questi file (identici su entrambi i nodi) contenevano informazioni che così come erano scritte, tali rimanevano sino al termine dell&#8217;esecuzione del programma Heartbeat.<br />
La configurazione era quindi statica ed una variazione, per essere assimilata dal sistema, comportava il cosiddetto <em>reload</em> del servizio Heartbeat, una rilettura totale dei file di configurazione.</p>
<p>Questo limite unito a quelli descritti nel paragrafo precedente sono stati al centro dell&#8217;evoluzione del progetto Heartbeat e sono culminati nel <em>CRM</em>, il <em>Cluster Resource Manager</em>.<br />
Il CRM introdotto con Heartbeat 2 evolve radicalmente la funzione del gestore delle risorse attraverso una gestione dinamica delle stesse, un totale controllo sui servizi erogati ed il supporto ad un numero di nodi maggiore di due.<br />
Se abilitato (esplicitamente, all&#8217;interno della configurazione di Heartbeat) il CRM consente infatti di gestire l&#8217;avvio e la destinazione delle risorse, raggrupparle, controllarne lo stato di salute e definire priorità di esecuzione di una risorsa rispetto ad un&#8217;altra. Se non abilitato Heartbeat continua a funzionare nella maniera classica descritta in precedenza.<br />
Utilizzando il CRM, tutte le informazioni relative alla configurazione dei nodi, delle risorse ed dello stato generale del cluster sono mantenute all&#8217;interno di un unico file XML denominato <em>CIB</em>, <em>Cluster Information Base</em>.<br />
I file che dalla versione 2 di Heartbeat permettono di definire il cluster sono quindi due:</p>
<ul>
<li><em>/etc/ha.d/ha.cf</em> contenente la definizione della struttura del cluster (che dichiara anche l&#8217;opzione crm=on, ed indica al sistema di utilizzare il CRM);
</li>
<li><em>/var/lib/heartbeat/crm/cib.xml</em> contenente tutte le informazioni relative alle risorse ed allo stato attuale del cluster;
</li>
</ul>
<p>I file illustrati sono identici in tutti i nodi. E va sottolineato come le operazioni manuali dirette sul CIB siano sconsigliate, in quanto esistono tool appositi (primo fra tutti il comando <em>crm</em>, che verrà illustrato nei successivi articoli di questa serie) che permettono di interagire con esso.<br />
L&#8217;altra grande novità di Heartbeat 2 risiede nel modo in cui le risorse vengono gestite. Infatti il metodo attraverso Resource Agent classici (sebbene supportato) viene sconsigliato in funzione di Resource Agent di tipo <em>OCF</em>, <em>Open Clustering Framework</em>. Questi Resource Agent oltre a possedere le medesime proprietà di quelli classici (quindi start, stop e status) supportano anche ulteriori opzioni che consentono di definire in maniera approfondita il comportamento della risorsa nelle varie situazioni, per aumentare il più possibile il controllo del sistema.<br />
A differenza degli RA classici, gli RA di tipo OCF risiedono nella cartella <em>/usr/lib/ocf/resource.d/</em>.<br />
Maggiori dettagli sui Resoruce Agent di tipo OCF verranno introdotti nei successivi articoli e sono consultabili all&#8217;indirizzo <a href="http://www.linux-ha.org/HeartbeatResourceAgent">http://www.linux-ha.org/HeartbeatResourceAgent</a>.</p>
<p><strong>L&#8217;evoluzione della specie: Pacemaker</strong></p>
<p>La necessità di creare un <em>CRM</em> sempre più evoluto che potesse occuparsi a trecentosessanta gradi delle risorse, rendendo più flessibile la gestione delle stesse ed ovviando ai limiti della componente integrata è stata evidenziata a partire dal 2004, anno in cui al progetto Heartbeat è stata affiancato lo sviluppo di un CRM indipendente.<br />
Il nome di questo progetto è <a href="http://www.clusterlabs.org">Pacemaker</a>.<br />
Pacemaker rappresenta un progetto di CRM a sé stante, indipendente dalla piattaforma cluster di Heartbeat, il cui obiettivo è quello di proporre un&#8217;interfaccia comune alla gestione delle risorse del cluster.<br />
Le figure riportate di seguito (ottenute dal sito ufficiale <a href="http://www.clusterlabs.org">http://www.clusterlabs.org</a>) riassumono le diverse tipologie di funzionamento di Pacemaker, partendo dalla classica Active-Passive:</p>
<div id="attachment_951" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2010/03/pacemaker-active-passive.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/03/pacemaker-active-passive-300x225.png" alt="Figura 1" title="pacemaker-active-passive" width="300" height="225" class="size-medium wp-image-951" /></a><p class="wp-caption-text">Figura 1</p></div>
<p>passando dal supporto di più nodi:</p>
<div id="attachment_953" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2010/03/pacemaker-n-plus-1.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/03/pacemaker-n-plus-1-300x225.png" alt="Figura 2" title="pacemaker-n-plus-1" width="300" height="225" class="size-medium wp-image-953" /></a><p class="wp-caption-text">Figura 2</p></div>
<p>per arrivare al supporto di più nodi collegati al medesimo storage:</p>
<div id="attachment_954" class="wp-caption alignnone" style="width: 310px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2010/03/pacemaker-n-to-n.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/03/pacemaker-n-to-n-300x225.png" alt="Figura 3" title="pacemaker-n-to-n" width="300" height="225" class="size-medium wp-image-954" /></a><p class="wp-caption-text">Figura 3</p></div>
<p>Ciascuna di queste tipologie di cluster rappresenta i diversi livelli di complessità ottenibili mediante l&#8217;impiego di Pacemaker.<br />
In questo primo articolo le informazioni illustrate vanno prese con beneficio di inventario, in quanto temi come DRBD o Load Balancing non sono ancora stati trattati. Ciò che però è importante capire sono i tre livelli nei quali il cluster viene diviso:</p>
<ul>
<li><em>Il livello hardware</em>: rappresentato dai nodi fisici;</li>
<li><em>Il cluster stack</em>: rappresentato dall&#8217;unione del CRM con il sistema di gestione della comunicazione dei nodi;</li>
<li><em>Il livello servizi</em>: rappresentato dall&#8217;insieme dei servizi del sistema che verranno fruiti;</li>
</ul>
<p>Balzerà all&#8217;occhio il fatto che all&#8217;interno del <em>cluster stack</em>, il sistema di gestione della comunicazione dei nodi è identificato come OpenAIS e non come Heartbeat. ll motivo di questo è spiegato nell&#8217;ultimo paragrafo di questo primo articolo. </p>
<p><strong>OpenAIS: l&#8217;avvento dello Standard Based Cluster Framework</strong></p>
<p>In tutte le immagini illustrate nel precedente paragrafo il cosiddetto <em>cluster stack</em> è rappresentato dall&#8217;unione di due componenti: la prima è il CRM su cui è stata fatta sufficiente chiarezza, la seconda è OpenAIS.<br />
Secondo la definizione ufficiale, OpenAIS è uno <em>Standard Based Cluster Framework</em> (ossia una struttura di supporto standard per i cluster) che implementa una serie di <em>API</em> (<em>Application Programming Interface</em>, un insieme di strumenti specifici) e di politiche volte a sviluppare applicazioni che mantengono attivi i servizi nonostante potenziali malfunzionamenti.<br />
OpenAIS rappresenta quindi il mezzo utilizzato dal sistema per garantire la comunicazione tra i nodi e permettere al CRM di interagire con gli stessi.<br />
Questo spiega la presenza di OpenAIS nelle figure presentate: la decisione su cosa utilizzare per rendere disponibile la struttura di supporto del cluster a Pacemaker è dell&#8217;utente, poiché Heartbeat non è il solo strumento utilizzabile che supporta lo <em>Standard Based Cluster Framework</em>.<br />
In origine il progetto OpenAIS oltre al Framework rendeva disponibile anche il <em>cluster engine</em>, il programma per la gestione dell&#8217;infrastruttura del cluster. Dal Luglio 2008 la parte relativa al cluster engine di OpenAIS è stata separata in un progetto a sé stante denominato <a href="http://www.corosync.org">Corosync</a>.<br />
Corosync è un <em>cluster engine</em> che si pone allo stesso livello di Heartbeat, il cui modello di configurazione verrà illustrato nei prossimi articoli.</p>
<p><strong>Conclusioni</strong></p>
<p>Il numero di nomi e definizioni illustrate in quest&#8217;articolo è oggettivamente enorme e giustifica la difficoltà nel mettere insieme le cose. La stesura di questo articolo ha richiesto molto più tempo del previsto proprio per via del fatto che oltre ai nomi, anche i concetti esposti sono moltissimi e parecchio complicati.<br />
Il rischio è quindi che queste tecnologie, che sono alla portata di tutti, rimangano confinate ai margini dell&#8217;utilizzo per via di tutte le variazioni che nel tempo hanno riguardato i vari progetti.<br />
Questo non deve succedere: le potenzialità di Pacemaker (con Hertbeat o Corosync) sono enormi e sarà evidente nel corso dei successivi articoli in cui finalmente verrà illustrato come mettere in pratica tutte queste tecnologie OpenSource.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2010/04/evoluzione-dellalta-affidabilita-su-linux-come-orientarsi-fra-hertbeat-pacemaker-openais-e-corosync/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Tor: introduzione all&#8217;onion routing</title>
		<link>http://www.miamammausalinux.org/2010/03/tor-introduzione-onion-routing/</link>
		<comments>http://www.miamammausalinux.org/2010/03/tor-introduzione-onion-routing/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 13:45:33 +0000</pubDate>
		<dc:creator>Marco Bonetti</dc:creator>
				<category><![CDATA[Network]]></category>
		<category><![CDATA[Tor]]></category>
		<category><![CDATA[Analisi traffico]]></category>
		<category><![CDATA[Censura]]></category>
		<category><![CDATA[Onion Routing]]></category>
		<category><![CDATA[Privacy]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=903</guid>
		<description><![CDATA[The Onion Router (comunemente chiamato Tor) è un software che implementa la tecnica omonima dell&#8217;onion routing per contrastare quella forma di censura chiamata analisi del traffico. Per capire il funzionamento e l&#8217;utilizzo di Tor, dobbiamo essere sicuri di conoscere quale problema vuole risolvere. Cosa è, quindi, l&#8217;analisi del traffico? Con analisi del traffico si definisce [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/03/tor.png" alt="Tor" title="Tor" width="100" height="64" class="size-full wp-image-927" /></p>
<p>The Onion Router (comunemente chiamato Tor) è un software che implementa la tecnica omonima dell&#8217;onion routing per contrastare quella forma di censura chiamata analisi del traffico.<br />
Per capire il funzionamento e l&#8217;utilizzo di Tor, dobbiamo essere sicuri di conoscere quale problema vuole risolvere. Cosa è, quindi, l&#8217;analisi del traffico?</p>
<p>Con analisi del traffico si definisce una tecnica censoria basata sull&#8217;analisi passiva del traffico prodotto da una macchina o da un gruppo di esse. Ispezionando i pacchetti che escono da una rete, un attaccante è in grado di inferire un sacco di informazioni riguardanti l&#8217;origine di quei pacchetti. Pensate a una mail: un attaccante che ne intercetta il contenuto è in grado di sapere chi sia il mittente, a quale indirizzo sta scrivendo e cosa gli vuole comunicare. Quando questo concetto viene spostato a livello di traffico di rete lo scenario non cambia: un attaccante che intercetta un qualsiasi traffico di rete è in grado di inferire, dall&#8217;header dei pacchetti, chi li ha inviati, chi li riceverà e, guardando il body, cosa si vogliono comunicare.<br />
Una prima soluzione a questo tipo di problemi è quello di impiegare la crittografia, sfortunatamente, in entrambi gli scenari descritti in precedenza, la crittografia stessa non è in grado di fermare l&#8217;analisi del traffico ma solo di impedire la lettura dei contenuti del corpo del messaggio: per come deve funzionare la comunicazione su Internet, le informazioni dell&#8217;header sono in chiaro e disponibili a chiunque riesca a leggerne il contenuto.<br />
Questo problema è stato affrontato da tempo, con soluzioni più o meno efficaci: all&#8217;inizio degli anni 80 David Chaum propose le Mix Networks, una serie di proxy server da utilizzarsi in cascata. In questo modo un attaccante doveva ispezionare il traffico in più punti (all&#8217;uscita di ogni proxy, per la precisione) per poter inferire qualcosa di utile sul mittente del pacchetto che usciva dall&#8217;ultimo nodo della catena. L&#8217;idea di Chaum, benchè non utilizzata, è stato il seme che ha lanciato la ricerca sull&#8217;onion routing, letteralmente routing a cipolla.<br />
La ricerca sull&#8217;onion routing è stata portata avanti nel corso degli anni 90 dallo United States Naval Research Laboratory che ha poi passato il lavoro alla Electronic Frountier Foundation e, Venerdì 13 Agosto 2004 al 13th USENIX Security Symposium, Tor è stato presentato al pubblico. Da li in poi lo sviluppo del programma è andato in crescendo, gli sviluppatori hanno salutato la EFF che ha dato casa alle prime versioni del programma e, al giorno d&#8217;oggi, Tor è un prodotto dell&#8217;ormai a se stante Tor Project.<br />
Ma non è solo con la storia che si impara come funziona un protocollo, quindi rimbocchiamoci le maniche e guardiamo da vicino come funziona un programma. Guardiamo la prima figura:</p>
<p><a href="http://www.miamammausalinux.org/wp-content/uploads/2010/03/htw1.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/03/htw1-300x191.png" alt="" width="300" height="191" class="alignnone size-medium wp-image-915" /></a></p>
<p>i nodi con un simbolo + verde sono relay della rete Tor, Jane e Bob sono dei server pubblicamente raggiungibili da Internet, Alice è la nostra protagonista e sta utilizzando Tor in modalità client. Dave è un particolare server pubblico chiamato &#8220;Tor directory server&#8221;, lui e i suoi simili forniscono la lista pubblica di relay Tor e la mantegono periodicamente aggiornata. Il primo passo compiuto dal client Tor di Alice è, appunto, quello di contattare un directory server per ottenere la lista dei nodi marchiati con un simbolo + verde.<br />
A questo punto Alice istruisce il proprio client di contattare il server Bob, per esempio perchè vuole visitare una pagina web ospitata li sopra, il nodo Tor di Alice si preoccupa di costruire una catena di nodi attraverso i quali invierà la richiesta, come mostrato nella seconda figura:</p>
<p><a href="http://www.miamammausalinux.org/wp-content/uploads/2010/03/roles1.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/03/roles1-300x191.png" alt="" width="300" height="191" class="alignnone size-medium wp-image-916" /></a></p>
<p>nella terminologia di Tor, i nodi prendono un particolare nome a seconda della loro posizione nella catena di comunicazione o circuito: il primo nodo si chiama Guard Node (nodo di guardia), il secondo Middleman Node (nodo intermediario) e il terzo Exit Node (nodo di uscita). La scelta dei nodi di una catena viene effettuata dal client di Alice in base alle informazioni ricevute dal directory server: ogni relay Tor quando si registra presso le directory invia il proprio indirizzo ip e una serie di caratteristiche. I nodi di uscita sono i più importanti: contattando loro personalmente le macchine esterne alla rete Tor devono dire esplicitamente di essere volenterosi e in grado di farlo. Parimenti, i nodi di guardia vincono questo status quando hanno servito la rete Tor per un lungo periodo: sono nodi fidati a cui possiamo affidare il primo passo per entrare nella rete. Tutti i rimanenti relay sono considerati nodi intermediari. Il perchè di queste scelte e di questa classificazione si può spiegare brevemente dicendo che sono il primo e l&#8217;ultimo nodo della catena che rappresentano un ottimo punto per attaccare il protocollo, purtroppo parlare di attacchi al protocollo Tor meriterebbe una serie di articoli a se stante, quindi per questa introduzione ci limitiamo a una seppur stringata spiegazione.<br />
Un altro punto importante è osservare il colore delle frecce: la comunicazione che avviene all&#8217;interno della rete Tor è completamente crittata, questo impedisce a un attaccante che riesca a intercettare uno qualsiasi di quei messaggi, di ricostruire tutto il flusso. Nella figura, l&#8217;ultimo collegamento (tra Exit e Bob) non è crittato ma questo dipende dal tipo di richiesta che ha effettuato Alice a monte del circuito: nel nostro esempio abbiamo ipotizzato una pagina web servita con HTTP, se Alice avesse usato HTTPS anche l&#8217;ultimo link sarebbe stato verde. Va ribadito, comunque, che l&#8217;ultima comunicazione è estranea alla trasmissione di informazioni all&#8217;interno del protocollo di Tor.<br />
Per capire come mai questo protocollo è resistente agli attacchi di analisi del traffico è utile analizzare cosa accade all&#8217;interno di un circuito:<br />
<a href="http://www.miamammausalinux.org/wp-content/uploads/2010/03/1.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/03/1-300x300.png" alt="" width="300" height="300" class="alignnone size-medium wp-image-917" /></a><br />
questo è il pacchetto che viene inviato da Alice a Guard, il contenuto della buccia rossa è protetto con le chiavi di Guard stesso, quindi solo lui può leggere cosa c&#8217;è scritto. Leggendo le istruzioni contenute in questo strato, Guard capisce che deve inviare il resto del contenuto a Middleman:<br />
<a href="http://www.miamammausalinux.org/wp-content/uploads/2010/03/2.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/03/2-300x300.png" alt="" width="300" height="300" class="alignnone size-medium wp-image-918" /></a><br />
questo è il contenuto visto da Middleman: come nel caso precedente la buccia di colore verde è leggibile solo dal destinatario. In questo strato Middleman legge che deve spedire il resto del contenuto ad Exit. Come potete notare, già a questo livello è sparita ogni indicazione riguardante Alice.<br />
 <a href="http://www.miamammausalinux.org/wp-content/uploads/2010/03/3.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/03/3-300x300.png" alt="" width="300" height="300" class="alignnone size-medium wp-image-919" /></a><br />
Questo è l&#8217;ultimo passaggio: Exit riceve da Middleman quello che rimane della cipolla, legge il contenuto decifrabile solo da lui e scopre che deve fare richiesta, secondo l&#8217;esempio che ci sta accompagnando per tutto l&#8217;articolo, di una pagina web presso il server Bob.<br />
Una volta che Bob ha trasmesso il contenuto necessario ad Exit questo impacchetterà tutto e spedirà a Middleman il quale, vedendo che gli sta arrivando una risposta da Exit, passerà a Guard e questi chiuderà il circuito inviando la risposta ad Alice.<br />
In questo modo il protocollo è in gradi di sconfiggere l&#8217;analisi del traffico: l&#8217;utilizzo della crittografia e del &#8220;remixaggio&#8221; dei pacchetti impedisce a un attaccante che osserva il traffico prodotto da uno qualsiasi dei nodi di correlarne il contenuto e il mittente. Inoltre, per prevenire che uno dei nodi del circuito possa leggere arbitrariamente il contenuto delle risposte, la comunicazione viene protetta con una chiave di sessione, che viene modificata frequentemente, apribile solo da Alice.</p>
<p>Per il momento questo è tutto: spero di aver stuzzicato il vostro interesse in questa tecnologia, l&#8217;installazione e l&#8217;utilizzo di questo programma sono sicuramente materiale per un prossimo articolo!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2010/03/tor-introduzione-onion-routing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux e la linea di comando, comandi particolari e poco conosciuti: gestione delle code di stampa</title>
		<link>http://www.miamammausalinux.org/2009/12/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-gestione-delle-code-di-stampa/</link>
		<comments>http://www.miamammausalinux.org/2009/12/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-gestione-delle-code-di-stampa/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 10:53:25 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Sistema]]></category>
		<category><![CDATA[Comandi per la stampa]]></category>
		<category><![CDATA[Comandi poco conosciuti]]></category>
		<category><![CDATA[CUPS]]></category>
		<category><![CDATA[Linea di comando]]></category>
		<category><![CDATA[Manipolazione file di testo]]></category>
		<category><![CDATA[Stampanti]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=883</guid>
		<description><![CDATA[Dopo aver affrontato i comandi interni alla shell Bash ed i comandi di sistema richiamabili all&#8217;interno dalla stessa per la manipolazione degli stream di output e dei contenuti dei file in questo articolo verranno trattati i comandi per la gestione delle code di stampa. Verranno illustrati i comandi per inviare un file direttamente alla stampante, [...]]]></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 aver affrontato i comandi interni alla shell Bash ed i comandi di sistema richiamabili all&#8217;interno dalla stessa per la manipolazione degli stream di output e dei contenuti dei file in questo articolo verranno trattati i comandi per la gestione delle code di stampa.<br />
Verranno illustrati i comandi per inviare un file direttamente alla stampante, analizzare la coda di stampa e rimuovere lavori in coda.</p>
<p>I comandi per operare sulle code di stampa nei sistemi Linux moderni sono forniti dal pacchetto del server di posta <a href="http://www.cups.org/">CUPS</a>. CUPS fornisce un set di comandi retro compatibili al precedente gestore della posta Linux, <a href="http://en.wikipedia.org/wiki/Line_Printer_Daemon_protocol">LPD</a>: questo significa che il nome degli stessi è stato mantenuto identico in modo da favorire l&#8217;integrazione di CUPS con i programmi che fanno riferimento a comandi di sistema come <em>lpstat</em>, <em>lpq</em> e così via.<br />
Sebbene CUPS di default renda disponibile un&#8217;interfaccia web alla porta 631, alla quale si può accedere con il proprio browser, molte volte potrebbe essere necessario utilizzare la linea di comando per operare sulle code di stampa. I comandi che consentono tali operazioni si dividono in comandi che richiedono i permessi dell&#8217;utente root ed in comandi utilizzabili da utenti non privilegiati.</p>
<p><strong>Informazioni sulle stampanti (utente root)</strong></p>
<p><strong><em>lpstat</em></strong></p>
<p>Capire quali sono le code configurate all&#8217;interno del sistema è il primo passo per iniziare ad operare all&#8217;interno delle stesse.<br />
Il comando <em>lpstat</em> consente di visualizzare diverse informazioni sulle stampanti installate all&#8217;interno del sistema, ad esempio attraverso l&#8217;opzione &#8220;-p&#8221; il comando restituisce l&#8217;elenco delle stampanti:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># lpstat -p
la stampante Brother-HL-4040CN è in attesa.  Abilitata da gio 19 nov 2009 18:23:32 CET
la stampante HPDeskJet9300 è in attesa. Abilitata da sab 21 nov 2009 18:15:58 CET
la stampante PDF è in attesa.  Abilitata da gio 19 nov 2009 17:29:14 CET</pre></div></div>

<p>Un diverso elenco, contenente i riferimenti delle stampanti (socket, path remoti, etc.) è ottenibile attraverso l&#8217;opzione &#8220;-v&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># lpstat -v
dispositivo per Brother-HL-4040CN: socket://192.168.1.13
dispositivo per HPDeskJet9300: smb://RASCA/RASCABOX/HPDeskjet9300
dispositivo per PDF: cups-pdf:/</pre></div></div>

<p>E&#8217; possibile inoltre identificare la coda di default verso cui vengono diretti i lavori in stampa (opzione &#8220;-d&#8221;):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># lpstat -d
destinazione predefinita di sistema: PDF</pre></div></div>

<p>Tutte le informazioni illustrate sono ottenibili in un unico contatto attraverso l&#8217;opzione &#8220;-t&#8221;, mentre, lanciato senza argomenti, il comando restituisce l&#8217;elenco dei lavori in coda, ottenibile anche con i comandi illustrati di seguito.</p>
<p><strong>Gestire la coda (utente root)</strong></p>
<p><strong><em>lpq</em></strong></p>
<p>E&#8217; possibile ottenere l&#8217;elenco dei lavori accodati nella stampante di default o di una specifica attraverso il comando <em>lpq</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># lpq
PDF è pronta
Posiz.   Proprietario    Stampa   Doc.             Dim. totali
1st     rasca   298     Command-Line Printing and Optio 396288 byte</pre></div></div>

<p>Nel caso si volessero conoscere i dettagli della coda relativa ad una stampante specifica, questa va specificata con l&#8217;opzione &#8220;-P&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># lpq -P HPDeskJet9300
HPDeskJet9300 è pronta
nessuna voce</pre></div></div>

<p><strong><em>lprm</em></strong></p>
<p>Per operare sulle code, rimuovendo lavori di cui si conosce l&#8217;identificativo (ottenuto attraverso <em>lpq</em>), è possibile utilizzare il comando <em>lprm</em>, indicando con l&#8217;opzione &#8220;-P&#8221; l&#8217;accoppiata coda/identificativo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># lprm -P PDF/298</pre></div></div>

<p><strong>Inviare stampe (utente non privilegiato)</strong></p>
<p><strong><em>lpr</em></strong></p>
<p>Se un utente comune volesse lanciare delle stampe da linea di comando, cosa molto utile in caso di lavori di sistema notturni, notifiche di problemi (o qualsiasi altro motivo per cui <strong>sia sensato utilizzare della carta!</strong>), il comando da utilizzare è <em>lpr</em> che stampa il contenuto di un file di testo passato come parametro:</p>

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

<p><strong><em>pr</em> e <em>fmt</em></strong></p>
<p><em>lpr</em> può essere utilizzato anche per dirigere l&#8217;output di un comando alla stampante. Ad esempio, utilizzando i comandi <em>pr</em> o <em>fmt</em> che formattano un file di testo per la stampa è possibile passare attraverso una <em>pipe</em> ad <em>lpr</em> la stampa da effettuare:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ pr -a testfile | lpr</pre></div></div>

<p>oppure</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ pr -a testfile | lpr</pre></div></div>

<p><strong><em>mpage</em></strong></p>
<p>Lo stesso discorso si applica al comando <em>mpage</em> che consente di operare con maggior dettaglio sul formato di stampa. Lanciato senza argomenti, <em>mpage</em> produrrà una pagina divisa in quattro contenente il testo all&#8217;interno del file passato come parametro. Attraverso l&#8217;opzione &#8220;-b&#8221;  è poi possibile specificare il formato della carta che verrà utilizzato dalla stampante (di default A4). Per conoscere i formati supportati è possibile utilizzare il parametro &#8220;-b&#8221; con l&#8217;aggiunta di un punto interrogativo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mpage -b?
Mpage knows about the following paper types:
Type           Points Wide Points High
-------------- ----------- -----------
Letter                 612         792
LetterSmall            612         792
Tabloid                792        1224
Ledger                1224         792
Legal                  612        1008
Statement              396         612
Executive              540         720
A0                    2384        3368
A1                    1684        2384
A2                    1192        1684
A3                     842        1192
A4                     596         842
A4Small                595         842
A5                     420         595
B4                     729        1032
B5                     516         729
Folio                  612         936
Quarto                 610         780
10x14                  720        1008</pre></div></div>

<p>Oltre all&#8217;utilizzo attraverso una <em>pipe</em>, mpage supporta anche la stampa diretta di file (anche in formato <em>postscript</em>), così come funziona <em>lpr</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mpage -PPDF testfile</pre></div></div>

<p>Numerose sono le opzioni disponibili per il comando <em>mpage</em> e sono tutte documentate nella <em>man page</em> del programma.</p>
<p><strong>Conclusioni</strong></p>
<p>Questa breve carrellata di comandi presenta alcune utili informazioni che potrebbero risultare vitali in situazioni (volute o meno) in cui non sia disponibile altro accesso al sistema che quello della linea di comando.<br />
Approfondendo presso i link presentati qui sotto sarà possibile acquisire la padronanza totale del sistema di stampa da linea di comando.</p>
<p><strong>Fonti di informazioni utili:</strong></p>
<p>Pagina ufficiale del progetto CUPS: <a href="http://www.cups.org/documentation.php/options.html">http://www.cups.org/documentation.php/options.html</a><br />
The Linux Printing Usage HOWTO: <a href="http://tldp.org/HOWTO/Printing-Usage-HOWTO.html">http://tldp.org/HOWTO/Printing-Usage-HOWTO.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/12/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-gestione-delle-code-di-stampa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un calendario personale con Apache</title>
		<link>http://www.miamammausalinux.org/2009/10/un-calendario-personale-con-apache/</link>
		<comments>http://www.miamammausalinux.org/2009/10/un-calendario-personale-con-apache/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 13:50:19 +0000</pubDate>
		<dc:creator>Marco Bonetti</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Calendario]]></category>
		<category><![CDATA[Calendario personale]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=835</guid>
		<description><![CDATA[Avete mai desiderato un comodo calendario personale sempre online da usare quando e come volete senza bisogno di far sapere ai vari google di turno cosa dovete fare il giovedì pomeriggio? La soluzione è piuttosto semplice e alla portata di chiunque abbia un server apache2 a disposizione. Installazione, configurazione ed utilizzo Ma andiamo con ordine! [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/10/CalendarServer.png" alt="Calendar Server" /><br />
Avete mai desiderato un comodo calendario personale sempre online da usare quando e come volete senza bisogno di far sapere ai vari google di turno cosa dovete fare il giovedì pomeriggio? <img src='http://www.miamammausalinux.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
La soluzione è piuttosto semplice e alla portata di chiunque abbia un server apache2 a disposizione.</p>
<p><strong>Installazione, configurazione ed utilizzo</strong></p>
<p>Ma andiamo con ordine! Se non avete già installato questo web server, fatelo ora, usando il metodo più appropriato per la vostra distribuzione linux preferita. A questo punto dovete editare il file di configurazione di default che può essere apache2.conf oppure httpd.conf e assicurarsi che siano abilitati seguenti moduli:</p>
<ul>
<li>mod_authn_file</li>
<li>mod_authz_user</li>
<li>mod_auth_basic</li>
<li>mod_auth_digest</li>
<li>mod_dav_fs</li>
</ul>
<p>I primi moduli sono necessari per regolare l&#8217;accesso alle risorse di apache, l&#8217;ultimo è quello che gestirà tutto il calendario.<br />
Bene, ora modificate la configurazione del modulo dav_fs inserendo le segenti voci:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;">DavLockDB <span style="color: #7f007f;">&quot;/usr/var/DavLock&quot;</span>
&lt;<span style="color: #000000; font-weight:bold;">Directory</span> <span style="color: #7f007f;">&quot;/srv/httpd/htdocs/calendars&quot;</span>&gt;
    Dav <span style="color: #0000ff;">On</span>
&nbsp;
    <span style="color: #00007f;">Order</span> <span style="color: #00007f;">Allow</span>,<span style="color: #00007f;">Deny</span>
    <span style="color: #00007f;">Allow</span> <span style="color: #00007f;">from</span> <span style="color: #00007f;">all</span>
&nbsp;
    <span style="color: #00007f;">AuthType</span> Digest
    <span style="color: #00007f;">AuthName</span> calendars
&nbsp;
    <span style="color: #00007f;">AuthUserFile</span> <span style="color: #7f007f;">&quot;/usr/user.passwd&quot;</span>
    AuthDigestProvider file
&nbsp;
    &lt;LimitExcept OPTIONS&gt;
        <span style="color: #00007f;">require</span> <span style="color: #00007f;">user</span> nomeutente
    &lt;/LimitExcept&gt;
&lt;/<span style="color: #000000; font-weight:bold;">Directory</span>&gt;</pre></div></div>

<p>La creazione del file <em>/usr/user.passwd</em> si effettua attraverso il seguente, semplice comando:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ htdigest -c &quot;/usr/user.passwd&quot; calendars nomeutente</pre></div></div>

<p>Ovviamente per le direttive siete liberissimi di scegliere i percorsi che più vi aggradano.<br />
Vediamo cosa vogliono dire le varie opzioni:</p>
<ul>
<li><em>DavLockDB</em> serve per specificare quale file apache userà come file di lock per impedire rovinose scritture simultanee sui file gestiti via dav_fs</li>
<li><em>Dav On</em> usato all&#8217;interno di un tag Directory abilita la gestione di quella cartella tramite il modulo dav_fs</li>
<li>Seguono le direttive standard per gestire l&#8217;autenticazione degli utenti tramite file di password</li>
<li>Infine con la direttiva <em>LimitExcept</em> si definisce il livello di accesso alle risorse</li>
</ul>
<p>Questa ultima direttiva è decisamente importante: il modulo dav_fs permette di eseguire degli upload di file sul proprio web server e sicuramente non vogliamo che tale comportamento sia aperto e disponibile a qualsiasi utente di internet!<br />
Così come è scritta, la direttiva richiede un accesso autenticato sia per la modifica dei calendari che per la loro lettura, se volessimo rilassare i permessi, possiamo usare <em>LimitExcept GET OPTIONS</em>: in questo modo è possibile a utenti non autenticati di visionare i file salvati in /calendars ma, francamente, sconsiglio di eseguire questo tipo di rilassamento.<br />
Bene, il server è pronto! Aprite la vostra applicazione di calendaring preferita, potete create un nuovo calendario all&#8217;indirizzo <em>http://server/calendars/calendario.ics</em> e usarlo per la gestione dei vostri appuntamenti.</p>
<p><strong>Possibili miglioramenti</strong></p>
<p>Prima di concludere, lascio qualche considerazione per possibili migliorie:</p>
<ul>
<li>L&#8217;acesso protetto da password serve per controllare chi può accedere alle risorse e chi no, ma senza un adeguato supporto crittografigo risulta quasi inutile: vi consiglio di combinare questa configurazione con il supporto di apache per https o di modificare la regola <em>Allow from</em> per restringere l&#8217;accesso alle risorse solo da connessioni sicure come tunnel ssh o vpn</li>
<li>L&#8217;architettura presentata è pensata per un calendar server casalingo, tuttavia scala bene se vogliamo tenere directory separate tra più utenti: basta replicare il blocco di direttive <em>Directory</em> per ogni utenza che si vuole aggiungere adattandola, ovviamente, al nuovo username. I problemi nascono quando si vogliono condividere i calendari in sola lettura:
<ul>
<li>Una prima soluzione, semplice, consiste nel mettersi d&#8217;accordo sull&#8217;accesso alle risorse: gli stessi client permettono di scegliere se impotare i calendari in sola lettura o meno.</li>
<li>Una seconda soluzione, più complessa, prevede l&#8217;utilizzo di più direttive <em>Limit</em> al posto di una <em>LimitExcept</em>, in questo modo potremmo usare, per esempio, <em>Limit GET OPTIONS</em> su <em>valid_users</em> per permettere la sola lettura agli utenti autenticati e <em>Limit PUT</em> al proprietario del calendario per permettere solo a lui la modifica dei contenuti. Tale strada, però, può essere potenzialmente pericolosa in caso di utilizzo di metodi http sconosciuti, per maggiori informazioni vi rimando alla <a href="http://httpd.apache.org/docs/2.2/mod/core.html#limit">documentazione ufficiale delle due direttive</a></li>
</ul>
</li>
<li>In questo articolo abbiamo usato il modulo dav_fs solo per gestire un file .ics ma in realtà abbiamo configurato un vero e proprio storage personale sul vostro server apache: potete prendere un qualsiasi client dav e caricare file sotto la cartella /calendars</li>
</ul>
<p><strong>Conclusioni</strong></p>
<p>Questo è tutto! Come avete potuto notare la creazione di un server per un calendario remoto personale non è poi tanto difficile, per quanto riguarda invece gli ambienti enterprise questa soluzione potrebbe essere un po troppo stretta ma in questo caso si possono applicare le altre idee proposte oppure sposarsi su programmi dedicati come la suite <a href="http://www.zimbra.com/">Zimbra</a> oppure il <a href="http://trac.calendarserver.org/">Calendar Server</a> di Apple.</p>
<p>Alla prossima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/10/un-calendario-personale-con-apache/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<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>4</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>
	</channel>
</rss>
