<?xml version="1.0" encoding="iso-8859-15"?>
<!--
     The FreeBSD Documentation Project
     $FreeBSD$
     Original revision: 1.18
-->

<chapter id="GEOM">
  <chapterinfo>
    <authorgroup>
      <author>
	<firstname>Tom</firstname>

	<surname>Rhodes</surname>

	<contrib>Scritto da </contrib>
      </author>
    </authorgroup>
  </chapterinfo>

  <title>GEOM: Framework modulare per la trasformazione del disco</title>

  <sect1 id="GEOM-synopsis">
    <title>Sinossi</title>

    <indexterm>
      <primary>GEOM</primary>
    </indexterm>
    <indexterm>
      <primary>GEOM Disk Framework</primary>
      <see>GEOM</see>
    </indexterm>

    <para>Questo articolo tratta l'utilizzo dei dischi attraverso la struttura
      GEOM implementata in &os;.  Questo include le più importanti
      utility di controllo <acronym
        role="Redundant Array of Inexpensive Disks">RAID</acronym>
      che utilizzano la suddetta struttura per la loro configurazione.
      Questo capitolo non si soffermerà in discussioni approfondite
      su come la struttura GEOM utilizza o controlla gli I/O, il suo
      sottosistema di funzionamento o il codice.
      Queste informazioni sono fornite dalla manpage &man.geom.4; e
      nei suoi vari riferimenti SEE ALSO.  Questo capitolo non è nemmeno
      la guida definitiva alla configurazione del <acronym>RAID</acronym>
      Soltanto i dischi<acronym>RAID</acronym> classificati come "supportati
      da GEOM" saranno discussi.</para>

    <para>Dopo la lettura di questo capitolo saprai:</para>

    <itemizedlist>
      <listitem>
	<para>Quale genere di supporto<acronym>RAID</acronym> è
          disponibile attraverso GEOM.</para>
      </listitem>

      <listitem>
	<para>Come usare le utilities di base per configurare, manutenere,
	  e manipolare i vari livelli di <acronym>RAID.</acronym>
	  </para>
      </listitem>

      <listitem>
        <para>Come creare dei mirror, degli stripe, criptare e connettere dischi
          remoti attraverso l'utilizzo di GEOM.</para>
      </listitem>

      <listitem>
	<para>Come sbrogliare problematiche relative ai dischi connessi
          attraverso GEOM.</para>
      </listitem>
    </itemizedlist>

    <para>Prima di procedere alla lettura di questo capitolo dovresti:</para>

    <itemizedlist>
      <listitem>
	<para>Sapere la meccanica di utilizzo dei dischi da parte di &os;.
	  (<xref linkend="disks"/>).</para>
      </listitem>

      <listitem>
	<para>Sapere come configurare e installare un kernel personalizzato
          sotto &os; (<xref linkend="kernelconfig"/>).</para>
      </listitem>
    </itemizedlist>
  </sect1>

  <sect1 id="GEOM-intro">
    <title>Introduzione a GEOM</title>

    <para>GEOM permette l'accesso e il controllo alle classi &mdash; Master Boot
      Records, <acronym>BSD</acronym> labels, ecc &mdash; attraverso l'uso
      di forniture o di di files speciali in <filename
        class="directory">/dev</filename>.  Mediante il supporto di vari
      software di configurazione<acronym>RAID</acronym> , GEOM fornisce un
      accesso "trasparente"  al sistema operativo
      e alle utilità di sistema.</para>
  </sect1>

  <sect1 id="GEOM-striping">
    <sect1info>
      <authorgroup>
        <author>
	  <firstname>Tom</firstname>

	  <surname>Rhodes</surname>

	  <contrib>Scritto da </contrib>
        </author>

        <author>
	  <firstname>Murray</firstname>

          <surname>Stokely</surname>
        </author>
      </authorgroup>
    </sect1info>

    <title>RAID0 - Striping</title>

    <indexterm>
      <primary>GEOM</primary>
    </indexterm>
    <indexterm>
      <primary>Striping</primary>
    </indexterm>

    <para>Lo striping è un metodo utilizzato per unire gli hard disks in
      un singolo volume.  In molti casi, questo si ottiene attraverso dei
      controllers hardware.  Il sottosistema GEOM fornisce il supporto software
      per il <acronym>RAID</acronym>0, conosciuto anche come disk
      striping.</para>

    <para>In un sistema <acronym>RAID</acronym>0, i dati sono tagliati in
      blocchi che vengono "spalmati" su tutti i dischi della catena RAID.
      Invece di aspettare che il sistema scriva un blocco di 256kb su un disco,
      il <acronym>RAID</acronym>0 può scrivere blocchi di 64k ciascuno
      su quattro differenti dischi, offrendo performances I/O migliori.  Queste
      performances possono essere ulteriormente migliorate utilizzando
      più controllers per dischi.</para>

    <para>In ogni "stripe" <acronym>RAID</acronym>0  ogni disco deve essere
      della stessa grandezza degli altri, dal momento che le chiamate I/O sono
      inframezzate per leggere e scrivere su più dischi in
      parallelo.</para>

    <mediaobject>
      <imageobject>
        <imagedata fileref="geom/striping" align="center"/>
      </imageobject>

      <textobject>
        <phrase>Disk Striping Illustration</phrase>
      </textobject>
    </mediaobject>

    <procedure>
      <title>Creazione di uno stripe di dischi ATA non formattati</title>

      <step>
        <para>Caricare il modulo <filename>geom_stripe</filename>:</para>

        <screen>&prompt.root; <userinput>kldload geom_stripe.ko</userinput></screen>
      </step>

      <step>
        <para>Assicurati che esiste una appropriato mount point.  Se il volume
          in questione diventerà una partizione di root, allora usa
          temporaneamente un mount point diverso,ad esempio <filename
            class="directory">/mnt</filename>:</para>

        <screen>&prompt.root; <userinput>mkdir /mnt</userinput></screen>
      </step>

      <step>
        <para>Determina i nomi dei devices per i dischi che verranno configurati
          in stripe e creali. Ad esempio per configurare in modalità
          stripe 2 dischi <acronym>ATA</acronym>
          <filename>/dev/ad2</filename> e <filename>/dev/ad3</filename>
          non ancora partizionati potresti usare il seguente comando.</para>

        <screen>&prompt.root; <userinput>gstripe label -v st0 /dev/ad2 /dev/ad3</userinput></screen>
      </step>

      <step>
        <para>Se questo volume sarà utilizzato come dispositivo di root
          da cui effettuare il boot, allora prima di creare il filesystem devi
          utilizzare il seguente comando:</para>

        <screen>&prompt.root; <userinput>fdisk -vBI /dev/stripe/st0</userinput></screen>
      </step>

      <step>
        <para>Crea una tabella delle partizioni sul nuovo volume con in
          seguente comando:</para>

        <screen>&prompt.root; <userinput>bsdlabel -wB /dev/stripe/st0</userinput></screen>
      </step>

      <step>
        <para>Questa procedura dovrebbe aver creato altri due device in
          <filename class="directory">/dev/stripe</filename> in aggiunta a
          <devicename>st0</devicename>.   Nella fattispecie
          <devicename>st0a</devicename> e <devicename>st0c</devicename>.
          Ora bisogna creare un filesystem nel device
          <devicename>st0a</devicename> utilizzando il comando
          <command>newfs</command> come segue:</para>

        <screen>&prompt.root; <userinput>newfs -U /dev/stripe/st0a</userinput></screen>

        <para>Dopo che per qualche secondo vedrete parecchi numeri scorrere
          sullo schermo, la procedura sarà completa.  Il volume è
          stato creato ed è pronto per essere montato.</para>
      </step>
    </procedure>

    <para>Per montare manualmente il dispositivo stripe appena creato usa il
      seguente comando:</para>

    <screen>&prompt.root; <userinput>mount /dev/stripe/st0a /mnt</userinput></screen>

    <para>Per montare il filesystem stripe automaticamente all'avvio del
      sistema, inserisci le informazioni del volume nel file
      <filename>/etc/fstab</filename>:</para>

    <screen>&prompt.root; <userinput>echo "/dev/stripe/st0a /mnt ufs rw 2 2" \</userinput>
      <userinput>&gt;&gt; /etc/fstab</userinput></screen>

    <para>Il modulo <filename>geom</filename> deve essere caricato contestualmente
      all'avvio del sistema; questo lo si ottiene semplicemente inserendo la
      seguente linea nel file <filename>/boot/loader.conf</filename>:</para>

    <screen>&prompt.root; <userinput>echo 'geom_stripe_load="YES"' &gt;&gt; /boot/loader.conf</userinput></screen>
  </sect1>

  <sect1 id="GEOM-mirror">
    <title>RAID1 - Mirroring</title>

    <indexterm>
      <primary>GEOM</primary>
    </indexterm>
    <indexterm>
      <primary>Disk Mirroring</primary>
    </indexterm>

    <para>Il mirroring è una tecnologia utilizzata da molte aziende e
      utenti casalinghi per il salvataggio dei dati senza interruzioni.
      La presenza di un "mirror" significa semplicemente che il disco B replica
      il disco A;oppure che i dischi C e D replicano i dischi A e B.
      Indipendentemente dalla configurazione del disco, l'aspetto importante
      è che le informazioni presenti su un disco o una partizione sono
      letteralmente "replicati".  Successivamente queste informazioni possono
      essere facilmente ripristinate,salvate senza che si verifichino
      disservizi o interruzioni nel loro accesso e, addirittura, conservate
      fisicamente in cassaforte.</para>

    <para>Per cominciare assicurati che il sistema disponga di due dischi di
      identica capacità.  Questo esercizio si riferisce a dischi
      <acronym>SCSI</acronym>ad accesso diretto (&man.da.4;),</para>

    <para>Comincia installando &os; sul primo disco creando solamente due
      partizioni.  Una dovrebbe essere una partizione di swap, pari al doppio
      della <acronym>RAM</acronym> presente nel sistema e il resto dello spazio
      dedicato al filesystem di root (<filename class="directory">/</filename>).
      È possibile creare partizioni separate per gli altri mount points,
      aumentando parecchio la difficoltà di realizzazione del progetto;
      questo è dovuto alla necessità di alterare manualmente i
      settaggi di &man.bsdlabel.8; e &man.fdisk.8;.</para>

    <para>Riavvia e aspetta che il sistema sia completamente attivo.
      Non appena il boot è completato effettua il login come
      <username>root</username>.</para>

    <para>Crea il device <filename>/dev/mirror/gm</filename> e fai un link
      dello stesso a <filename>/dev/da1</filename>:</para>

    <screen>&prompt.root; <userinput>gmirror label -vnb round-robin gm0 /dev/da1</userinput></screen>

    <para>Il sistema dovrebbe rispondere con:</para>

    <screen>Metadata value stored on /dev/da1.
