<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>nerdrug</title><description>nerdy stuff for nerdy people</description><link>https://nerdrug.org/</link><language>it-IT</language><generator>Astro</generator><item><title>introduzione a Open vSwitch</title><link>https://nerdrug.org/blog/introduzione-a-open-vswitch/</link><guid isPermaLink="true">https://nerdrug.org/blog/introduzione-a-open-vswitch/</guid><description>Open vSwitch è uno stack switch virtuale nato per gestire ambienti di virtualizzazione multi-server, reti virtuali, VLAN e OpenFlow.</description><pubDate>Thu, 08 Mar 2012 23:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AOpen vSwitch è uno stack switch virtuale nato per gestire gli ambienti
di virtualizzazione multi-server (dato che il classico bridging in
questi casi non è sufficiente) che può essere usato, in concomitanza con
OpenFlow, come &lt;strong&gt;control stack&lt;/strong&gt; per gli switch hardware.&lt;/p&gt;
&lt;p&gt;Ecco alcune della funzionalità più importanti:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;migrazione delle VM da host ad host (compresa la migrazione della
delle sessioni attive e delle configurazioni, ad es. policy di
routing, ACL, QoS, ecc)&lt;/li&gt;
&lt;li&gt;pieno supporto alle VLAN (standard 802.1q)&lt;/li&gt;
&lt;li&gt;supporto OpenFlow 1.0 con numerose estensioni&lt;/li&gt;
&lt;li&gt;QoS anche per singola VM&lt;/li&gt;
&lt;li&gt;tunnel GRE per connettere le VM anche in diversi data center (anche
attraverso IPsec)&lt;/li&gt;
&lt;li&gt;visibilità del traffico e statistiche avanzate grazie al supporto
NetFlow, sFlow, SPAN, ecc&lt;/li&gt;
&lt;li&gt;layer di compatibilità per il modulo bridge di linux (in questo modo
tutti i software che già utilizzano il bridge non necessitano di
alcuna modifica per utilizzare Open vSwitch)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Proviamo subito a sporcarci le mani…&lt;/p&gt;
&lt;h2 id=&quot;installazione&quot;&gt;Installazione&lt;/h2&gt;
&lt;h3 id=&quot;debian-way&quot;&gt;Debian way&lt;/h3&gt;
&lt;p&gt;Da debian wheezy sono disponibili i pacchetti di openvswitch…&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;aptitude install openvswitch-controller openvswitch-datapath-dkms openvswitch-brcompat&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I pacchetti si occuperanno, inoltre, di inizializzare il database di
Open vSwitch e avviare i vari servizi. Ricordiamo però che bisogna
avviare manualmente il demone ovs-brcompatd:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;ovs-brcompatd --pidfile --detach&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;da-sorgenti&quot;&gt;Da sorgenti&lt;/h3&gt;
&lt;p&gt;Una volta scaricati i sorgenti assicuriamoci di compilare e caricare il
modulo necessario per far lavorare Open vSwitch direttamente in kernel
space (aumentando in modo esponenziale la velocità) e il modulo di
compatibilità per il layer bridge di linux (brcompat):&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;./configure --with-linux&lt;span&gt;=&lt;/span&gt;/lib/modules/&lt;span&gt;`&lt;/span&gt;uname -r&lt;span&gt;`&lt;/span&gt;/build
make &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; make install

insmod datapath/linux/openvswitch_mod.ko

rmmod bridge
insmod datapath/linux/brcompat_mod.ko&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;creazione-del-database-di-open-vswitch&quot;&gt;creazione del database di Open vSwitch&lt;/h4&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;mkdir -p /usr/local/etc/openvswitch
ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;avvio-del-database-server&quot;&gt;avvio del database server&lt;/h4&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;ovsdb-server --remote&lt;span&gt;=&lt;/span&gt;punix:/usr/local/var/run/openvswitch/db.sock &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;                     --remote&lt;span&gt;=&lt;/span&gt;db:Open_vSwitch,manager_options &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;                     --private-key&lt;span&gt;=&lt;/span&gt;db:SSL,private_key &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;                     --certificate&lt;span&gt;=&lt;/span&gt;db:SSL,certificate &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;                     --bootstrap-ca-cert&lt;span&gt;=&lt;/span&gt;db:SSL,ca_cert &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;                     --pidfile --detach&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;inizializzazione-del-database&quot;&gt;inizializzazione del database&lt;/h4&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;ovs-vsctl --no-wait init&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;avvio-del-demone-ovswitchd&quot;&gt;avvio del demone ovswitchd&lt;/h4&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;ovs-vswitchd --pidfile --detach&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;avvio-del-demone-per-la-compatibilità-con-il-modulo-bridge-e-con-brctl&quot;&gt;avvio del demone per la compatibilità con il modulo bridge e con brctl&lt;/h4&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;ovs-brcompatd --pidfile --detach&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;casi-d-uso&quot;&gt;Casi d’uso&lt;/h2&gt;
&lt;p&gt;Open vSwitch viene impiegato soprattutto per centralizzare ed
automatizzare la gestione delle policy, delle VLAN, i tunnel, ecc, nelle
realtà con più sedi/data-center che devono gestire molti server di
virtualizzazione.&lt;/p&gt;
&lt;p&gt;Vediamo qualche utilizzo pratico con KVM.&lt;/p&gt;
&lt;h3 id=&quot;isolare-il-traffico-delle-vm-utilizzando-le-vlan&quot;&gt;Isolare il traffico delle VM utilizzando le VLAN&lt;/h3&gt;
&lt;p&gt;L’utilizzo più comune di Open vSwitch è quello di far dialogare 2 VM su
host diversi, configurati entrambi sulla stessa VLAN.&lt;/p&gt;
&lt;p&gt;Per fare questo test è necessario collegare i 2 host con uno switch che
supporti il protocollo 802.1q con la VLAN 9 configurata, oppure
collegare direttamente gli host (con una punto-punto).&lt;/p&gt;
&lt;figure class=&quot;center&quot;&gt;
&lt;img alt=&quot;Schema di due host Open vSwitch collegati tramite VLAN&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://nerdrug.org/images/posts/introduzione-a-open-vswitch/cover.webp&quot; width=&quot;380&quot; height=&quot;247&quot;/&gt;
&lt;/figure&gt;
&lt;p&gt;La nostra piccola rete è composta da:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;reti

&lt;ul&gt;
&lt;li&gt;VLAN 9 (A) -&amp;gt; 192.168.9.0/24&lt;/li&gt;
&lt;li&gt;VLAN 19 (B) -&amp;gt; 192.168.19.0/24&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
listend
&lt;ul&gt;
&lt;li&gt;host

&lt;ul&gt;
&lt;li&gt;server 1 -&amp;gt; 192.168.0.1&lt;/li&gt;
&lt;li&gt;server 2 -&amp;gt; 192.168.0.2&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
listend
&lt;ul&gt;
&lt;li&gt;VM

&lt;ul&gt;
&lt;li&gt;VM A1 -&amp;gt; 192.168.9.1&lt;/li&gt;
&lt;li&gt;VM A2 -&amp;gt; 192.168.9.2&lt;/li&gt;
&lt;li&gt;VM A3 -&amp;gt; 192.168.9.3&lt;/li&gt;
&lt;li&gt;VM B1 -&amp;gt; 192.168.19.1&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il nostro obiettivo è far dialogare la VM A1 con la VM A2.&lt;/p&gt;
&lt;h4 id=&quot;questi-passi-vanno-eseguiti-su-entrambi-i-server&quot;&gt;Questi passi vanno eseguiti su entrambi i server:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;creiamo il bridge aggiungendogli la scheda di rete (fisica) che utilizzeremo per il test:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;ovs-vsctl add-br br0
ovs-vsctl add-port br0 eth0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;creiamo la scheda di rete virtuale (tap)&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;tunctl -t tap0
ifconfig tap0 up&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aggiungiamola al bridge con il tag della VLAN 9&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;ovs-vsctl add-port br0 tap0 tag&lt;span&gt;=&lt;/span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;assegniamo un indirizzo ip al bridge&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# sul server 1:
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;ifconfig br0 &lt;span&gt;192&lt;/span&gt;.168.0.1

&lt;span&gt;# sul server 2:
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;ifconfig br0 &lt;span&gt;192&lt;/span&gt;.168.0.2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;avviamo una live con kvm sugli host&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;RANDOM_MAC&lt;span&gt;=&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;openssl rand -hex &lt;span&gt;6&lt;/span&gt; | sed &lt;span&gt;&apos;s/\(..\)/\1:/g; s/.$//&apos;&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;

kvm -cdrom grml64_2011.12.iso -m &lt;span&gt;512&lt;/span&gt; -boot d -net nic,macaddr&lt;span&gt;=&lt;/span&gt;$RANDOM_MAC &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;  -net tap,ifname&lt;span&gt;=&lt;/span&gt;tap0,script&lt;span&gt;=&lt;/span&gt;no,downscript&lt;span&gt;=&lt;/span&gt;no&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A questo punto assegniamo alle VM l’ip 192.168.9.1 e 192.168.9.2 ed il
gioco è fatto. Le VM dovrebbero dialogare senza problemi.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;far-dialogare-le-vm-nella-stessa-vlan-in-data-center-differenti&quot;&gt;Far dialogare le VM nella stessa VLAN in data-center differenti&lt;/h3&gt;
&lt;figure class=&quot;center&quot;&gt;
&lt;img alt=&quot;Schema di una VLAN tra data center collegati tramite tunnel GRE&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://nerdrug.org/images/posts/introduzione-a-open-vswitch/gre-tunnel.webp&quot; width=&quot;540&quot; height=&quot;288&quot;/&gt;
&lt;/figure&gt;
&lt;p&gt;Questo caso è molto simile al precedente, con l’unica differenza che i 2
host sono collegati con un tunnel GRE (non criptato) perché risiedono in
data-center diversi.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IP pubblici