Done.</screen>

    <para>Avvia GEOM,questa procedura caricherà nel kernel il modulo
      <filename>/boot/kernel/geom_mirror.ko</filename></para>

    <screen>&prompt.root; <userinput>gmirror load</userinput></screen>

    <note>
      <para>Questo comando dovrebbe ora avere creato i nodi di
        device<devicename>gm0</devicename>,<devicename>gm0s1</devicename>,
	<devicename>gm0s1a</devicename> e <devicename>gm0s1c</devicename> nella
	directory <filename class="directory">/dev/mirror</filename>.</para>
    </note>

    <para>Crea una label generica e un codice di boot nel device
      <devicename>gm0</devicename> appena creato utilizzando il comando
      <command>fdisk</command>:</para>

    <screen>&prompt.root; <userinput>fdisk -vBI /dev/mirror/gm0</userinput></screen>

    <para>Ora crea una label di informazioni generica con
      <command>bsdlabel</command>:</para>

    <screen>&prompt.root; <userinput>bsdlabel -wB /dev/mirror/gm0s1</userinput></screen>

    <note>
      <para>Se sono presenti più slices e partizioni, i flags dei due
        comandi precedenti richiederanno delle modifiche.  Queste modifiche
        devono combaciare con la grandezza delle slices e delle partizioni
        dell'altro disco.</para>
    </note>

    <para>Utilizza l'utility &man.newfs.8; per creare un filesystem di default
      sul nodo di device<devicename>gm0s1a</devicename>:</para>

    <screen>&prompt.root; <userinput>newfs -U /dev/mirror/gm0s1a</userinput></screen>

    <para>Questo dovrebbe causare la visualizzazione di un bel pò di
      numeri e informazioni varie da parte del sistema.  È corretto.
      Esamina bene lo schermo per vedere se ci sono messaggi di errore e monta
      il device in <filename class="directory">/mnt</filename>:</para>

    <screen>&prompt.root; <userinput>mount /dev/mirror/gm0s1a /mnt</userinput></screen>

    <para>Ora sposta tutti i dati presenti sul tuo disco di boot nel nuovo
      filesystem.  Questo esempio usa i comandi &man.dump.8; e &man.restore.8;
      comunque anche &man.dd.1; dovrebbe funzionare nel contesto che stiamo
      trattando.  Evita di utilizzare &man.tar.1; dal momento che non copia il
      codice di boot.  In caso contrario il fallimento è
      garantito.</para>

    <screen>&prompt.root; <userinput>dump -L -0 -f- / |(cd /mnt &amp;&amp; restore -r -v -f-)</userinput></screen>

    <para>Questo deve essere fatto per ciascun filesystem.  Disponi
      semplicemente il filesystem appropriato nella posizione corretta quando
      digiti il suddetto comando.</para>

    <para>Ora edita il file <filename>/mnt/etc/fstab</filename> "replicato" e
      rimuovi,o commenta (#) la riga relativa al file di swap.
      <footnote>
        <para>È opportuno chiarire che commentando la riga relativa
          allo swap nel file <filename>fstab</filename> ti sarà chiesto
          di ristabilire in un' altra maniera l'utilizzo dello spazio di
          swapping. Per maggiori informazioni a riguardo fai riferimento a
          <xref linkend="adding-swap-space"/>, grazie.</para>
      </footnote>
      Per utilizzare il nuovo disco cambia le altre informazioni di filesystem.
      Dai un' occhiata al seguente esempio:</para>

    <programlisting># Device                Mountpoint      FStype  Options         Dump    Pass#
#/dev/da0s2b             none            swap    sw              0       0
/dev/mirror/gm0s1a       /               ufs     rw              1       1
    </programlisting>

    <para>Ora crea un file <filename>boot.conf</filename> in entrambe le
      partizioni di root; quella corrente e quella nuova.  Questo file
      aiuterà il <acronym>BIOS</acronym> di sistema ad effettuare il
      boot dal drive corretto.</para>

    <screen>&prompt.root; <userinput>echo "1:da(1,a)/boot/loader" &gt; /boot.config</userinput></screen>

    <screen>&prompt.root; <userinput>echo "1:da(1,a)/boot/loader" &gt; /mnt/boot.config</userinput></screen>

    <note>
       <para>Lo abbiamo inserito in entrambe le partizioni di root per
         assicurarci un boot corretto.  Se per qualche ragione il sistema non
         potesse leggere la nuova partizione di root, è disponibile una
         procedura di recupero.</para>
    </note>

    <para>Adesso aggiungi la seguente linea al nuovo file
      <filename>/boot/loader.conf</filename>:</para>

    <screen>&prompt.root; <userinput>echo 'geom_mirror_load="YES"' &gt;&gt; /mnt/boot/loader.conf</userinput></screen>

    <para>Questo indicherà a  &man.loader.8; come caricare il modulo
      <filename>geom_mirror.ko</filename> durante l'inizializzazione del
      sistema.</para>

    <para>Riavvia il sistema:</para>

    <screen>&prompt.root; <userinput>shutdown -r now</userinput></screen>

    <para>Se tutto è andato liscio il sistema dovrebbe aver effettuato
      il boot di device<devicename>gm0s1a</devicename> e il prompt di
      <command>login</command> dovrebbe essere in attesa.  Se qualcosa è
      andato storto fai riferimento alla sezione successiva "risoluzione dei
      problemi".  Ora aggiungi al disco<devicename>da0</devicename> al device
      <devicename>gm0</devicename>:</para>

    <screen>&prompt.root; <userinput>gmirror configure -a gm0</userinput>
&prompt.root; <userinput>gmirror insert gm0 /dev/da0</userinput></screen>

    <para>Il flag <option>-a</option> dice a &man.gmirror.8; di usare la
      sincronizzazione automatica; ovvero mirrorare
      automaticamente le scritture sul disco.  La manpage descrive come
      ricostruire o rimpiazzare i dischi, utilizzando
      <devicename>data</devicename> al posto di
      <devicename>gm0</devicename>.</para>

    <sect2>
      <title>Risoluzione dei problemi</title>

      <sect3>
        <title>Il sistema non effettua il boot</title>

        <para>Se al boot il sistema mostra un prompt simile a questo:</para>

        <programlisting>ffs_mountroot: can't find rootvp
Root mount failed: 6 mountroot>
</programlisting>

        <para>Riavvia la macchina utilizzando il tasto di reset o il pulsante
          di accensione.  Arrivato al menu del boot, scegli l'opzione sei (6).
          Questo forzerà il sistema al prompt di &man.loader.8;.
          Carica manualmente il modulo del kernel:</para>

        <screen>OK? <userinput>load geom_mirror.ko</userinput>
OK? <userinput>boot</userinput></screen>

        <para>Se funziona significa che per qualche ragione il modulo non era
          stato caricato correttamente.  Inserisci:</para>

        <programlisting>options	GEOM_MIRROR</programlisting>

        <para>nel file di configurazione del kernek,ricompilalo e reinstallalo.
          Questo dovrebbe risolvere il problema.</para>
      </sect3>
    </sect2>
  </sect1>
</chapter>