&lt;ul&gt;
&lt;li&gt;server 1 -&amp;gt; 1.1.1.1&lt;/li&gt;
&lt;li&gt;server 2 -&amp;gt; 2.2.2.2&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Una volta eseguite tutte le operazioni del caso precedente, prima di
avviare la VM, aggiungiamo la configurazione per il tunnel GRE:&lt;/p&gt;
&lt;h4 id=&quot;server-1&quot;&gt;server 1:&lt;/h4&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;ovs-vsctl add-port br0 gre0 -- set interface gre0 type&lt;span&gt;=&lt;/span&gt;gre options:remote_ip&lt;span&gt;=&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;.2.2.2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;server-2&quot;&gt;server 2:&lt;/h4&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;ovs-vsctl add-port br0 gre0 -- set interface gre0 type&lt;span&gt;=&lt;/span&gt;gre options:remote_ip&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;.1.1.1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A questo punto le nostre solite VM A1 e A3 riusciranno nuovamente a
dialogare, utilizzando il tunnel GRE.&lt;/p&gt;
&lt;p&gt;Ovviamente Open vSwitch prevede l’utilizzo di VPN IPsec (racoon) tramite
dei tool che ne semplificano la creazione e il monitoraggio.&lt;/p&gt;
&lt;h3 id=&quot;gestione-tramite-openflow&quot;&gt;Gestione tramite OpenFlow&lt;/h3&gt;
&lt;p&gt;Open vSwitch viene utilizzato anche come “semplice” switch gestito da
OpenFlow.&lt;/p&gt;
&lt;p&gt;In questo modo le potenzialità dell’architettura di rete diventano
veramente notevoli.&lt;/p&gt;
&lt;p&gt;Ma di questo, magari parleremo un’altra volta.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://delicious.com/kalos.nerd/openvswitch&quot; target=&quot;_blank&quot;&gt;Risorse utili&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>networking</category><category>openflow</category></item><item><title>btrfs in debian con apt-btrfs-snapshot</title><link>https://nerdrug.org/blog/btrfs-in-debian-con-apt-btrfs-snapshot/</link><guid isPermaLink="true">https://nerdrug.org/blog/btrfs-in-debian-con-apt-btrfs-snapshot/</guid><description>Da qualche giorno mi sono (finalmente) deciso ad utilizzare btrfs come filesystem predefinito per il mio portatile.</description><pubDate>Wed, 30 Nov 2011 23:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;left&quot;&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&quot;Logo del filesystem Btrfs&quot; class=&quot;left&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://nerdrug.org/images/posts/btrfs-in-debian-con-apt-btrfs-snapshot/cover.webp&quot; width=&quot;135&quot; height=&quot;135&quot;/&gt;
Da qualche giorno mi sono (finalmente) deciso ad utilizzare btrfs come
filesystem predefinito per il mio portatile.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;In questo post vedremo come utilizzare il programma apt-btrfs-snapshot
con Debian GNU/Linux e qualche piccolo trucchetto per btrfs.&lt;/p&gt;
&lt;p&gt;Non potendo migrare facilmente il filesystem di root, data la mia
configurazione con LVM + dm-crypt, ho deciso di installare ex-novo
Debian Sid (unstable).&lt;/p&gt;
&lt;h2 id=&quot;utilizzare-btrfs-come-fs-di-root-in-debian&quot;&gt;Utilizzare btrfs come fs di root in Debian&lt;/h2&gt;
&lt;p&gt;Al primo boot si presenta subito un fastidioso &lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=612809&quot; target=&quot;_blank&quot;&gt;problemino&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ovvero l’init si avvia in &lt;em&gt;maintenance mode&lt;/em&gt; perché non riesce a trovare
il binario “fsck.btrfs”. Il modo più semplice per aggirare il problema,
in attesa della chiusura del bug, è impostare a &lt;strong&gt;0&lt;/strong&gt; il sesto campo
(pass) relativo al root file system nel file /etc/fstab.&lt;/p&gt;
&lt;p&gt;Montiamo il root file system in lettura-scrittura e modifichiamo il
file.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;mount -o remount,rw /&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;file: /etc/fstab&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# &amp;lt;file system&amp;gt; &amp;lt;mount point&amp;gt;   &amp;lt;type&amp;gt;  &amp;lt;options&amp;gt;    &amp;lt;dump&amp;gt;  &amp;lt;pass&amp;gt;
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;
&lt;span&gt;# root fs
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;/dev/sda2       /               btrfs   ssd,noatime  &lt;span&gt;0&lt;/span&gt;       &lt;span&gt;0&lt;/span&gt;

&lt;span&gt;[&lt;/span&gt;...&lt;span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;installare-ed-abilitare-apt-btrfs-snapshot&quot;&gt;Installare ed abilitare apt-btrfs-snapshot&lt;/h2&gt;
&lt;p&gt;Questo programma si occupa di eseguire uno snapshot del root file system
ad ogni modifica relativa alla gestione locale dei pacchetti
(installazioni/aggiornamenti/rimozioni), tramite gli hook messi a
disposizione da APT.&lt;/p&gt;
&lt;p&gt;Purtroppo il pacchetto apt-btrfs-snapshot non è stato ancora incluso nei
repository di debian, probabilmente perché l’installer non inizializza
il pool btrfs in maniera compatibile con apt-btrfs-snapshot.&lt;/p&gt;
&lt;p&gt;Il pacchetto in questione richiede che il root file system non sia nella
root del pool btrfs ma in un sotto-volume nominato &lt;strong&gt;@&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Per copiare tutto il contenuto della root nel nuovo sotto-volume,
creiamo semplicemente uno snapshot:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;btrfs subvolume snapshot / /@&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In questo modo avremo una copia di tutti i file in pochi millisecondi
;).&lt;/p&gt;
&lt;p&gt;Una volta creato il sotto-volume &lt;strong&gt;@&lt;/strong&gt; andiamo a modificare il file fstab
e la configurazione di grub, in modo da utilizzare come root file system
il sotto-volume &lt;strong&gt;@&lt;/strong&gt; e non più la root del pool:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;file: /etc/fstab&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# &amp;lt;file system&amp;gt; &amp;lt;mount point&amp;gt;   &amp;lt;type&amp;gt;  &amp;lt;options&amp;gt;             &amp;lt;dump&amp;gt;  &amp;lt;pass&amp;gt;
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;
&lt;span&gt;# root fs
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;/dev/sda2       /               btrfs   subvol&lt;span&gt;=&lt;/span&gt;@,ssd,noatime  &lt;span&gt;0&lt;/span&gt;       &lt;span&gt;0&lt;/span&gt;

&lt;span&gt;[&lt;/span&gt;...&lt;span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;file: /etc/default/grub&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;[&lt;/span&gt;...&lt;span&gt;]&lt;/span&gt;
GRUB_CMDLINE_LINUX&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;rootflags=subvol=@&quot;&lt;/span&gt;
&lt;span&gt;[&lt;/span&gt;...&lt;span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aggiorniamo grub2:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;update-grub2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Adesso possiamo fare un bel reboot, per essere sicuri che tutto sia
andato bene.&lt;/p&gt;
&lt;p&gt;Una volta riavviato controlliamo che l’attuale root file system sia
veramente il sotto-volume &lt;strong&gt;@&lt;/strong&gt;, semplicemente controllando se esiste il
file @ nella root.&lt;/p&gt;
&lt;p&gt;Se non esiste, possiamo montare la root del pool e cancellare tutto
tranne la directory &lt;strong&gt;@&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;mount /dev/sda2 /mnt

rm -r &lt;span&gt;`&lt;/span&gt;ls /mnt/* | grep -v @&lt;span&gt;`&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A questo punto siamo pronti ad installare ed utilizzare
apt-btrfs-snapshot:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;wget http://launchpadlibrarian.net/82530974/apt-btrfs-snapshot_0.2.1_all.deb
dpkg -i apt-btrfs-snapshot_0.2.1_all.deb&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Controlliamo manualmente se tutto è andato bene:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# questo comando dovrebbe riportare &quot;Supported&quot;
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;apt-btrfs-snapshot supported

&lt;span&gt;# creiamo uno snapshot
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;apt-btrfs-snapshot snapshot

&lt;span&gt;# controlliamo se lo snapshot viene listato
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;apt-btrfs-snapshot list&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Adesso esegundo il mount della root del pool dovremmo vedere lo snapshot
fatto poco prima:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# montiamo la root del pool btrfs
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;mount /dev/sda2 /mnt/

&lt;span&gt;# facciamoci listare il contenuto
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;ls -lah /mnt/

&lt;span&gt;# dovrebbero esserci dei file tipo:
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;# @ e @apt-snapshot-2011-12-01_11:56:42&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;snapshot-automatici-manuali-e-pulizia&quot;&gt;snapshot automatici, manuali e pulizia&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.patshead.com/2010/09/simple-automated-btrfs-snapshots-with-btrfs-snap.html&quot; target=&quot;_blank&quot;&gt;Questo script&lt;/a&gt; ci permette di automatizzare, in modo semplice, la creazione di
snapshot, in base al tempo.&lt;/p&gt;
&lt;p&gt;Se invece vogliamo qualcosa da lanciare una volta ogni tanto, possiamo
utilizzare qualcosa di simile:&lt;/p&gt;

&lt;p&gt;Inoltre potremmo snellire la lista dei backup automatici fatti da
apt-btrfs-snapshot con uno &lt;a href=&quot;http://blog.patshead.com/2011/06/supplimenting-btrfs-snap-with-apt-btrfs-snapshot.html&quot; target=&quot;_blank&quot;&gt;script del genere&lt;/a&gt;, magari mettendolo in
cron anziché usando gli hook di APT.&lt;/p&gt;
&lt;h2 id=&quot;conclusioni&quot;&gt;Conclusioni&lt;/h2&gt;
&lt;p&gt;Btrfs è un file system con delle grandissimi potenzialità. Speriamo
riesca presto a consolidarsi ed a raggiungere le funzionalità del suo
diretto concorrente, ZFS.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://delicious.com/kalos.nerd/btrfs&quot; target=&quot;_blank&quot;&gt;Risorse utili&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>apt</category><category>debian</category><category>linux</category><category>btrfs</category></item><item><title>ganeti: gestore di cluster di macchine virtuali</title><link>https://nerdrug.org/blog/ganeti-gestore-di-cluster-di-macchine-virtuali/</link><guid isPermaLink="true">https://nerdrug.org/blog/ganeti-gestore-di-cluster-di-macchine-virtuali/</guid><description>Ganeti è un software scritto in Python, sviluppato e mantenuto da Google dal 2007, per gestire in maniera semplice e ridondata cluster di macchine virtuali.</description><pubDate>Mon, 07 Nov 2011 23:00:00 GMT</pubDate><content:encoded>&lt;figure class=&quot;center&quot;&gt;
&lt;img alt=&quot;Schema di un cluster di macchine virtuali gestito con Ganeti&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://nerdrug.org/images/posts/ganeti-gestore-di-cluster-di-macchine-virtuali/cover.webp&quot; width=&quot;500&quot; height=&quot;259&quot;/&gt;
&lt;/figure&gt;
&lt;p&gt;Ganeti è un software scritto in Python, sviluppato e mantenuto da Google
dal 2007, per gestire in maniera semplice e ridondata cluster di
macchine virtuali.&lt;/p&gt;
&lt;p&gt;Si basa sul concetto di &lt;a href=&quot;http://en.wikipedia.org/wiki/N%2B1_redundancy&quot; target=&quot;_blank&quot;&gt;ridondanza N+1&lt;/a&gt;,
utilizzando DRBD per la replica dei dischi delle macchine virtuali.&lt;/p&gt;
&lt;h2 id=&quot;caratteristiche&quot;&gt;Caratteristiche&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;utilizza come hypervisor KVM o Xen (PVM e HVM)&lt;/li&gt;
&lt;li&gt;macchine virtuali in &lt;a href=&quot;http://en.wikipedia.org/wiki/High-availability_cluster#Node_configurations&quot; target=&quot;_blank&quot;&gt;HA N+1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;gestione dei dischi delle vm tramite LVM (consigliato) o file disco
(raw o qcow2)&lt;/li&gt;
&lt;li&gt;live migration (se si utilizza DRBD)&lt;/li&gt;
&lt;li&gt;migrazione automatica in base a diversi parametri (ram disponibile,
carico del nodo, ecc)&lt;/li&gt;
&lt;li&gt;accesso diretto tramite VNC o virtual serial console&lt;/li&gt;
&lt;li&gt;media scalabilità (è consigliato un numero di nodi non superiore a 40)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Una considerazione importante da fare è che l’HA di ganeti riguarda
esclusivamente lo storage.&lt;/p&gt;
&lt;p&gt;Al momento della creazione di una macchina virtuale ridondata, bisogna
specificare il nodo primario e il secondario.&lt;/p&gt;
&lt;p&gt;Nel primario sarà avviata l’istanza della vm, nel secondario verrà fatto
un backup, tramite DRBD (protocollo C), dei dischi collegati alla vm.
Quindi se il nodo in cui è avviata l’istanza cade, vengono fermate tutte
le vm che avevano quel nodo come primario, e bisogna far partire
manualmente le vm nel nodo secondario.&lt;/p&gt;
&lt;p&gt;Purtroppo ganeti non prevede alcuna automazione in merito. Anche se è
sempre possibile affiancargli un sistema come &lt;a href=&quot;http://www.clusterlabs.org/&quot; target=&quot;_blank&quot;&gt;peacemaker&lt;/a&gt; o &lt;a href=&quot;http://www.linux-ha.org/wiki/Heartbeat&quot; target=&quot;_blank&quot;&gt;heatbeat&lt;/a&gt;.&lt;/p&gt;
&lt;figure class=&quot;center&quot;&gt;
&lt;img alt=&quot;Schema dell’alta disponibilità con Ganeti e DRBD&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://nerdrug.org/images/posts/ganeti-gestore-di-cluster-di-macchine-virtuali/high-availability.webp&quot; width=&quot;650&quot; height=&quot;292&quot;/&gt;
&lt;/figure&gt;
&lt;p&gt;Un’altra caratteristica importante del progetto è che gode di una
comunità abbastanza attiva, anche se a volte un po’ rigida (vedi ad
esempio il supporto a &lt;a href=&quot;http://code.google.com/p/ganeti/issues/detail?id=186&quot; target=&quot;_blank&quot;&gt;DRBD protocollo A&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Questo post è composto da vari appunti che ho preso nell’arco
dell’utilizzo di questo ottimo programma. Il suo scopo è descriverne, a
grandi linee, il suo funzionamento. Se si vuole approfondire è
necessario leggere la &lt;a href=&quot;http://docs.ganeti.org/ganeti/current/html/&quot; target=&quot;_blank&quot;&gt;documentazione ufficiale&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;installazione&quot;&gt;Installazione&lt;/h2&gt;
&lt;p&gt;L’architettura che creeremo è composta da un piccolo cluster ridondato,
formato da 2 nodi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;nodo1&lt;/strong&gt; - sarà il nodo master dell’intero cluster&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nodo2&lt;/strong&gt; - un nodo normale, configurato in modo da prendere il posto
del nodo master, in caso di fault di quest’ultimo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Come sistema operativo dei vari nodi utilizzeremo &lt;strong&gt;Debian squeeze
GNU/Linux&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Entrambi i nodi dispongono di 1 HD da 1TB, così partizionato:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;20 GB&lt;/strong&gt; - per l’OS dell’host (partizionato a piacimento)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;16 GB&lt;/strong&gt; (o più) - per lo swap dell’host e dei vari guest, tramite
l’&lt;a href=&quot;http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Virtualization/sect-Virtualization-Tips_and_tricks-Overcommitting_with_KVM.html&quot; target=&quot;_blank&quot;&gt;overcommitting&lt;/a&gt; di kvm&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;200 GB&lt;/strong&gt; - per i template ed i backup&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;il resto&lt;/strong&gt; - LVM per i dischi delle vm&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le seguenti operazioni vanno effettuate su tutti i nodi.&lt;/p&gt;
&lt;p&gt;Assicuriamoci di avere come locale predefinito *&lt;strong&gt;&lt;em&gt;en_US.UTF-8&lt;/em&gt;&lt;/strong&gt;*, e di
utilizzare lo stesso timezone in tutti i nodi.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;dpkg-reconfigure locales
dpkg-reconfigure tzdata&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;installazione-dei-pacchetti-base&quot;&gt;Installazione dei pacchetti base&lt;/h4&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;apt-get install qemu-kvm drbd8-utils lvm2 ssh bridge-utils iproute iputils-arping &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;                python python-pyopenssl openssl &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;                python-pyparsing python-simplejson &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;                python-pyinotify python-pycurl socat &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;                build-essential python-paramiko &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;                dump kpartx&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;configurazione-del-modulo-drbd&quot;&gt;Configurazione del modulo drbd&lt;/h4&gt;
&lt;p&gt;Assicuriamoci di avere un kernel con il supporto per drbd, e
disabilitiamo l’helper di default:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;echo &lt;span&gt;&quot;drbd minor_count=128 usermode_helper=/bin/true&quot;&lt;/span&gt; &amp;gt;&amp;gt; /etc/modules
depmod -a
modprobe drbd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;configurazione-della-rete&quot;&gt;Configurazione della rete&lt;/h4&gt;
&lt;p&gt;In questo post adotteremo una classica configurazione con bridge
virtuali, per poter semplicemente instradare il traffico alle vm. Per
una configurazione avanzata è consigliabile utilizzare delle VLAN.&lt;/p&gt;
&lt;p&gt;Per prima cosa dobbiamo impostare tutti gli ip e gli hostname che
verranno utilizzati nel nostro cluster. Ganeti per i nomi host utilizza
il “fully qualified host name”, in modo da evitare la chiamata di
sistema alla libreria del resolver. Questo è fondamentale, ad esempio,
se si virtualizza all’interno dell’infrastruttura il/i server DNS che
verranno utilizzati dalla stessa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;nodo1&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;file: /etc/hostname&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;nodo1.ganeti.test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;nodo2&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;file: /etc/hostname&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;nodo2.ganeti.test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Inoltre bisogna impostare un hostname per il cluster di ganeti, in modo
che se cambiamo il ruolo del nodo2, da normale a master, il sistema
configurerà automaticamente un alias dell’interfaccia di rete, del
nodo2, con l’ip del cluster.&lt;/p&gt;
&lt;p&gt;Impostiamo il file hosts in entrambi i nodi:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;file: /etc/hosts&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;127&lt;/span&gt;.0.0.1       localhost.localdomain localhost

&lt;span&gt;10&lt;/span&gt;.0.0.1        cluster.ganeti.test   cluster

&lt;span&gt;10&lt;/span&gt;.0.0.11       nodo1.ganeti.test     nodo1
&lt;span&gt;10&lt;/span&gt;.0.0.12       nodo2.ganeti.test     nodo2

&lt;span&gt;10&lt;/span&gt;.0.0.101      vm1.ganeti.test       vm1
&lt;span&gt;10&lt;/span&gt;.0.0.102      vm2.ganeti.test       vm2
&lt;span&gt;10&lt;/span&gt;.0.0.250      template.ganeti.test  template&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dopodiché è necessario configurare il bridge virtuale.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;file: /etc/network/interfaces&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto vbr0
iface vbr0 inet static
        address &lt;span&gt;10&lt;/span&gt;.0.0.11
        netmask &lt;span&gt;255&lt;/span&gt;.255.255.0
        network &lt;span&gt;10&lt;/span&gt;.0.0.0
        broadcast &lt;span&gt;10&lt;/span&gt;.0.0.255
        bridge_ports eth0
        bridge_stp off
        bridge_fd &lt;span&gt;0&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Stessa cosa per il nodo2, cambiando solamente l’ip.&lt;/p&gt;
&lt;p&gt;Reinizializziamo le interfaccie e la configurazione di rete:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;/etc/init.d/networking restart
/etc/init.d/hostname.sh start&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;configurazione-lvm&quot;&gt;Configurazione LVM&lt;/h4&gt;
&lt;p&gt;Per poter sfruttare la ridondanza sui deschi delle vm, è necessario
configurare LVM:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# inizializziamo una partizione per l&apos;utilizzo di LVM
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;pvcreate /dev/sdb1

&lt;span&gt;# aggiungiamo la partizione ad un VG
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;vgcreate ganeti /dev/sdb1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Assicuriamoci di aggiungere i device drbd alla direttiva &lt;em&gt;filter&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;file: /etc/lvm/lvm.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;filter &lt;span&gt;=&lt;/span&gt; &lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;r|/dev/cdrom|&quot;&lt;/span&gt;, &lt;span&gt;&quot;r|/dev/drbd[0-9]+|&quot;&lt;/span&gt; &lt;span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Installazione di ganeti&lt;/p&gt;
&lt;p&gt;Dopo tutte le operazioni preliminari, possiamo passare all’installazione
del software:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;cd /usr/local/src
wget http://ganeti.googlecode.com/files/ganeti-2.4.5.tar.gz
tar zxf ganeti-2.4.5.tar.gz
cd ganeti-2.4.5
./configure --localstatedir&lt;span&gt;=&lt;/span&gt;/var --sysconfdir&lt;span&gt;=&lt;/span&gt;/etc
make &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; make install

&lt;span&gt;# assicuriamoci di creare tutte le directory necessarie
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;mkdir -p /etc/ganeti /srv/ganeti/os /srv/ganeti/export

&lt;span&gt;# copiamo tutti i file *accessori* nelle giuste directory
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;cp doc/examples/ganeti.default /etc/default/ganeti
cp doc/examples/ganeti.initd /etc/init.d/ganeti
cp doc/examples/ganeti-kvm-poweroff.initd /etc/init.d/ganeti-kvm-poweroff
cp doc/examples/ganeti.cron /etc/cron.d/ganeti
cp doc/examples/gnt-config-backup /etc/cron.daily/
cp doc/examples/bash_completion /etc/bash_completion.d/ganeti
chmod +x /etc/init.d/ganeti /etc/init.d/ganeti-kvm-poweroff /etc/cron.daily/gnt-config-backup

&lt;span&gt;# attiviamo gli script di init
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;update-rc.d ganeti defaults &lt;span&gt;20&lt;/span&gt; &lt;span&gt;80&lt;/span&gt;
update-rc.d ganeti-kvm-poweroff defaults &lt;span&gt;20&lt;/span&gt; &lt;span&gt;70&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Per fare il deployment delle vm, ganeti mette a disposizione un tool
esterno (ganeti-instance-debootstrap), basato su debootstrap, che
permette di installare vm con un sistema debian minimale, per poi
clonarlo per la varie vm.&lt;/p&gt;
&lt;p&gt;Noi invece utilizzeremo un tool diverso, &lt;a href=&quot;http://code.osuosl.org/projects/ganeti-image&quot; target=&quot;_blank&quot;&gt;ganeti-instance-image&lt;/a&gt;,
che ci permette di lavorare più facilmente con le vm, indipendentemente
dall’OS utilizzato.&lt;/p&gt;
&lt;p&gt;Questo tool utilizza il programma qemu-img per lavorare con le immagini
delle vm, visto che in Debian il pacchetto kvm installa il programma con
il nome kvm-img, è sufficiente creare un alias per risolvere il
problema:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;ln -s /usr/bin/kvm-img /usr/local/bin/qemu-img&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Installiamo ganeti-instance-image:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;cd /usr/local/src
wget http://code.osuosl.org/attachments/download/2163/ganeti-instance-image-0.5.1.tar.gz
tar zxf ganeti-instance-image-0.5.1.tar.gz
cd ganeti-instance-image-0.5.1/
./configure --prefix&lt;span&gt;=&lt;/span&gt;/usr --localstatedir&lt;span&gt;=&lt;/span&gt;/var &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;  --sysconfdir&lt;span&gt;=&lt;/span&gt;/etc &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;  --with-os-dir&lt;span&gt;=&lt;/span&gt;/srv/ganeti/os
make &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt; make install

&lt;span&gt;# copiamo il file della configurazione predefinita
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;cp defaults /etc/default/ganeti-instance-image

&lt;span&gt;# creiamo un link su /usr/share per evitare qualche
&lt;/span&gt;&lt;span&gt;# script con scolpito il path sbagliato
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;ln -s /srv/ganeti /usr/share/ganeti&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;configurazione&quot;&gt;Configurazione&lt;/h3&gt;
&lt;p&gt;Ganeti utilizza diversi comandi per gestire i vari aspetti
dell’architettura. I più importanti sono:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;gnt-cluster&lt;/strong&gt; - per gestire il cluster ganeti&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gnt-node&lt;/strong&gt; - per gestire i nodi&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gnt-instance&lt;/strong&gt; - per gestire le instanze delle vm&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gnt-backup&lt;/strong&gt; - per importare ed esportare la vm (dati e
configurazione)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gnt-os&lt;/strong&gt; - per gestire i tool esterni che si occupano del deploy dell
vm&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Iniziamo a configurare il cluster.&lt;/p&gt;
&lt;p&gt;Ganeti permette di avere un solo nodo con privilegi di cluster manager,
in grado di gestire tutti gli aspetti dell’architettura, ed N nodi come
suoi “backup”.&lt;/p&gt;
&lt;p&gt;Scegliamo il &lt;strong&gt;nodo1&lt;/strong&gt; come &lt;strong&gt;cluster master&lt;/strong&gt; ed inizializziamo il cluster:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;gnt-cluster init --vg-name ganeti --master-netdev eth0 --nic-parameters link&lt;span&gt;=&lt;/span&gt;vbr0 &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;  --enabled-hypervisors&lt;span&gt;=&lt;/span&gt;kvm --maintain-node-health yes &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;  --hypervisor-parameters kvm:vnc_bind_address&lt;span&gt;=&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;.0.0.0,kernel_path&lt;span&gt;=&lt;/span&gt;,initrd_path&lt;span&gt;=&lt;/span&gt; &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;  --backend-parameters vcpus&lt;span&gt;=&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;,memory&lt;span&gt;=&lt;/span&gt;512M &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;  cluster.ganeti.test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Analizziamo i vari parametri:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;vg-name ganeti&lt;/strong&gt; : impostiamo il VG da utilizzare, quello predefinito
è “xenvg”.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;master-netdev eth0&lt;/strong&gt; : l’interfaccia sulla quale attivare l’ip per
l’host cluster.ganeti.test (tramite alias). Ogni nodo impostato come
“slave” dovrà utilizzare l’interfaccia, con quel nome, in modo da
poterlo utilizzare in caso di failover del nodo master.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nic-parameters link=vbr0&lt;/strong&gt; : impostiamo il tipo (bridge, in modo
predefinito) ed il nome dell’interfaccia del nodo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;enabled-hypervisors kvm&lt;/strong&gt; : utilizziamo solamente kvm come hypervisor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;maintain-node-health yes&lt;/strong&gt; : abilitiamo la manutenzione automatica, ad
esempio alla disattivazione di un link drbd viene automaticamente
spenta l’istanza associata.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hypervisor-parameters …&lt;/strong&gt; : impostiamo i valori predefiniti
dell’hypervisor. Disabilitiamo il path del kernel e dell’initrd, in
modo da caricare il kernel dalla vm e non dall’hypervisor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;backend-parameters …&lt;/strong&gt; : impostiamo i valori predefiniti per le vm.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cluster.ganeti.test&lt;/strong&gt; : hostname riservato al nodo master del cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Adesso dovremmo avere i processi ganeti-noded, ganeti-masterd,
ganeti-confd e ganeti-rapi attivi.&lt;/p&gt;
&lt;p&gt;Aggiungiamo il &lt;strong&gt;nodo2&lt;/strong&gt; al cluster, specificando che potrà prendere il
posto del nodo master:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;gnt-node add --master-capable&lt;span&gt;=&lt;/span&gt;yes zeniba2.libreit.org&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Controlliamo che tutto sia andato liscio e che ganeti abbia configurato
correttamente il device eth0:0 sul &lt;strong&gt;nodo1&lt;/strong&gt; con:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;gnt-cluster verify
ifconfig eth0:0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;creazione-di-una-vm-come-template&quot;&gt;Creazione di una vm come template&lt;/h3&gt;
&lt;p&gt;Se non abbiamo in precedenza realizzato un template della vm, con
virtualbox, vagrant o qualsiasi altro sistema, possiamo farlo
direttamente da ganeti.&lt;/p&gt;
&lt;p&gt;Utilizziamo il tool ganeti-instance-image per creare la vm che useremo
come template. Modifichiamo il file
/etc/ganeti/instance-image/variants.list aggiungendo la voce “template”
e creiamo il file template.conf:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;file: /etc/ganeti/instance-image/variants/template.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;ARCH&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;x86_64&quot;&lt;/span&gt;
IMAGE_NAME&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;template&quot;&lt;/span&gt;
IMAGE_TYPE&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;qemu&quot;&lt;/span&gt;
IMAGE_DEBUG&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Copiamo i file appena modificati su tutti i nodi utilizzando il comando:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;gnt-cluster copyfile /etc/ganeti/instance-image/variants.list
gnt-cluster copyfile /etc/ganeti/instance-image/variants/template.conf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Assicuriamoci di aver aggiunto in modo corretto la nostra configurazione
dell’os:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;gnt-os list&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;installazione-del-template&quot;&gt;Installazione del template&lt;/h4&gt;
&lt;p&gt;Creiamo una nuova istanza, ed impostiamo il boot da cdrom passandogli
l’iso che vogliamo utilizzare:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;gnt-instance add -t plain -n nodo1.ganeti.test -o image+template --no-install &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;  --disk &lt;span&gt;0&lt;/span&gt;:size&lt;span&gt;=&lt;/span&gt;5G --net &lt;span&gt;0&lt;/span&gt;:ip&lt;span&gt;=&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;.0.0.250
  -H kvm:boot_order&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;cdrom&quot;&lt;/span&gt;,cdrom_image_path&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;/isos/debian-6.0.3-amd64-netinst.iso&quot;&lt;/span&gt; &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;  template.ganeti.test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I vari parametri sono abbastanza autoesplicativi, quelli più importanti
sono:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;-t&lt;/strong&gt; indica il tipo di backend utilizzato per il disco della vm, con
“plain” utilizziamo un volume LVM non replicato. Altre opzioni sono
“drbd” (LVM replicato), “file” e “diskless”.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-o&lt;/strong&gt; indica la il tool per il deploy della vm da utilizzare, con la
relativa configurazione separata da “+”.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-n&lt;/strong&gt; indica il nodo in cui verrà eseguita l’instanza e creato il disco
(se è una vm ridondata vanno inseriti 2 host, separati da “:“).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;–no-install&lt;/strong&gt; serve per non far partire il deploy automativo di
ganeti-instance-image. Anziché usare questo parametro avremmo potuto
aggiungere la direttiva CDINSTALL nel file template.conf.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avviamo la vm e vediamo le informazioni relative all’istanza:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;gnt-instance start template.ganeti.test
gnt-instance info template.ganeti.test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Colleghiamoci al guest tramite VNC alla porta riportata dal comando
gnt-instance info, alla voce “Allocated network port”:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;vncviewer cluster.ganeti.test:11001&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Installiamo regolarmente il guest, non impostando la partizione di swap.&lt;/p&gt;
&lt;p&gt;Una volta che il nostro template è pronto possiamo creare l’immgine:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;/srv/ganeti/os/image/tools/make-qemu-img template.ganeti.test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Utilizziamo il formato qcow2 e non dump, per il salvataggio
dell’immagine, perché è più semplice da trattare (è come se usassimo un
dispositivo raw) e non ci limita nel partizionamento della vm. Con
questo formato, però, il deploy delle vm diventa sensibilmente più lento
e soprattutto poco personalizzabile (ip, hostname, ecc). Se si vogliono
utilizzare altri formati (dump, tar) si consulti la &lt;a href=&quot;http://code.osuosl.org/projects/ganeti-image/wiki&quot; target=&quot;_blank&quot;&gt;documentazione&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Adesso che abbiamo l’immagine possiamo creare le nostre macchine
virtuali.&lt;/p&gt;
&lt;h4 id=&quot;deploy-delle-virtual-machine&quot;&gt;deploy delle virtual machine&lt;/h4&gt;
&lt;p&gt;Modifichiamo il file di configurazione predefinito di
ganeti-instance-image:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;file: /etc/default/ganeti-instance-image&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;ARCH&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;x86_64&quot;&lt;/span&gt;
IMAGE_NAME&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;template&quot;&lt;/span&gt;
IMAGE_TYPE&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;qemu&quot;&lt;/span&gt;
NOMOUNT&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;yes&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Proviamo a creare una vm:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;gnt-instance add -t drbd -n node1.ganeti.test:node2.ganeti.test -o image+default &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;  --disk &lt;span&gt;0&lt;/span&gt;:size&lt;span&gt;=&lt;/span&gt;5G --net &lt;span&gt;0&lt;/span&gt;:ip&lt;span&gt;=&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;.0.0.101 vm1.ganeti.test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Se tutto è andato bene adesso possiamo avviare dei test più approfonditi
includendo anche lo storage ridondato (drbd):&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# rimuoviamo la vm di prova
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;gnt-instance remove vm1.ganeti.test

&lt;span&gt;# avviamo il test utilizzando un tool incluso con ganeti
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;/usr/local/lib/ganeti/tools/burnin -v -o image+default -t drbd &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;  -n node1.ganeti.test:node2.ganeti.test  --disk-size&lt;span&gt;=&lt;/span&gt;5G &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;  vm&lt;span&gt;{&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;,2&lt;span&gt;}&lt;/span&gt;.ganeti.test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;importare-macchine-virtuali&quot;&gt;Importare macchine virtuali&lt;/h3&gt;
&lt;p&gt;Ganeti ci permette di importare facilmente vm provenienti da altri
ambienti. L’importante è che abbiamo i dischi salvati in un formato
supportato da qemu-img.&lt;/p&gt;
&lt;p&gt;Come esempio, importiamo una vm windows con 16 GB di disco, nella nostra
bella architettura con storage ridondato:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# creiamo la configurazione per la vm, senza far partire il deploy
&lt;/span&gt;&lt;span&gt;# ed utilizzando il nodo2 come primario
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;gnt-instance add -t drbd -n node2.ganeti.test:node1.ganeti.test -o image+default &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;  --no-install --no-start --disk &lt;span&gt;0&lt;/span&gt;:size&lt;span&gt;=&lt;/span&gt;16G --net &lt;span&gt;0&lt;/span&gt;:ip&lt;span&gt;=&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;.0.0.102 &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;  vm2.ganeti.test

&lt;span&gt;# recuperiamo l&apos;id del disco associato alla vm, nella voce &quot;Disks&quot; -&amp;gt; &quot;on primary&quot;
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;gnt-instance info vm2.ganeti.test

&lt;span&gt;# copiamo l&apos;immagine del disco nel dispositivo ridondato
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;kvm-img convert -f qcow2 -O host_device /tmp/winzoz-x86_64.img &lt;span&gt;\
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;  /dev/ganeti/9259bb19-f0ed-4c1a-9d0e-864477605e39.disk0

&lt;span&gt;# se nel sistema operativo non sono installati i driver virtio
&lt;/span&gt;&lt;span&gt;# sarà necessario riconfigurare l&apos;istanza per utilizzare i driver ide
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;gnt-instance modify -H disk_type&lt;span&gt;=&lt;/span&gt;ide -B memory&lt;span&gt;=&lt;/span&gt;&lt;span&gt;2048&lt;/span&gt; w.libreit.org

&lt;span&gt;# avviamo l&apos;istanza
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;gnt-instance start vm2.ganeti.test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;tuning&quot;&gt;Tuning&lt;/h3&gt;
&lt;p&gt;Per migliorare le prestazioni delle vm, è possibile istruire kvm ad
utilizzare la cpu dell’host così com’è, senza emularne caratteristiche
aggiuntive.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# informiamo APT che stiamo rinominando il binario di kvm
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;dpkg-divert --add --rename --divert /usr/bin/kvm.real /usr/bin/kvm

&lt;span&gt;# creiamo un wrapper
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;cat &lt;span&gt;&amp;lt;&amp;lt;EOF &amp;gt; /usr/bin/kvm
&lt;/span&gt;&lt;span&gt;#!/bin/sh
&lt;/span&gt;&lt;span&gt;/usr/bin/kvm.real -cpu host &quot;$@&quot;
&lt;/span&gt;&lt;span&gt;EOF&lt;/span&gt;

&lt;span&gt;# e lo rendiamo eseguibile
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;chmod +x /usr/bin/kvm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Un ulteriore miglioramento, di circa il 6%, si ottiene semplicemente
disabilitando la console VNC:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;gnt-instance modify -H vnc_bind_address&lt;span&gt;=&lt;/span&gt; vm&lt;span&gt;{&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;,2&lt;span&gt;}&lt;/span&gt;.ganeti.test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;altre-caratteristiche&quot;&gt;Altre caratteristiche&lt;/h3&gt;
&lt;p&gt;Ganeti offre molte altre caratteristiche non descritte in questo post,
le più importanti, a mio avviso, sono:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;gnt-backup&lt;/strong&gt; - permette di effettuare i backup dei dischi e della
configurazione associata ad una vm. Una limitazione di questo tool è
che mantiene solo 1 backup per vm.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://docs.ganeti.org/ganeti/2.4/html/hooks.html#ganeti-customisation-using-hooks&quot; target=&quot;_blank&quot;&gt;hooks&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;comodo sistema per eseguire tool esterni in base ai vari stati del&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;cluster, nodo, vm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;gnt-instance console&lt;/strong&gt; vm - abilitando nel guest una console fisica
(solitamente nel file /etc/inittab), è possibile utilizzarla al posto
della, spesso scomoda, console VNC.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;conclusione&quot;&gt;Conclusione&lt;/h3&gt;
&lt;p&gt;Ganeti rimane uno dei pochi gestori di macchine virtuali a non adottare
i paradigmi del cloud computing.&lt;/p&gt;
&lt;p&gt;Nei prossimi post cercheremo di trattare anche quelli.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://delicious.com/kalos.nerd/ganeti&quot; target=&quot;_blank&quot;&gt;Risorse utili&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>kvm</category><category>linux</category><category>virtualization</category><category>cluster</category><category>drbd</category></item><item><title>gestione delle credenziali</title><link>https://nerdrug.org/blog/gestione-delle-credenziali/</link><guid isPermaLink="true">https://nerdrug.org/blog/gestione-delle-credenziali/</guid><description>L’autenticazione è uno degli aspetti fondamentali dell’informatica: una guida ai sistemi per gestire le credenziali in modo sicuro.</description><pubDate>Sun, 09 Oct 2011 22:00:00 GMT</pubDate><content:encoded>&lt;figure class=&quot;center&quot;&gt;
&lt;img alt=&quot;Illustrazione della gestione delle credenziali&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://nerdrug.org/images/posts/gestione-delle-credenziali/cover.webp&quot; width=&quot;425&quot; height=&quot;282&quot;/&gt;
&lt;/figure&gt;
&lt;p&gt;L’autenticazione è da sempre, uno degli aspetti fondamentali
dell’informatica. Spesso però la gestione delle credenziali viene
trascurata, sia dai singoli utenti (&lt;em&gt;power-user&lt;/em&gt; inclusi) che da molte
realtà aziendali.&lt;/p&gt;
&lt;p&gt;In questo post esamineremo alcuni sistemi per gestire in modo sicuro, le
credenziali per accedere a risorse locali (pc, laptop, NAS, ecc),
risorse remote (siti web, email, ftp, ecc) e dati sensibili in generale.&lt;/p&gt;
&lt;h2 id=&quot;requisiti-e-caratteristiche&quot;&gt;Requisiti e caratteristiche&lt;/h2&gt;
&lt;p&gt;La maggior parte dei sistemi operativi includono dei sistemi di
autenticazione che si basano unicamente sul concetto di password o
&lt;a href=&quot;http://it.wikipedia.org/wiki/Passphrase&quot; target=&quot;_blank&quot;&gt;passphrase&lt;/a&gt;. Questo fattore
di autenticazione si è rivelato debole e relativamente e semplice da
aggirare.&lt;/p&gt;
&lt;p&gt;Per superare questa limitazione utilizzeremo la &lt;a href=&quot;http://it.wikipedia.org/wiki/Strong_authentication&quot; target=&quot;_blank&quot;&gt;Strong authentication&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;strong-authentication&quot;&gt;Strong authentication&lt;/h3&gt;
&lt;p&gt;È un metodo che combina più fattori di autenticazione:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Una cosa che conosco&lt;/strong&gt; - una password, un pin, una risponda ad una
domanda generica (2+2=?)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Una cosa che ho&lt;/strong&gt; - un token fisico, una carta di credito, un
cellulare&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Una cosa che sono&lt;/strong&gt; - l’impronta digitale, l’iride, DNA&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In questo modo incrementeremo, in maniera sensibile, la sicurezza
complessiva del sistema.&lt;/p&gt;
&lt;h3 id=&quot;caratteristiche&quot;&gt;Caratteristiche&lt;/h3&gt;
&lt;p&gt;I criteri adottati per la realizzazione del sistema, sono i seguenti:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;libertà&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;sia il software che l’hardware devono essere completamente
accessibili ed aderenti alla filosofia del free software.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
listend
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;flessibilità&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;per poter integrare facilmente al sistema, applicazioni, servizi,
dispositivi, ecc.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
listend
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;praticità&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;se un sistema di autenticazione risulta poco pratico, con molta
probabilità, non verrà mai utilizzato.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
listend
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;costo&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;forse per proteggere un semplice servizio web, non vale la pena
spendere troppi soldi.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;scelta-del-supporto&quot;&gt;Scelta del supporto&lt;/h2&gt;
&lt;p&gt;I dispositivi che ritengo più aderenti alle caratteristiche sopra
descritte, sono sostanzialmente due:&lt;/p&gt;
&lt;figure class=&quot;right&quot;&gt;
&lt;img alt=&quot;Dispositivo hardware YubiKey&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://nerdrug.org/images/posts/gestione-delle-credenziali/yubikey.webp&quot; width=&quot;256&quot; height=&quot;256&quot;/&gt;
&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.yubico.com/yubikey&quot; target=&quot;_blank&quot;&gt;YubiKey&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;diverse modalità di utilizzo

&lt;ul&gt;
&lt;li&gt;modalità YubiKey One-Time Password (OTP)&lt;/li&gt;
&lt;li&gt;modalità &lt;a href=&quot;http://www.yubico.com/oath-yubikey&quot; target=&quot;_blank&quot;&gt;OATH-HOTP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;modalità &lt;a href=&quot;http://www.yubico.com/static-password&quot; target=&quot;_blank&quot;&gt;static password&lt;/a&gt; (password classica + password &lt;em&gt;forte&lt;/em&gt; generata dalla yubikey)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;indipendente dalla piattaforma utilizzata&lt;/li&gt;
&lt;li&gt;facilmente integrabile con sistemi di crittografia dati (dm-crypt,
ecryptfs) e per l’autenticazione locale&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;right&quot;&gt;
&lt;img alt=&quot;GNU Privacy Foundation Crypto Stick&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://nerdrug.org/images/posts/gestione-delle-credenziali/crypto-stick.webp&quot; width=&quot;500&quot; height=&quot;203&quot;/&gt;
&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.crypto-stick.com&quot; target=&quot;_blank&quot;&gt;GPF Crypo Stick&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;utilizzo dello standard OpenPGP&lt;/li&gt;
&lt;li&gt;integra il chip della &lt;a href=&quot;http://www.g10code.com/p-card.html&quot; target=&quot;_blank&quot;&gt;OpenPGP card&lt;/a&gt; con un lettore USB&lt;/li&gt;
&lt;li&gt;supporta 3 chiavi RSA, indipendenti, a 2048 bit&lt;/li&gt;
&lt;li&gt;PIN di sicurezza con lunghezza da 6 a 32 caratteri&lt;/li&gt;
&lt;li&gt;supporta (con limitazioni) i certificati X.509&lt;/li&gt;
&lt;li&gt;elimina l’ingombro di doversi portare sempre dietro il lettore di smartcard e la carta stessa&lt;/li&gt;
&lt;li&gt;difficilmente integrabile per l’autenticazione locale&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dopo un’attenta analisi ho deciso di utilizzare la YubiKey, per via
della sua flessibilità e semplicità.&lt;/p&gt;
&lt;p&gt;Magari in un post successivo tratterò come utilizzare il dispositivo GPF
Crypo Stick, per gestire un portafoglio di chiavi GPG/PGP.&lt;/p&gt;
&lt;h2 id=&quot;casi-d-uso&quot;&gt;Casi d’uso&lt;/h2&gt;
&lt;figure class=&quot;center&quot;&gt;
&lt;img alt=&quot;Una YubiKey collegata a un portatile&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://nerdrug.org/images/posts/gestione-delle-credenziali/yubikey-hand.webp&quot; width=&quot;240&quot; height=&quot;174&quot;/&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;autenticazione-locale&quot;&gt;autenticazione locale&lt;/h3&gt;
&lt;p&gt;Per autenticarsi alla workstation (laptop, pc, tablet) si è optato per
la modalità &lt;em&gt;static password&lt;/em&gt; in modo da poter accedere anche senza
connettività e per poterla integrare facilmente con
&lt;a href=&quot;https://launchpad.net/ecryptfs&quot; target=&quot;_blank&quot;&gt;eCryptfs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ritengo l’uso della modalità &lt;em&gt;static password&lt;/em&gt; un buon compromesso tra
livello di sicurezza e praticità. A patto che venga aggiornata
mensilmente e affiancata da un buon sistema di backup (criptato) della
stessa.&lt;/p&gt;
&lt;h4 id=&quot;gestione-dei-dati-criptati&quot;&gt;gestione dei dati criptati&lt;/h4&gt;
&lt;div class=&quot;right&quot;&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&quot;Logo eCryptfs&quot; class=&quot;right&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://nerdrug.org/images/posts/gestione-delle-credenziali/ecryptfs.svg&quot; width=&quot;128&quot; height=&quot;128&quot;/&gt;
Si è scelto uno &lt;a href=&quot;http://ecryptfs.sourceforge.net/ecryptfs-faq.html#compare&quot; target=&quot;_blank&quot;&gt;stacked cryptographic filesystem&lt;/a&gt;, innanzitutto perché si vuole essere
indipendenti da partizioni criptate con dimensioni fisse, e poi perché
si vogliono utilizzare le stesse credenziali di accesso al sistema
(password classica + yubikey static password) per montare/decifrare in
modo automatico la directory con i dati da proteggere.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Per evitare rallentamenti sulle prestazioni del disco, si è optato per
la cifratura di una sotto-directory della home utente (~/Private).&lt;/p&gt;
&lt;p&gt;Questa soluzione rende più agevoli le operazioni di backup, in quanto i
file in forma cifrata restano disponibili nella directory (~/.Private).&lt;/p&gt;
&lt;h3 id=&quot;autenticazione-remota&quot;&gt;autenticazione remota&lt;/h3&gt;
&lt;p&gt;Modalità &lt;strong&gt;One-Time Password&lt;/strong&gt; tramite vari &lt;a href=&quot;http://www.yubico.com/web-api-clients&quot; target=&quot;_blank&quot;&gt;client&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;connessioni ssh tramite &lt;em&gt;Yubico PAM module&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;servizi internet tramite &lt;em&gt;mod_authn_yubikey&lt;/em&gt; e &lt;em&gt;ruby client&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;servizi web per la gestione di credenziali tipo &lt;a href=&quot;http://www.passpack.com/en/home/&quot; target=&quot;_blank&quot;&gt;passpack&lt;/a&gt; o &lt;a href=&quot;https://lastpass.com&quot; target=&quot;_blank&quot;&gt;lastpass&lt;/a&gt; (&lt;strong&gt;non-free!&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Modalità &lt;strong&gt;static password&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;chiavi ssh salvate sul file system criptato (per host in cui non è
installato il modulo PAM Yubico)&lt;/li&gt;
&lt;li&gt;in generale applicazioni che utilizzano file sul file system criptato
per autenticarsi (certificati SSL, chiavi GPG, ecc)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;configurazione&quot;&gt;Configurazione&lt;/h2&gt;
&lt;h3 id=&quot;modalità-otp--strong-authentication&quot;&gt;modalità OTP (&lt;em&gt;Strong authentication&lt;/em&gt;)&lt;/h3&gt;
&lt;h4 id=&quot;openssh&quot;&gt;openssh&lt;/h4&gt;
&lt;p&gt;Installiamo il modulo &lt;a href=&quot;https://github.com/Yubico/yubico-pam&quot; target=&quot;_blank&quot;&gt;yubico-pam&lt;/a&gt;, compilando i vari sorgenti o tramite il pacchetto debian:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;sudo echo &lt;span&gt;&quot;deb http://ppa.launchpad.net/fredrikt/yubico/ubuntu lucid main&quot;&lt;/span&gt; &amp;gt;&amp;gt; /etc/apt/sources.list.d/yubikey-pam.list
sudo aptitude update
sudo aptitude install libpam-yubikey&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Impostiamo il modulo pam come metodo di autenticazione predefinito. In
questo modo possiamo autenticarci utilizzando la password dell’utente e
l’OTP della yubikey.&lt;/p&gt;
&lt;p&gt;Modifico il file /etc/pam.d/common-auth:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# aggiungo prima di pam_unix la regola per pam_yubico auth requisite
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;pam_yubico.so id&lt;span&gt;=&lt;/span&gt;&lt;span&gt;16&lt;/span&gt; debug auth &lt;span&gt;[&lt;/span&gt;success&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt; default&lt;span&gt;=&lt;/span&gt;ignore&lt;span&gt;]&lt;/span&gt;
pam_unix.so nullok_secure try_first_pass&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Creiamo il file in cui saranno inserite le informazioni di debug&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;sudo touch /var/run/pam-debug.log
sudo chmod go+w /var/run/pam-debug.log&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Adesso è necessario creare un file che associa la chiave ad uno o più
utenti unix. Si può creare il file, sia per utente
~/.yubico/authorized_yubikeys, che globalmente aggiungendo il parametro
authfile=/etc/NOMEFILE alla direttiva di pam_yubico.so.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;auth requisite pam_yubico.so id&lt;span&gt;=&lt;/span&gt;&lt;span&gt;16&lt;/span&gt; authfile&lt;span&gt;=&lt;/span&gt;/etc/yubikey_mappings&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;(l’ID della yubikey e l’OTP, presenti in questo post, sono falsi)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;file: ~/.yubico/authorized_yubikeys&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# username:yubikey ID 1:yubikey ID 2:yubikey ID N:...
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;kalos:cchehkifidig&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Proviamo ad autenticarci con il nuovo sistema, inserendo la password
unix, subito seguita (senza spazi) dal codice OTP creato tenendo premuta
la yubikey per 1 secondo.&lt;/p&gt;
&lt;p&gt;Il file di debug dovrebbe mostrare delle righe simili:&lt;/p&gt;
&lt;p&gt;file: /var/run/pam-debug.log&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;[&lt;/span&gt;pam_yubico.c:parse_cfg&lt;span&gt;(&lt;/span&gt;&lt;span&gt;597&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt; called.
&lt;span&gt;[&lt;/span&gt;pam_yubico.c:parse_cfg&lt;span&gt;(&lt;/span&gt;&lt;span&gt;598&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt; flags &lt;span&gt;1&lt;/span&gt; argc &lt;span&gt;2&lt;/span&gt;
&lt;span&gt;[&lt;/span&gt;pam_yubico.c:parse_cfg&lt;span&gt;(&lt;/span&gt;&lt;span&gt;600&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt; argv&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]=&lt;/span&gt;id&lt;span&gt;=&lt;/span&gt;&lt;span&gt;16&lt;/span&gt;
&lt;span&gt;[&lt;/span&gt;pam_yubico.c:parse_cfg&lt;span&gt;(&lt;/span&gt;&lt;span&gt;600&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt; argv&lt;span&gt;[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]=&lt;/span&gt;debug
...
&lt;span&gt;[&lt;/span&gt;pam_yubico.c:pam_sm_authenticate&lt;span&gt;(&lt;/span&gt;&lt;span&gt;650&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt; get user returned: kalos
&lt;span&gt;[&lt;/span&gt;pam_yubico.c:pam_sm_authenticate&lt;span&gt;(&lt;/span&gt;&lt;span&gt;754&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt; conv returned &lt;span&gt;62&lt;/span&gt; bytes
&lt;span&gt;[&lt;/span&gt;pam_yubico.c:pam_sm_authenticate&lt;span&gt;(&lt;/span&gt;&lt;span&gt;772&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt; Skipping first &lt;span&gt;18&lt;/span&gt; bytes. Length is &lt;span&gt;62&lt;/span&gt;, token_id set to &lt;span&gt;12&lt;/span&gt; and token OTP always &lt;span&gt;32&lt;/span&gt;.
&lt;span&gt;[&lt;/span&gt;pam_yubico.c:pam_sm_authenticate&lt;span&gt;(&lt;/span&gt;&lt;span&gt;779&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt; OTP: cchehkifidighrhhehkifidighrhrhvifidighrhrhdd ID: cchehkifidig
&lt;span&gt;[&lt;/span&gt;pam_yubico.c:pam_sm_authenticate&lt;span&gt;(&lt;/span&gt;&lt;span&gt;789&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt; Extracted a probable system password entered before the OTP - setting item PAM_AUTHTOK
&lt;span&gt;[&lt;/span&gt;pam_yubico.c:pam_sm_authenticate&lt;span&gt;(&lt;/span&gt;&lt;span&gt;805&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt; ykclient &lt;span&gt;return&lt;/span&gt; value &lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;: Success
&lt;span&gt;[&lt;/span&gt;pam_yubico.c:check_user_token&lt;span&gt;(&lt;/span&gt;&lt;span&gt;141&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt; Authorization line: kalos:cchehkifidig
&lt;span&gt;[&lt;/span&gt;pam_yubico.c:check_user_token&lt;span&gt;(&lt;/span&gt;&lt;span&gt;145&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt; Matched user: kalos
&lt;span&gt;[&lt;/span&gt;pam_yubico.c:check_user_token&lt;span&gt;(&lt;/span&gt;&lt;span&gt;149&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt; Authorization token: cchehkifidig
&lt;span&gt;[&lt;/span&gt;pam_yubico.c:check_user_token&lt;span&gt;(&lt;/span&gt;&lt;span&gt;152&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt; Match user/token as kalos/cchehkifidig&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Se tutto è andato bene rimuoviamo il file di debug ed eliminiamo la
direttiva debug nel file /etc/pam.d/common-auth.&lt;/p&gt;
&lt;h4 id=&quot;lastpass--non-free&quot;&gt;lastpass (&lt;strong&gt;non-free!&lt;/strong&gt;)&lt;/h4&gt;
&lt;p&gt;Lastpass offre un sistema per gestire le password dei siti web, che
integra l’utilizzo della yubikey. Un &lt;a href=&quot;https://lastpass.com/support_screencasts.php?feature=yubikey1&quot; target=&quot;_blank&quot;&gt;video&lt;/a&gt; ci mostra un esempio di utilizzo.&lt;/p&gt;
&lt;h3 id=&quot;modalità-static-password&quot;&gt;modalità static password&lt;/h3&gt;
&lt;h4 id=&quot;configurazione-della-yubikey&quot;&gt;configurazione della yubikey&lt;/h4&gt;
&lt;p&gt;La moderne yubikey, supportano due diverse configurazioni, utilizzabili
nello stesso dispositivo.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La prima viene richiamata tenendo premuta la chiave per un lasso di tempo di &lt;strong&gt;0.3 - 1.5&lt;/strong&gt; secondi.&lt;/li&gt;
&lt;li&gt;La seconda viene richiamata tenendo premuta la chiave per un lasso di tempo di &lt;strong&gt;2.5 - 5&lt;/strong&gt; secondi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Normalmente la chiave viene fornita con una sola configurazione attiva,
impostata per l’utilizzo dell’OTP. Per utilizzare la seconda
configurazione è necessario installare il programma &lt;a href=&quot;https://github.com/Yubico/yubikey-personalization/wiki/Read-Me&quot; target=&quot;_blank&quot;&gt;yubikey-personalization&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;sudo aptitude install yubikey-personalization&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Inseriamo la yubikey e impostiamo la seconda configurazione per
l’utilizzo della modalità static password, con il seguente comando:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;sudo ykpersonalize -2 -ofixed&lt;span&gt;=&lt;/span&gt;ichkicichv -o-man-update&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Vediamo brevemente i vari parametri:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;-2&lt;/strong&gt; serve a selezionare la seconda configurazione.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-ofixed&lt;/strong&gt; serve a dare un prefisso, di massimo 16 caratteri, che
identifica la chiave statica. È possibile utilizzare il convertitore
&lt;a href=&quot;http://radius.yubico.com/demo/Modhex_Calculator.php&quot; target=&quot;_blank&quot;&gt;modhex&lt;/a&gt; per
convertire una stringa al formato modhex, ad esempio la stringa
“pippo” in formato modhex diventa “ichkicichv”.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-o-man-update&lt;/strong&gt; disabilita la funzione che permette di generare una
nuova password statica casuale, tenendo premuta la yubikey per un
lasso di tempo di &lt;strong&gt;8 - 15&lt;/strong&gt; secondi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L’output del comando sarà simile a:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;Firmware version &lt;span&gt;2&lt;/span&gt;.2.4 Touch level &lt;span&gt;1283&lt;/span&gt; Program sequence &lt;span&gt;4&lt;/span&gt;

Passphrase to create AES key:
Configuration data to be written to key configuration &lt;span&gt;2&lt;/span&gt;:

fixed: m:ichkicichv
uid: h:000000000000
key: h:45c5846e7166928f1b00d131e868d90f
acc_code: h:000000000000
ticket_flags: APPEND_CR
config_flags: STATIC_TICKET|STRONG_PW1|STRONG_PW2
extended_flags:

Commit? &lt;span&gt;(&lt;/span&gt;y/n&lt;span&gt;)&lt;/span&gt; &lt;span&gt;[&lt;/span&gt;n&lt;span&gt;]&lt;/span&gt;: y&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Se non si inserisce la passphrase per creare la chiave AES, questa viene
generata casualmente.&lt;/p&gt;
&lt;p&gt;È, inoltre, possibile proteggere la scrittura della configurazione con
una sorta di password, chiamata access code. Per ulteriori informazioni
si può consultare la manpage del programma o il &lt;a href=&quot;http://static.yubico.com/var/uploads/YubiKey_manual-2.0.pdf&quot; target=&quot;_blank&quot;&gt;manuale tecnico&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&quot;cambiare-la-password-utente&quot;&gt;cambiare la password utente&lt;/h4&gt;
&lt;p&gt;Una volta creata la chiave statica, è necessario cambiare la password
utente, con un semplice:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;passwd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Inseriamo un password relativamente semplice, e poi teniamo premuta la
yubikey per 3 secondi.&lt;/p&gt;
&lt;h4 id=&quot;configurazione-ecryptfs&quot;&gt;configurazione ecryptfs&lt;/h4&gt;
&lt;p&gt;Assicuriamoci di caricare il modulo ecryptfs e installiamo il programma
in user-space:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;sudo modprobe ecryptfs
sudo aptitude install ecryptfs-utils&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La configurazione è piuttosto semplice:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;ecryptfs-setup-private&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Basta inserire la nuova password utente e verranno create le directory
~/.Private ~/Private ed ~/.ecryptfs. La mount passphrase la lasciamo
generare automaticamente.&lt;/p&gt;
&lt;p&gt;Ecco l’output:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;Enter your login passphrase:
Enter your mount passphrase &lt;span&gt;[&lt;/span&gt;leave blank to generate one&lt;span&gt;]&lt;/span&gt;:

************************************************************************
YOU SHOULD RECORD YOUR MOUNT PASSPHRASE AND STORE IT IN A SAFE LOCATION.
ecryptfs-unwrap-passphrase ~/.ecryptfs/wrapped-passphrase THIS WILL BE
REQUIRED IF YOU NEED TO RECOVER YOUR DATA AT A LATER TIME.
************************************************************************

Done configuring.

Testing mount/write/umount/read...
Inserted auth tok with sig &lt;span&gt;[&lt;/span&gt;a3aba160257a7eaa&lt;span&gt;]&lt;/span&gt; into the user session keyring
Inserted auth tok with sig &lt;span&gt;[&lt;/span&gt;059348b89995a646&lt;span&gt;]&lt;/span&gt; into the user session keyring
Inserted auth tok with sig &lt;span&gt;[&lt;/span&gt;a3aba160257a7eaa&lt;span&gt;]&lt;/span&gt; into the user session keyring
Inserted auth tok with sig &lt;span&gt;[&lt;/span&gt;059348b89995a646&lt;span&gt;]&lt;/span&gt; into the user session keyring
Testing succeeded.

Logout, and log back in to begin using your encrypted directory.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La configurazione predefinita di ecryptfs cifra la directory ~/.Private
utilizzando la password utente per decriptare la mount passphrase.
Inoltre è abilitato, in maniera predefinita, il montaggio automatico di
~/Private e la cifratura dei nomi dei file.&lt;/p&gt;
&lt;p&gt;Adesso basta ri-autenticarsi, chiudendo prima tutte le sessioni aperte
con il nostro utente. Ora si può cominciare ad inserire i file sensibili
nella directory ~/Private. Questi file verranno criptati in maniera
trasparente nella directory ~/.Private.&lt;/p&gt;
&lt;h4 id=&quot;aggiornare-la-password&quot;&gt;aggiornare la password&lt;/h4&gt;
&lt;p&gt;Le password vanno aggiornate con una certa frequenza, e quella statica
della yubikey non fa eccezione.&lt;/p&gt;
&lt;p&gt;Per prima cosa salviamo la password attuale e la mount passphrase,
decriptata, in variabili temporanee:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;read -s old_pass &lt;span&gt;# inseriamo la password vecchia password (inclusa la password della yubikey)
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;mount_pass&lt;span&gt;=&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;echo $old_pass | ecryptfs-unwrap-passphrase ~/.ecryptfs/wrapped-passphrase -&lt;span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Generiamo una nuova password statica per la yubikey, magari con un nuovo
prefix (pluto) :&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;sudo ykpersonalize -2 -ofixed&lt;span&gt;=&lt;/span&gt;ichrigifhv -o-man-update&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cambiamo la password utente, utilizzando una classica password (anche
quella vecchia) insieme alla nuova password generata dalla yubikey:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# utilizzo sudo per evitare di dover inserire la vecchia password
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;sudo passwd $USER&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cifriamo la mount passphrase con la nuova password utente:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;read new_pass &lt;span&gt;# inseriamo la nuova password
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;echo &lt;span&gt;&quot;&lt;/span&gt;$mount_passn$new_pass&lt;span&gt;&quot;&lt;/span&gt; | ecryptfs-wrap-passphrase ~/.ecryptfs/wrapped-passphrase&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Eliminiamo le variabili:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;unset old_pass mount_pass new_pass&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;backup&quot;&gt;Backup&lt;/h2&gt;
&lt;figure class=&quot;center&quot;&gt;
&lt;img alt=&quot;Illustrazione di una procedura di backup&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://nerdrug.org/images/posts/gestione-delle-credenziali/backup.webp&quot; width=&quot;398&quot; height=&quot;300&quot;/&gt;
&lt;/figure&gt;
&lt;p&gt;Se non si vuole correre il rischio di perdere le credenziali per i
propri sistemi (locali e remoti) ed l’accesso ai dati sensibili, è
fondamentale stabilire una buona politica di backup.&lt;/p&gt;
&lt;h3 id=&quot;credenziali-remote&quot;&gt;credenziali remote&lt;/h3&gt;
&lt;p&gt;La soluzione migliore è quella di possedere 2 yubikey, una per tutti i
giorni ed una da conservare in un posto sicuro. Ovviamente bisogna
abilitare la seconda chiave per vari servizi web di gestione password,
ssh, web (mod_authn_yubikey), ecc&lt;/p&gt;
&lt;p&gt;Un’altra soluzione, soprattutto per le credenziali ssh, è quella di
aggiungere all’host, un utente con accesso limitato e con una password
forte, che possa solamente decriptare un file, con un’altra password
forte, che contiene la password per poter accedere allo stesso sistema
come un utente privilegiato.&lt;/p&gt;
&lt;p&gt;Una sorta di backdoor con due livelli di protezione… l’ultima cosa che
vogliamo è perdere il controllo dei nostri sistemi, non è vero? ;)&lt;/p&gt;
&lt;h3 id=&quot;credenziali-locali&quot;&gt;credenziali locali&lt;/h3&gt;
&lt;p&gt;Per salvaguardare le password classiche e quelle generate dalla yubikey,
uno dei metodi più semplici è quello di farsi mandare via email un file
criptato con tutte le credenziali.&lt;/p&gt;
&lt;p&gt;Ecco un esempio di script da eseguire ad ogni aggiornamento della
password:&lt;/p&gt;

&lt;p&gt;Le possibili soluzioni sono infinite, si può criptare il file con le
credenziali utilizzando l’OTP della yubikey di scorta, criptarlo con la
propria chiave GPG, steganografarla, ecc…&lt;/p&gt;
&lt;p&gt;Insomma basta solo un po’ di fantasia.&lt;/p&gt;</content:encoded><category>auth</category><category>linux</category><category>crypt</category><category>ecryptfs</category><category>privacy</category><category>yubikey</category><category>workstation</category></item><item><title>zsh the powerful shell</title><link>https://nerdrug.org/blog/zsh-the-powerful-shell/</link><guid isPermaLink="true">https://nerdrug.org/blog/zsh-the-powerful-shell/</guid><description>La shell è l’interfaccia per eccellenza degli smanettoni.</description><pubDate>Sat, 01 Oct 2011 22:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;center&quot; link=&quot;http://www.zsh.org&quot;&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&quot;Il mago di Zsh&quot; class=&quot;center&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://nerdrug.org/images/posts/zsh-the-powerful-shell/wizard.webp&quot; width=&quot;64&quot; height=&quot;54&quot;/&gt;
La shell è l’interfaccia per eccellenza degli smanettoni.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Quando si comincia a farne un utilizzo costante, si sente il bisogno di
spingersi oltre, scoprendo/creando delle funzionalità che ci
semplificano ulteriormente la vita.&lt;/p&gt;
&lt;p&gt;Almeno questa è stata la mia reazione… un bel po’ di tempo fa.&lt;/p&gt;
&lt;p&gt;Dopo aver provato a personalizzare la bash, mi resi conto che le
mancavano molte funzionalità presenti in altre shell. Decisi di cambiare
proprio tipo di shell ed iniziai ad utilizzare la
&lt;a href=&quot;http://en.wikipedia.org/wiki/Tcsh&quot; target=&quot;_blank&quot;&gt;tcsh&lt;/a&gt;, una versione migliorata di
&lt;a href=&quot;http://en.wikipedia.org/wiki/C_shell&quot; target=&quot;_blank&quot;&gt;csh&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ero abbastanza soddisfatto della mia configurazione, quando un amico mi
parlò di zsh.&lt;/p&gt;
&lt;h2 id=&quot;funzionalità&quot;&gt;funzionalità&lt;/h2&gt;
&lt;p&gt;Questa potente shell, come moltissimi progetti informatici (vedi
&lt;a href=&quot;http://ruby-lang.org&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;ruby&lt;/em&gt;&lt;/a&gt;), prende il meglio delle
caratteristiche da altri progetti simili e aggiunge, tramite un ottimo
collante, altre funzionalità originali.&lt;/p&gt;
&lt;p&gt;Si può considerare questa shell come una sorta di &lt;strong&gt;superset&lt;/strong&gt; di sh, ash,
bash, csh, ksh, e tcsh.&lt;/p&gt;
&lt;p&gt;Qualche anno fa avevo pure fatto un piccolo screencast che illustrava
alcune caratteristiche di zsh…&lt;/p&gt;
&lt;div style=&quot;position: relative; padding-bottom: 56.25%; padding-top: 30px; height: 0; overflow: hidden;&quot;&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; src=&quot;https://www.youtube.com/embed/HGBgMX5HW_g?&quot; style=&quot;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&quot; title=&quot;YouTube Video&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Andiamo a vedere nel dettaglio alcune delle funzionalità più importanti.&lt;/p&gt;
&lt;h3 id=&quot;command-line-completition&quot;&gt;Command line completition&lt;/h3&gt;
&lt;p&gt;In zsh il completamento non si limita ai nomi dei programmi, ma include
anche i vari argomenti ed i parametri degli stessi.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt=&quot;Completamento dei pacchetti di aptitude in Zsh&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://nerdrug.org/images/posts/zsh-the-powerful-shell/cover.webp&quot; width=&quot;615&quot; height=&quot;171&quot;/&gt;
&lt;/figure&gt;
&lt;p&gt;Costruendoli anche dinamicamente.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt=&quot;Completamento dinamico dei target Make in Zsh&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://nerdrug.org/images/posts/zsh-the-powerful-shell/make-completion.webp&quot; width=&quot;615&quot; height=&quot;171&quot;/&gt;
&lt;/figure&gt;
&lt;p&gt;Il tutto completamente personalizzabile.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt=&quot;Selezione interattiva dei processi con il completamento di Zsh&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://nerdrug.org/images/posts/zsh-the-powerful-shell/process-completion.webp&quot; width=&quot;615&quot; height=&quot;171&quot;/&gt;
&lt;/figure&gt;
&lt;p&gt;Tra le altre cose, questa funzionalità integra un sistema di caching,
per i completamenti più dispendiosi (es: il completamento di tutti i
nomi dei programmi disponibili nei repository debian)&lt;/p&gt;
&lt;p&gt;Un’altra interessante caratteristica del sistema di completamento è il
correttore ortografico.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt=&quot;Correzione ortografica di un comando in Zsh&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;https://nerdrug.org/images/posts/zsh-the-powerful-shell/spelling-correction.webp&quot; width=&quot;615&quot; height=&quot;67&quot;/&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;file-globbing&quot;&gt;File globbing&lt;/h3&gt;
&lt;p&gt;Il potentissimo file globbing di zsh permette di specificare una
determinata categoria di file, facendo a meno di utilizzare programmi
esterni come find/args.&lt;/p&gt;
&lt;p&gt;Vediamolo in azione:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# tutti i file nella directory /tmp e nelle relative sottodirectory, di proprietà dell&apos;utente kalos
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;ls -l /tmp/**/*&lt;span&gt;(&lt;/span&gt;u:kalos:&lt;span&gt;)&lt;/span&gt;

&lt;span&gt;# tutti i file regolari (non symlink, dir, ecc)
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;ls -l /boot/*&lt;span&gt;(&lt;/span&gt;.&lt;span&gt;)&lt;/span&gt;

&lt;span&gt;# tutti i file regolari ed eseguibili
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;ls -l /bin/*&lt;span&gt;(&lt;/span&gt;.x&lt;span&gt;)&lt;/span&gt;

&lt;span&gt;# tutti i file che non hanno abilitata la scrittura per il gruppo di appartenenza
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;ls -l /tmp/**/*&lt;span&gt;(&lt;/span&gt;.:g-w:&lt;span&gt;)&lt;/span&gt;

&lt;span&gt;# tutti i file piu&apos; vecchi di 20 minuti
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;ls -l /tmp/.&lt;span&gt;(&lt;/span&gt;mm+20&lt;span&gt;)&lt;/span&gt;

&lt;span&gt;# tutti i file vuoti
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;ls -l /tmp/*&lt;span&gt;(&lt;/span&gt;.L0&lt;span&gt;)&lt;/span&gt;

&lt;span&gt;# tutti i file (comprese le directory) senza estenzione
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;ls -ld ^?/./&lt;span&gt;(&lt;/span&gt;D&lt;span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;gestione-avanzata-di-variabili-e-array&quot;&gt;Gestione avanzata di &lt;a href=&quot;http://zsh.sourceforge.net/Doc/Release/Variables-Index.html&quot; target=&quot;_blank&quot;&gt;variabili&lt;/a&gt; e array&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Sostituzione delle variabili&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;FILE&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;/home/kalos/doc/ruby/rspec.pdf&quot;&lt;/span&gt;

&lt;span&gt;# stampa il contenuto della variabile $FILE sostituendo le occorrenze di &quot;kalos&quot; con &quot;marco&quot;
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;echo &lt;span&gt;${&lt;/span&gt;FILE//kalos/marco&lt;span&gt;}&lt;/span&gt; » /home/marco/doc/ruby/rspec.pdf

&lt;span&gt;# stampa solo il nome del file (come il programma &quot;basename&quot;)
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;echo &lt;span&gt;${&lt;/span&gt;FILE##*/&lt;span&gt;}&lt;/span&gt; » rspec.pdf

&lt;span&gt;# stampa solo il percorso del file (come &quot;dirname&quot;)
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;echo &lt;span&gt;${&lt;/span&gt;FILE%//./&lt;span&gt;}&lt;/span&gt; » /home/kalos/doc/ruby

&lt;span&gt;# elimina l&apos;estensione nella stringa salvata nella variabile
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;FILE&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;rspec.pdf&quot;&lt;/span&gt; echo $FILE:r » rspec

&lt;span&gt;# per ulteriori informazioni
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;man &lt;span&gt;1&lt;/span&gt; zshexpn&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Array ed array associativi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Questa funzionalità è molto utile se si stanno creando degli script non proprio banali.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;array&lt;span&gt;=(&lt;/span&gt;foo bar lillo boom&lt;span&gt;)&lt;/span&gt;

&lt;span&gt;# stampa l&apos;ultimo elemento
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;echo $array&lt;span&gt;[&lt;/span&gt;-1&lt;span&gt;]&lt;/span&gt;
» boom

&lt;span&gt;# stampa dal secondo al penultimo elemento
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;echo $array&lt;span&gt;[&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;,-2&lt;span&gt;]&lt;/span&gt;
» bar lillo

&lt;span&gt;# dichiarazione di un array associativo
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;typeset -A array_ass

&lt;span&gt;# inizializzazione dell&apos;array
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;array_ass&lt;span&gt;=(&lt;/span&gt;uno &lt;span&gt;1&lt;/span&gt; due &lt;span&gt;2&lt;/span&gt; tre &lt;span&gt;3&lt;/span&gt; quattro &lt;span&gt;4&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;

&lt;span&gt;# stampa solo le chiavi
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;print &lt;span&gt;${&lt;/span&gt;(k)array_ass&lt;span&gt;}&lt;/span&gt;
» uno due tre quattro

&lt;span&gt;# stampa i valori
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;print &lt;span&gt;${&lt;/span&gt;(v)array_ass&lt;span&gt;}&lt;/span&gt;
» &lt;span&gt;1&lt;/span&gt; &lt;span&gt;2&lt;/span&gt; &lt;span&gt;3&lt;/span&gt; &lt;span&gt;4&lt;/span&gt;

&lt;span&gt;# ordina le chiavi in base ai nomi
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;print &lt;span&gt;${&lt;/span&gt;(ok)array_ass&lt;span&gt;}&lt;/span&gt;
» due quattro tre uno

&lt;span&gt;# modifica il valore di un array associativo
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;array_ass&lt;span&gt;[&lt;/span&gt;tre&lt;span&gt;]=&lt;/span&gt;&lt;span&gt;&apos;03&apos;&lt;/span&gt;

&lt;span&gt;# stampa l&apos;array ordinato
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;print &lt;span&gt;${&lt;/span&gt;(o)array_ass&lt;span&gt;}&lt;/span&gt;
» &lt;span&gt;03&lt;/span&gt; &lt;span&gt;1&lt;/span&gt; &lt;span&gt;2&lt;/span&gt; &lt;span&gt;4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;alias&quot;&gt;Alias&lt;/h3&gt;
&lt;p&gt;Zsh amplia il concetto di aliasing introducendo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;alias globale&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;È un tipo di alias che può essere utilizzare in qualsiasi parte della
riga di comando e non solo all’inizio.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span&gt;# definizione degli alias
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;alias -g Il&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;| less&quot;&lt;/span&gt;
alias -g N&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&amp;amp;&amp;gt;/dev/null&quot;&lt;/span&gt;

&lt;span&gt;# manda in pipe il file letto con cat a less
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;cat /var/log/messages Il

&lt;span&gt;# redirige lo standard output e lo standard error nel nulla
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;rm -rf /tmp N&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;alias dei suffissi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Se si esegue un file con un certo suffisso, viene automaticamente eseguito il programma associato&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;alias -s txt&lt;span&gt;=&lt;/span&gt;$EDITOR
alias -s &lt;span&gt;{&lt;/span&gt;mpg,mpeg,avi,ogm,wmv,m4v,mp4,mov,mkv&lt;span&gt;}=&lt;/span&gt;&lt;span&gt;&quot;mplayer&quot;&lt;/span&gt;

&lt;span&gt;# come un nerd guarda un film ;)
&lt;/span&gt;&lt;span&gt;&lt;/span&gt;~FILM/totoro.avi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;modalità-compatibilità&quot;&gt;Modalità compatibilità&lt;/h3&gt;
&lt;p&gt;Zsh ha la possibilità di emulare il comportamento delle shell csh, sh e
ksh (la sua parente più vicina).&lt;/p&gt;
&lt;p&gt;Questo ci permette, ad esempio, di utilizzare la nostra shell come shell
predefinita di sistema per tutti gli script di init, ecc.&lt;/p&gt;
&lt;p&gt;Le modalità di compatibilità possono essere eseguite in due modi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;creando un link della shell da emulare che punta al binario di zsh
(ln -s /bin/zsh /bin/csh). In questo caso si ottiene un’emulazione
completa della shell.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;abilitando selettivamente tutte le funzionalità da emulare, ad
esempio con “setopt KSH_GLOB”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;history-condiviso-da-più-sessioni-contemporaneamente&quot;&gt;History condiviso da più sessioni contemporaneamente&lt;/h3&gt;
&lt;p&gt;Questa funzionalità può tornare utile, ad esempio, quando più persone
stanno lavorando sullo stesso sistema e vogliono condividere i comandi
lanciati&lt;/p&gt;
&lt;h2 id=&quot;configurazione&quot;&gt;configurazione&lt;/h2&gt;
&lt;p&gt;La configurazione di zsh non è tra le più semplici.&lt;/p&gt;
&lt;p&gt;Per facilitare le cose, è stato realizzato un bel progetto
collaborativo.&lt;/p&gt;
&lt;h3 id=&quot;oh-my-zsh&quot;&gt;&lt;a href=&quot;https://github.com/robbyrussell/oh-my-zsh&quot; target=&quot;_blank&quot;&gt;oh-my-zsh&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;E’ un piccolo &lt;em&gt;framework&lt;/em&gt; che fornisce una configurazione abbastanza
completa ed un sistema di plugin aggiuntivi.&lt;/p&gt;
&lt;h4 id=&quot;installazione&quot;&gt;installazione&lt;/h4&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;wget --no-check-certificate https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;utilizzo&quot;&gt;utilizzo&lt;/h4&gt;
&lt;p&gt;Per utilizzarlo basta modificare il file ~/.zshrc per abilitare qualche
plugin e configurare il tema del prompt preferito.&lt;/p&gt;
&lt;h4 id=&quot;aggiornamento&quot;&gt;aggiornamento&lt;/h4&gt;
&lt;p&gt;Una delle funzionalità più importanti di questo framework è il costante
aggiornamento effettuato dalla vasta comunità che ci lavora.&lt;/p&gt;
&lt;p&gt;Di default il programma chiede di auto-aggiornarsi ogni settimana,
attraverso il file oh-my-zsh/tools/upgrade.sh, che non fa altro che
eseguire il comando “git pull origin master”.&lt;/p&gt;
&lt;h3 id=&quot;come-gestire-un-proprio-fork-di-omz&quot;&gt;come gestire un proprio fork di OMZ&lt;/h3&gt;
&lt;p&gt;Se si vuole gestire la propria configurazione di zsh attraverso OMZ,
questi sono i semplici passi da compiere:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fare il fork del progetto su github&lt;/li&gt;
&lt;li&gt;aggiungere al repository git l’url del repository ufficiale di OMZ&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;git remote add upstream git://github.com/robbyrussell/oh-my-zsh.git&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;modificare il file &lt;em&gt;tools/install.sh&lt;/em&gt; sostituendo &lt;code&gt;git pull origin master&lt;/code&gt; con &lt;code&gt;git fetch upstream &amp;amp;&amp;amp; git merge upstream/master&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;risorse-utili&quot;&gt;risorse utili&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://zshwiki.org/home/&quot; target=&quot;_blank&quot;&gt;zshwiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://grml.org/zsh/#zshlovers&quot; target=&quot;_blank&quot;&gt;zsh-lovers da grml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/robbyrussell/oh-my-zsh&quot; target=&quot;_blank&quot;&gt;oh-my-zsh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://strcat.de/dotfiles/&quot; target=&quot;_blank&quot;&gt;zsh dotfiles di strcat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Altri rifetimenti in merito li potete trovare nei miei bookmark salvati su &lt;a href=&quot;https://del.icio.us/kalos.nerd/zsh&quot; target=&quot;_blank&quot;&gt;delicious&lt;/a&gt;&lt;/p&gt;</content:encoded><category>linux</category><category>zsh</category><category>shell</category><category>workstation</category></item><item><title>initial commit</title><link>https://nerdrug.org/blog/initial-commit/</link><guid isPermaLink="true">https://nerdrug.org/blog/initial-commit/</guid><description>Dopo diverso tempo ho deciso di utilizzare un blog per condividere le mia passione (spasmodica) per l’informatica.</description><pubDate>Thu, 29 Sep 2011 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Dopo diverso tempo ho deciso di utilizzare un blog per condividere le mia
passione (spasmodica) per l’informatica.&lt;/p&gt;
&lt;p&gt;In particolare tutte le cose che possono interessare un utilizzatore di sistemi
unix-like dal lontano 1999: amministrazione di sistemi, programmazione,
configurazione avanzata di workstation, ecc.&lt;/p&gt;
&lt;p&gt;Spero possa essere utile a qualcuno.&lt;/p&gt;</content:encoded></item></channel></rss>