<!--
$Id: admin.sgml,v 1.39 2004/08/02 21:20:04 rionda Exp $
-->
<chapter>
  <title>Amministrazione del Sistema</title>
  <para>Sarebbe stato difficile cominciare con qualcosa di diverso
   dall'Amministrazione di Sistema, perch&eacute; &egrave; praticando 
   questa <emphasis>sana</emphasis> attivit&agrave; che ci si pone
   domande pi&ugrave; o meno serie.</para>
   <sect1 id='accentate'>
     <title>Come posso usare le accentate in console?</title>
     <para>Per utilizzare le lettere accentate in console, occorre
     impostare in <filename>/etc/rc.conf</filename> i caratteri che
     andranno caricati all'avvio del sistema:
     <screen>font8x8="iso15-8x8"
font8x14="iso15-8x14"
font8x16="iso15-8x16"
     </screen>
     Inoltre potrebbe essere necessario esportare la variabile
     d'ambiente <literal>TERM</literal> con valore
     <literal>cons25l1</literal> e questo pu&ograve; essere fatto sia
     da ogni utente nel file di configurazione della propria shell,
     sia l'amministratore di sistema tramite
     <filename>/etc/ttys</filename>.<para>  
     <para>Un altro sistema consiste nel creare nella propria home
     directory il file <filename>.inputrc</filename> ed editarlo nel
     seguente modo:
     <screen>set meta-flag on 
set convert-meta off
set output-meta on
     </screen>
     Eseguiamo nuovamente il login e potremo ora usare le vocali
     accentate anche in console. Questo ultimo metodo funziona per&ograve;
     solo con la shell bash e le versioni di FreeBSD precedenti alla
     5.x.</para> 
   </sect1>
   <sect1 id='at'>
     <title>Come posso eseguire  un comando a una determinata ora di
     un determinato giorno?</title>
     <para>Pu&ograve; capitare la necessit&agrave; di dover eseguire
     un comando in uno specifico momento della giornata, quando magari
     non saremo nei pressi della nostra macchina ma dovremmo compiere
     un'importante operazione. Il comando &man.at.1; serve proprio a
     questo, ed ha una sintassi molto semplice:
     <cmdsynopsis>
       <command>at</command> <arg
       choice=req><replaceable>ORA</replaceable></arg> <arg
       choice=req><replaceable>GIORNO</replaceable></arg>
     </cmdsynopsis>
     <screen>&prompt.user; <userinput>at 0:00 14/02/2003</userinput>
<userinput>mail $indirizzofidanzata < ~/sanvalentino.txt</userinput>
     </screen>
     Per uscire dalla modalit&agrave; di inserimento comandi basta
     premere <keycombo action="simul"><keycap>CTRL</keycap>
     <keycap>D</keycap></keycombo>. Per verificare la coda di
     comandi che abbiamo impostato con &man.at.1;, possiamo usare il
     comando &man.atq.1;.</para> 
   </sect1>
   <sect1 id='PS1'>
     <title>Il prompt di default della shell &egrave; bruttino, come
     posso cambiarlo?</title>
     <para>Cambiando la variabile d'ambiente <literal>PS1</literal>
     &egrave; possibile 
     modificare il prompt della shell. Ci sono alcuni caratteri di
     escape che possono essere utili per personalizzare ulteriormente
     il prompt. Questi sono solo alcuni per la shell bash:
     <screen>\u : l'user corrente
\h : l'hostname
\w : la directory corrente
\@ : l'ora corrente, in formato 12H am/pm
\t : l'ora corrente, in formato 24-ore HH:MM:SS
\d : la data, in formato Giorno della Settimana Mese Data
      </screen>
      Per la shell tcsh, ovvero quella di default, &egrave; necessario
      impostare la variabile <literal>prompt</literal>, che accetta i
      seguenti caratteri di escape:
      <screen>%n : l'user corrente
%m : l'hostname
%/ o %~ : la directory corrente
%@ : l'ora corrente in formato 12H am/pm
%T : l'ora corrente in formato 24-ore HH:MM
"%d %w %D" : sequenza per la data corrente in formato Giorno della Settimana Mese Data
     </screen>
     Per ulteriori sequenze di escape, le man page delle due
     shell, &man.bash.1; e &man.tcsh.1;, sono pi&ugrave; che
     esaustive.Un PS1 tipico &egrave;
     <literal>user@hostname$</literal> 
     corrisponde a 
     <screen>\u@\h$
     </screen>     
     in bash e a
     <screen>%n@%m$
     </screen>
     per quanto riguarda la variabile <literal>prompt</literal> di 
     tcsh.    
     A volte pu&ograve; essere utile visualizzare l'ora o la
     directory corrente quindi un prompt adatto sarebbe
     <literal>[ora][directory corrente]$</literal> che &egrave; la
     risultante di 
     <screen>[\@][\w]$
     </screen>
     e di
     <screen>[%@][%~]$
     </screen>
     rispettivamente in bash e in tcsh.
     Per la shell &man.sh.1; non esistono caratteri di escape,
     tuttavia &egrave; possibile modificare il prompt agendo
     sempre sulla variabile PS1, assegnandole quindi qualsiasi
     valore si voglia anche facendo uso di espressioni come in
     <screen>~paperoga&prompt.user; <userinput>exportPS1=$(/usr/bin/whoami)$;</userinput>
paperoga$
     </screen>
     per settare il prompt con il nome utente attuale.</para> 
   </sect1> 
   <sect1 id="crontab">
     <title>Come posso fare eseguire un comando ogni determinato
     lasso di tempo?</title>
     <para>Il comando &man.crontab.1; &egrave; utile per eseguire
     un comando o una serie di comandi a ogni determinato periodo. Per
     inserire comandi nella lista occorre lanciare
     <screen>&prompt.user;<userinput>crontab -e</userinput>
     </screen> 
     che ci consente di editare un file con l'editor
     definito dalla variabile d'ambiente $EDITOR (di default questa
     variabile punta a &man.vi.1;. Le righe di questo file devono
     avere il seguente formato:
     <screen>minuti ore giorno del mese mese giorno_della_settimana comando
     </screen>
     Con questa riga il comando viene eseguito ogni e solo
     ogni Martedì 1 gennaio alle 12,15:
     <screen>15 12 1 Jan Tue echo "buon anno!
     </screen>
     </para>
     <para>&Egrave; possibile usare anche il carattere jolly
     <literal>*</literal>. Ad esempio:
     <screen>15 * * * * /usr/local/bin/fetchmail
     </screen>
     esegue il comando ogni 15 minuti di un'ora: alle 0:15,
     1:15 ecc. Per eseguire il comando ogni quarto d'ora, la
     linea del file dovr&agrave; essere:
     <screen>00,15,30,45 * * * * /usr/local/bin/fetchmail
     </screen>
     Per visualizzare il file di &man.crontab.1; lanciamo
     <screen>&prompt.user; <userinput>crontab -l</userinput>
     </screen>
     </para>
   </sect1>     
   <sect1 id='alias'>
     <title>Esiste un modo per evitare di scrivere 
     un intero comando molto lungo ogni volta?</title>
     <para>Gli alias sono delle scorciatoie per risparmiare tempo
     associando una breve parola a un comando molto lungo. 
     &man.alias.1 serve proprio a questo e la sua sintassi &egrave;:
     <screen>&prompt.user; <userinput>alias ALIAS='COMANDO'</userinput>
     </screen>
     dove COMANDO &egrave; il comando con le sue opzioni che
     vogliamo associare ad ALIAS. Gli alias settati in questo modo
     per&ograve; sono validi solo per la sessione corrente e 
     per definirli una volta per tutte, basta aggiungerli nel 
     file di configurazione della propria shell.</para>
   </sect1>
   <sect1 id='CVSup'>
      <title>Come posso aggiornare il sistema?</title>         
      <para>FreeBSD permette di scaricare i sorgenti aggiornati e
      di ricompilare tutto il sistema base e il kernel in modo da 
      avere un sistema perfettamente aggiornato. L'utility 
      fondamentale per compiere quest'operazione si chiama 
      &man.cvsup.1; ed &egrave; compreso nell'albero dei ports sotto
      <filename>net/cvsup-without-gui</filename>. Abbiamo la
      possibilit&agrave; di installarlo sia con i ports sia con i 
      packages, opzione sicuramente pi&ugrave; veloce, dal
      momento che <application>cvsup-without-gui</application> 
      dipende da pacchetti che impiegano abbastanza tempo a
      compilarsi. Mentre viene effettuata l'installazione,
      cominciamo a editare i file di configurazione per essere
      subito operativi. Creiamo la directory
      <filename>/usr/local/etc/cvsup</filename> e, aperto il nostro 
      editor preferito, cominciamo a scrivere il file
      <filename>cvsup.stable</filename>:
      <screen>*default host=cvsup.it.freebsd.org
*default prefix=/usr
*default release=cvs tag=RELENG_5
*default delete use-rel-suffix
*default umask=0022
*default compress
src-all
      </screen>
      Questo file serve per aggiornare i sorgenti del sistema
      base, occupiamoci ora di quello per aggiornare i ports,
      <filename>cvsup.ports</filename>:
      <screen>*default host=cvsup.it.freebsd.org
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix
*default umask=0022
*default compress
ports-all
      </screen>
      Si nota subito che &egrave; quasi identico al precedente, salvo
      per l'ultima riga che &egrave; quella che identifica quale
      "collezione" di fil3 vogliamo scaricare, e per il valore di
      <literal>tag=</literal>, la cui funzione spiegheremo pi&ugrave; 
      oltre.</para>
      <para>Per aggiornare anche la documentazione creiamo un file
      <filename>cvsup.docs</filename> 
      uguale ai precedenti eliminando solo la riga 
      <literal>*default umask=0022</literal> e sostituendo l'
      ultima riga con <literal>doc-all</literal>.</para> 
      <para>Le uniche altre righe importanti da tenere in
      considerazione sono: 
      <literal>*default host=cvsup.it.freebsd.org</literal> 
      che identifica l'host da cui vogliamo scaricare i sorgenti 
      (l'elenco completo dei mirror &egrave; disponibile
      all'indirizzo  <ulink
                            URL='http://www.freebsd.org/doc/handbook/cvsup.html#CVSUP-MIRRORS'>http://www.freebsd.org/doc/handbook/cvsup.html#CVSUP-MIRRORS</ulink>
      ), e <literal>*default release=cvs tag=</literal>, dove 
      viene indicato che ramo di sviluppo vogliamo seguire 
      nell'aggiornamento del sistema. Come spiegato alla domanda 
      "Qual &egrave; l'ultima versione di FreeBSD?" (<xref
                                                           linkend='latest-version'>),  FreeBSD viene sviluppata in
      settori diversi e ognuno pu&ograve; scegliere quale ramo 
      seguire a seconda delle preferenze personali e dell'ambiente di 
      utilizzo della macchina. Nel nostro esempio abbiamo scelto
      di seguire il ramo di sviluppo -STABLE, specificando quindi 
      <literal>RELENG_5</literal> per quanto riguarda i sorgenti,
      mentre per i ports e i documenti abbiamo messo
      <literal>.</literal> (punto), che identifica l'ultima
      versione possibile per quanto riguarda questi due
      componenti; se avessimo specificato <literal>.</literal> 
      (punto) anche per i sorgenti avremmo seguito il ramo di 
      sviluppo -CURRENT, molto pi&ugrave; instabile, che richiede 
      maggiore esperienza e capacit&agrave; di risolvere i
      problemi per contro proprio. La spiegazione dettagliata di 
      ogni riga dei file di configurazione di
      <application>CVSup</application> si trova in 
      <ulink
            URL='http://www.freebsd.org/doc/handbook/cvsup.html'>una
pagina dell'handbook di &os;</ulink>.</para> 
      <para>Se eseguissimo l'aggiornamento del sistema con solo
      questi file, otterremmo una grande quantit&agrave; di 
      materiale di cui non faremmo utilizzo, come ad esempio i 
      ports localizzati in lingue asiatiche o differenti 
      dall'italiano e inglese; per evitare questo, creiamo la 
      directory <filename>/usr/local/etc/cvsup/sup</filename> e il 
      file <filename>/usr/local/etc/cvsup/sup/refuse</filename>:
      <screen>ports/arabic/*
ports/chinese/*
ports/french/*
ports/german/*
ports/hebrew/*
ports/hungarian/*
ports/japanese/*
ports/korean/*
ports/russian/*
ports/polish/*
ports/portuguese/*
ports/russian/*
ports/ukrainian/*
ports/vietnamese/*
doc/bn*
doc/da*
doc/de*
doc/el*
doc/es*
doc/fi*
doc/fr*
doc/ja*
doc/no*
doc/nl*
doc/pl*
doc/po*
doc/pt*
doc/ru*
doc/sr*
doc/tr*
doc/zh*
      </screen> 
      Un ultimo file &egrave; necessario per poter finalmente
      compiere l'aggiornamento del sistema: 
      <filename>make.conf</filename>, da posizionare in 
      <filename>/etc</filename>:
      <screen>USA_RESIDENT=NO
SUP_UPDATE=yes
SUP=/usr/local/bin/cvsup
SUPFLAGS= -g -L 2
SUPFILE=/usr/local/etc/cvsup/cvsup.stable
PORTSSUPFILE=/usr/local/etc/cvsup/cvsup.ports
DOCSUPFILE=/usr/local/etc/cvsup/cvsup.docs
SUPHOST=cvsup10.freebsd.org
XFREE86_VERSION=4
      </screen>
      Cosa significa ogni riga di questo file?
      La prima rende noto al server che noi non siamo residenti negli
      Stati Uniti, cosicch&egrave; i sorgenti di quei programmi
      che per motivi legali non possono uscire dagli USA, non
      verranno scaricati sul nostro computer. 
      <literal>SUP_UPDATE</literal> indica che vogliamo servirci
      del sistema CVSup per l'aggiornamento dei sorgenti. La riga 
      seguente segnala il percorso completo dell'eseguibile
      <literal>cvsup</literal>. Dopo la specificazione delle flag
      da passare a <command>cvsup</command>, troviamo le locazioni
      dei file di configurazione, rispettivamente quello dei 
      sorgenti, dei ports e della documentazione, infine la 
      versione di XFree86 che vogliamo usare, tipicamente la
      4.</para>
      <para>Portiamoci ora in <filename>/usr/src</filename> ed
      eseguiamo
      <screen>&prompt.root; <userinput>make update</userinput>
      </screen> per aggiornare i
      sorgenti, i ports e la documentazione. Qualora volessimo
      aggiornare solo i ports, eseguiamo la stessa operazione da
      <literal>/usr/ports</literal>.</para>
      <para>Ora i nostri sorgenti sono equivalenti a quelli sul
      CVS di FreeBSD  ma per avere il sistema "up to date" 
      dobbiamo ricompilare <literal>world</literal> (ovvero il 
      sistema base) e <literal>kernel</literal> (il 
      <emphasis>nocciolo</emphasis> del sistema operativo) come 
      spiegato alla domanda "Come ricompilo il sistema?" (<xref linkend='ricompilare'>)</para>
    </sect1>   
    <sect1 id='ricompilare'>
      <title>Come ricompilo il sistema?</title>
      <para>Capita spesso di voler ricompilare il sistema base e
      il kernel e i motivi sono i pi&ugrave; disparati: si passa 
      dal volerli semplicemente aggiornare per motivi di sicurezza
      o per poter usufruire delle ultime versioni di alcuni driver 
      fino al voler semplicemente ricompilare perch&eacute; si 
      &egrave; aggiunta un'opzione nel kernel e vogliamo
      verificarne il funzionamento.</para>
      <para>La prima cosa da fare &egrave; impostare le opzioni
      per del compilatore cos&igrave; da ottenere un sistema 
      ottimizzato per le caratteristiche della nostra macchina; 
      editiamo <filename>/etc/make.conf</filename> (le seguenti
      righe vanno aggiunte a quelle eventualmente già presenti):
      <screen>CFLAGS= -O2 -pipe
#CXXFLAGS+= -fmemoize-lookups -fsave-memoized <= temporaneamente non supportata
COPTFLAGS= -O2 -pipe
      </screen>
      La compilazione si svolge in pi&ugrave; fasi:
      <orderedlist>
          <listitem>
            <para><link linkend='src-update'>aggiornamento dei
             sorgenti</link> (opzionale)</para>
          </listitem>
          <listitem>
            <para><link linkend='read-updating'>lettura del file
            UPDATING</link></para> 
          <listitem>
            <para><link linkend='world-compile'>compilazione del
            <literal>world</literal></link></para>
          </listitem>
          <listitem>
            <para><link linkend='kernel-compile'>compilazione del
            <literal>kernel</literal></link></para>
          </listitem>
          <listitem>
            <para><link linkend='install-kernel'>installazione del
            <literal>kernel</literal></link></para>
          </listitem>
          <listitem>
            <para><link linkend='singleuser'>reboot in single-user
             mode</link></para>
          </listitem>
          <listitem>
            <para><link linkend='install-world'>installazione del
            <literal>world</literal></link></para>
          </listitem>
          <listitem>
            <para><link linkend='mergemaster'>aggiornamento dei
            file di configurazione</link></para>
          </listitem>
          <listitem>
            <para><link linkend='reboot'>riavvio del
            sistema</link></para> 
          </listitem>
        </orderedlist>
            Cominciamo a vederli uno per uno.
            <orderedlist>
          <listitem>
            <para><anchor id='src-update'>Vedere la domanda 
            "Come posso aggiornare il sistema?" (<xref
                                                       linkend='CVSup'>)</para>
          </listitem>
          <listitem>
            <para><anchor id='read-updating'>Importante &egrave; anche
            la lettura del file <filename>/usr/src/UPDATING</filename>
            che contiene alcune informazione riguardo gli
            aggiornamenti dell'albero dei sorgenti di FreeBSD e
            contiene indicazioni quali la necessit&agrave; di
            aggiungere utenti, gruppi o altre opzioni per avere un
            sistema funzionante.</para> 
          </listitem>
          <listitem>
            <para><anchor id='world-compile'>Per compilare il
            <literal>world</literal> entriamo in 
            <filename>/usr/src</filename> e lanciamo 
            <screen>&prompt.root; <userinput>make buildworld</userinput>
            </screen>
            Il tempo di compilazione varia a seconda della
            frequenza del processore e della quantit&agrave; 
            di memoria del sistema.</para>
          </listitem>
          <listitem>
            <para><anchor id='kernel-compile'>La compilazione
            del <literal>kernel</literal> non &egrave; diversa da 
            quella del <literal>word</literal>, in quanto &egrave;
            sufficiente lanciare, sempre da 
            <filename>/usr/src</filename>
            <screen>&prompt.root; <userinput>make buildkernel</userinput>
            </screen>
            Non viene qui trattata la configurazione del kernel,
            perch&eacute; un argomento che dipende 
            molto dalle esigenze personali di ognuno. Si veda il 
            capitolo <ulink URL='
	    http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig.html'>Configuring the FreeBSD Kernel</ulink> 
            dell'handbook per maggiori informazioni.</para>
          </listitem>
          <listitem>
            <para><anchor id='install-kernel'>Dopo aver effettuato
            la compilazione del <literal>world</literal> e del
            <literal>kernel</literal> si passa alla fase di 
            installazione, che avviene in ordine contrario
            rispetto alla compilazione:
            <screen>&prompt.root; <userinput>make installkernel</userinput>
            </screen>
            Verranno cos&igrave; installati il file del nuovo
            kernel ovvero <filename>/boot/kernel/kernel</filename>, i
            nuovi moduli sotto <filename>/boot/kernel/</filename>,
            inoltre il vecchio kernel sar&agrave; rinominato in 
            <filename>boot/kernel.old/kernel</filename> .</para>
            <warning>
              <para>Nelle versioni precedenti alla 5.0-RELEASE, il
              kernel &egrave; <filename>/kernel</filename>, i moduli
              si trovano in <filename>/modules</filename> e il kernel
              precedente &egrave; <filename>/kernel.OLD</filename>
             .</para>
            </warning>
          </listitem>
          <listitem>
            <para><anchor id='singleuser'>Prima di installare il
            <literal>world</literal> &egrave; necessario passare in
            <emphasis>single-user mode</emphasis>, ovvero in
            modalit&agrave; utente singolo, con i soli servizi di
            base attivi e la possibilit&agrave; per il solo utente
            <username>root</username> di usare il sistema. Per
            passare in single user mode, occorre eseguire il
            comando
            <screen>&prompt.root; <userinput>shutdown now</userinput>
            </screen>
          <listitem>
            <para><anchor id='install-world'>Naturalmente avere un
            <literal>kernel</literal> aggiornato non &egrave; 
            sufficiente e anzi la discrasia tra 
            <literal>kernel</literal> e <literal>world</literal>
            porta spesso gravi problemi. Per installare il sistema
            base:
            <screen>&prompt.root; <userinput>make installworld</userinput> 
            </screen>
	    </para>
          </listitem>
          <listitem>
            <para><anchor id='mergemaster'>Il processo di sviluppo
            di FreeBSD coinvolge anche i file di configurazione, 
            aggiungendo o togliendo opzioni, utenti, gruppi. 
            &Egrave; importante, per avere un sistema aggiornato
            in maniera corretta, che anche questi file vengano
            installati; tuttavia molti di questi sono oggetto di 
            modifiche e personalizzazioni da parte di ognuno per 
            ottimizzare il sistema ed &egrave; quindi necessario 
            prestare molta 
            attenzione nella scelta dei file da aggiornare. 
            Fortunatamente FreeBSD mette a disposizione 
            &man.mergemaster.8;, uno script di shell che, utilizzando
            <filename>/usr/src/etc/Makefile</filename> crea un
            ambiente temporaneo e lo riempe dei nuovi file di 
            configurazione; fatto ci&ograve; li confronta uno ad 
            uno con quelli installati nel nostro sistema e ci
            chiede se vogliamo installare il nuovo file, lasciare 
            intoccato quello installato oppure effettuare un
            <emphasis>merge</emphasis> dei due file, ovvero una
            loro fusione. Lanciamo quindi:
            <screen>&prompt.root; <userinput>mergemaster -cvs</userinput> 
            </screen>
            (&man.mergemaster.8; ha moltissime opzioni, la man
            page &egrave; il luogo dove trovare la spiegazione 
            di ognuna). Ora avremo lo schermo diviso in due parti
            uguali orizzontalmente: in alto troveremo il contenuto
            del file attuale, in basso quello del nuovo file di 
            configurazione. Ecco quindi che avremo la 
            possibilit&agrave; di scegliere cosa fare del nuovo
            file:
            <screen>Use 'd' to delete the temporary .<replaceable>/etc/mail/mailer.conf</replaceable>
Use 'i' to install the temporary .<replaceable>/etc/mail/mailer.conf</replaceable>
Use 'm' to merge the temporary and installed versions
Use 'v' to view the diff results again
            </screen>
            &Egrave; chiaro a cosa corrisponde ogni opzione. 
            Una sola nota sull'opzione <literal>m</literal>: se 
            scegliamo questa possibilit&agrave;, lo schermo si 
            divider&agrave; verticalmente e a sinistra troveremo 
            il file attuale, a destra il nuovo e per ogni
            differenza tra i due potremo scegliere se tenere la 
            vecchia o la nuova riga corrispondente, selezionando 
            tramite la pressione di <literal>r</literal> per la 
            parte destra (quella <emphasis>nuova</emphasis>) e 
            <literal>l</literal> per la parte sinistra, ovvero 
            quella attualmente installata, per finire e installare
            il file cos&igrave; fatto, premiamo
            <literal>i</literal>. La procedura di confronto si 
            ripete per ogni file del sistema che abbiamo cambiato
            o &egrave; stato modificato nella versione CVS  e 
            potrebbe durare un po' di tempo, anche perch&eacute; 
            &egrave; necessario prestare <emphasis>molta</emphasis>
            attenzione: un errore in questa fase potrebbe portare 
            alcuni problemi.</para>
          </listitem>
          <listitem>
            <para><anchor id='reboot'>Alla fine di tutto, 
            per poter utilizzare il sistema aggiornato riavviamo la 
            macchina con
            <screen>&prompt.root; <userinput>reboot</userinput>
            </screen>
            Ora il nostro sistema &egrave; aggiornato e lo si
            pu&ograve; verificare dall risultato di
            <screen>&prompt.root; <userinput>uname -a</userinput>
FreeBSD pdp.paperopoli 4.8-STABLE FreeBSD 4.8-STABLE #4: Wed Jul
23 09:32:03 CEST 2003 root@pdp.paperopoli:/usr/obj/usr/src/sys/DEPOSITO  i386 
            </screen>
            La risposta a eventuali problemi si trova alla domanda "Ho
            ricompilato il sistema ma al riavvio ci sono dei
            problemi. Cosa posso fare?" (<xref
            linkend='updateproblems'>).</para> 
          </listitem>
        </orderedlist>
        </para>
    </sect1>
    <sect1 id='updateproblems'>
      <title>Ho ricompilato il sistema ma al riavvio ci sono dei
      problemi. Cosa posso fare?</title>
      <para>I problemi che si possono riscontrare al riavvio del
      sistema dopo aver effettuato la ricompilazione possono
      essere di vario genere: si va dalla mancanza di qualche
      supporto fondamentale nel kernel a qualche errore durante la
      fase di mergemaster. La via pi&ugrave; comoda e veloce per
      risolvere questi problemi &egrave; il caricamento
      del kernel precedente e una nuova ricompilazione del sistema
      dopo aver accertato la causa del danno che sar&agrave; da
      rilevarsi quindi o nel file di configurazione del kernel o
      nei file di configurazione del sistema, e in quest'ultimo
      caso &egrave; sufficiente rieffettuare il mergemaster o cercare
      un eventuale errore di battitura in un file di configurazione
      quale <filename>/etc/rc.conf</filename> 
      Per caricare il kernel precedente dobbiamo, al boot del
      sistema, effettuare i seguenti passi:
      <screen>Loading /boot/defaults/loader.conf
/kernel text=0x161db8 data=0x218ac+0x223fc syms=[0x4+0x23040+0x4+0x243e4]
/modules/splash_bmp.ko text=0x10f9 data=0xc8+0x66c syms=[0x4+0x420+0x4+0x230]
/modules/vesa.ko text=0x2330 data=0xea0+ox23c syms=[0x4+0x7a0+0x4+0x585]
Hit [Enter] to boot immediately, or any other key for command prompt. <keycombo><keycap>Invio</keycap></keycombo>
<userinput>unload
load /boot/kernel.old/kernel
boot</userinput>
      </screen>
      Fatto questo, il sistema caricher&agrave; il kernel
      precedente (funzionante) e potremo ora risolvere l'errore 
      come spiegato sopra.</para>
    </sect1>
  <sect1 id='default-date'>
    <title>Come posso ottenere i sorgenti relativi a una data
    precisa?</title>
    <para>L'utilizzo di CVS come base per il sistema di aggiornamento
    di FreeBSD consente di effettuare un "passo indietro" nello
    sviluppo del sistema ed ottenere l'albero dei sorgenti esattamente
    com'era in una certa data. Prendiamo il file di configurazione di
    cvsup per i sorgenti,
    <filename>/usr/local/etc/cvsup/cvsup.stable</filename>, e cambiamo
    la riga:
    <screen>*default release=cvs tag=RELENG_5_2</screen>
    in
    <screen>*default release=cvs tag=RELENG_5_2 date=<replaceable>2004.02.05.17.30.00</replaceable>
    </screen>
   I numeri divisi da punti significano che vogliamo ricevere l'albero
   dei sorgenti com'era in quel momento esatto. Come &egrave;
   intuibile, il formato è il seguente
   <literal>anno.mese.giorno.ora.minuti.secondi</literal>. 
   Naturalmente si possono ottenere anche i ports e i doc relativi ad
   un certo istante, &egrave; sufficiente modificare i file di
   configurazione corrispondenti.</para>
  </sect1>
  <sect1 id='uptime497'>
      <title>Come mai ogni 497 giorni &man.uptime.1;
      riazzera il conteggio dei giorni?</title>
      <para>Sulle macchine a 32 bit, ogni 497 giorni il conteggio
      dell'uptime viene riazzerato. Ci&ograve; &egrave; dovuto
      all'architettura stessa della macchina e al fatto che il 
      sistema operativo registra l'uptime in 
      <emphasis>jiffy</emphasis><footnote><para>Un jiffy è pari a
      1/100 di secondo.</para></footnote> in una variabile a 32 bit e
      quindi risulta la seguente equazione:
      2<superscript>32</superscript> &divide; (100 jiffy &times; 60
      secondi &times; 60 minuti &times; 24 giorni) &cong; 497.1
      ovvero: il numero massimo contenibile da una variabile a 32 bit 
      (2<superscript>32</superscript>),
      diviso per i jiffy di un giorno, da come risultato circa 
      497 giorni. Nelle macchine con processore/i a 64 bit non si 
      riscontra questo problema se non dopo 5.845.420.460 anni di 
      uptime.</para>
    </sect1>
  <sect1 id='floppyformat'>
      <title>Come formatto i floppy disk?</title>
      <para>La formattazione dei floppy disk si svolge in tre
      fasi:</para>
      <procedure>
        <step>
          <para>Formattazione a basso livello</para>
        </step>
        <step>
          <para> Scrittura dell'etichetta<footnote><para>Per
          <emphasis>etichetta</emphasis> si intende quella parte
          interna del floppy, contenente varie informazioni
          riguardanti il floppy stesso</para></footnote> del
          floppy</para>
        </step>
        <step>
          <para>Creazione del filesystem</para>
        </step>
      </procedure>
      <para>Procediamo con la prima fase: come utente
      <username>root</username>, dopo aver inserito un floppy nel
      lettore, lanciamo
      <screen>&prompt.root; <userinput>fdformat -n /dev/fd0</userinput></screen>
      L'opzione <literal>-n</literal> evita il controllo dei
      settori del floppy dopo aver completato la formattazione.
      Ora dobbiamo editare l'etichetta del floppy, specificando
      che si tratta di un floppy a 1440 Kb; per fare questo
      utilizzeremo &man.disklabel.8;:
      <screen>&prompt.root; <userinput>disklabel -r -w /dev/fd0 fd1440</userinput></screen>
      Ultima fase: la creazione del filesystem. Solitamente, il
      filesystem dei floppy disk &egrave; FAT12, quindi creiamo il
      filesystem nel seguente modo:
      <screen>&prompt.root; <userinput>newfs_msdos -f 1440 /dev/fd0</userinput></screen>
      L'opzione <literal>-f</literal> serve naturalmente a
      specificare la capacit&agrave; del dischetto. Molto utili
      nella gestione dei floppy sono gli
      <application>mtools</application>
      (<filename>emulators/mtools</filename>), una suite di
      comandi per interagire con periferiche removibili (e non)
      formattate con filesystem FAT senza bisogno di montarle,
      utilizzando la sintassi tipica dei comandi DOS.</para>
    <sect1 id='addgroup'>
      <title>Come aggiungo un utente a un gruppo?</title>   
      <para>A volte pu&ograve; essere necessario che un utente
      appartenga a  pi&ugrave; gruppi; ad esempio occorre
      aggiungere un utente al gruppo <username>wheel</username> 
      affinch&egrave; abbia la possibilit&agrave; di elevarsi a 
      <username>root</username> mediante &man.su.1;  oppure se 
      abbiamo molti utenti, creare un nuovo gruppo
      <username>utenti</username> pu&ograve; semplificare 
      l'amministrazione degli stessi. Il file che contiene le
      informazioni riguardo ai gruppi &egrave; 
      <filename>/etc/group</filename>, il cui formato &egrave;
      <screen>wheel:*:0:root</screen>
      Sono 4 campi separati da il segno "<literal>:</literal>". Il
      primo campo identifica il nome del gruppo, in questo caso
      <username>wheel</username> ovvero il gruppo a cui di default
      appartiene <username>root</username> e gruppo proprietario
      della maggior parte dei binari e dei file del sistema. Il
      secondo campo &egrave; la password di sistema che, a detta
      della stessa man di &man.group.5; &egrave; molto raramente
      usata ed &egrave; infatti normalmente presente un asterisco
      per indicare l'assenza di password. Successivamente troviamo
      il <emphasis>gid</emphasis> ovvero il numero identificativo
      corrispondente al gruppo. Infine ci sono i membri del
      gruppo, separati da virgole. Per aggiungere l'utente
      <username>paperino</username> al gruppo 
      <username>wheel</username>, dovremo quindi editare
      <filename>/etc/group</filename> nel seguente modo:
      <screen>wheel:*:0:root,paperino</screen>
      La presenza dei gruppi &egrave; utilissima quando, in
      sistemi con molti utenti, si vuole avere molta 
      flessibilit&agrave; nella gestione degli stessi, 
      concedendo permessi e mettendo divieti a seconda del gruppo
      di appartenenza.</para>
    </sect1>
<sect1 id='cambiohostname'>
      <title>Come cambio l'hostname?</title>
      <para>L'<emphasis>hostname</emphasis> ovvero il nome della
      macchina, viene di solito settato all'avvio del sistema 
      tramite la lettura di un riga del file 
      <filename>/etc/rc.conf</filename>, precisamente una linea 
      simile alla seguente:
      <screen>hostname="deposito.pdp.paperopoli"</screen>
      Modificando la riga corrispondente, l'hostname sar&agrave;
      cambiato al prossimo riavvio, mentre se vogliamo modificarlo
      "al volo", usiamo il comando &man.hostname.1;, usato anche
      per sapere l'hostname attuale:
      <screen>&prompt.root; <userinput>hostname</userinput>
paperino.peropoli
&prompt.root; <userinput>hostname paperoga.paperopoli</userinput>
&prompt.root; <userinput>hostname</userinput>
paperoga.paperopoli;
      </screen>
      Una raccomandazione, probabilmente superflua: non usare nomi
      di host gi&agrave; esistenti per il proprio hostname, in
      quanto questo potrebbe creare problemi di vario genere.</para>
    <sect1 id='mioip'>
      <title>Come faccio a sapere il mio indirizzo IP?</title>
      <para>Le informazioni riguardanti le interfaccie di rete
      vengono fornite dal comando &man.ifconfig.8;:
      <screen>&prompt.root; <userinput>ifconfig</userinput>
fxp0: flags=8843&lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST&gt; mtu 1500
        inet6 fe80::203:47ff:fee1:ccd4%fxp0 prefixlen 64 scopeid 0x1 
        inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255
        ether 00:03:47:e1:cc:d4
        media: Ethernet autoselect (10baseT/UTP)
        status: active
lp0: flags=8810&lt;POINTOPOINT,SIMPLEX,MULTICAST&gt; mtu 1500
lo0: flags=8049&lt;UP,LOOPBACK,RUNNING,MULTICAST&gt; mtu 16384
        inet6 ::1 prefixlen 128 
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4 
        inet 127.0.0.1 netmask 0xff000000
ppp0: flags=8010&lt;POINTOPOINT,MULTICAST&gt; mtu 1500
sl0: flags=c010&lt;POINTOPOINT,LINK2,MULTICAST&gt; mtu 552
tun0: flags=8051&lt;UP,POINTOPOINT,RUNNING,MULTICAST&gt; mtu 1492
        inet 123.45.67.89 --> 192.168.100.1 netmask 0xffffffff 
        Opened by PID 71
      </screen>
      Senza spiegare il significato di ogni riga e ogni
      elemento in quanto sarebbe troppo lungo, notiamo subito che
      l'indirizzo IP di ogni interfaccia che ne ha uno, &egrave;
      specificato nella riga che comincia con
      <literal>inet</literal>, quindi nel caso dell'intefaccia
      <devicename>tun0</devicename>, tipicamente utilizzata
      per la connessione a Internet, l'indirizzo IP si trova alla
      linea:
      <screen>inet 123.45.67.89 --> 192.168.100.1 netmask 0xffffffff
      </screen>
      ed &egrave; <literal>123.45.67.89</literal>. Se vogliamo avere
      solo l'indirizzo IP, dobbiamo concatenare una serie di
      comandi con i pipe:
      <screen>ifconfig tun0 |awk '{if ($1 == "inet") print$2;}'
      </screen>
      L'output di questo comando pu&ograve; essere passato come
      argomento per uno script.come <literal>ipcheck.py</literal>
      (<filename>net/ipcheck</filename>) o qualsiasi altro.</para>
    </sect1>
    <sect1 id='lastutenti'>
      <title>Come posso sapere quali utenti hanno effettuato il
      login ultimamente?</title>
      <para>A volte pu&ograve; essere utile sapere quali utenti
      hanno effettuato il login negli ultimi tempi, soprattutto se
      offriamo servizi SSH a parecchi utenti. Il comando usato per
      avere queste informazioni &egrave; &man.last.1; che ha un
      output del tipo:
      <screen>paperoga           ttyv2                    Ven 14 Mar 21:51 - 21:33 (1+23:41)
qui                ttyp2    123.45.6.123   Ven 14 Mar 15:12 - 15:17  (00:05)
qui                ttyp1    123.45.6.123    Ven 14 Mar 15:01 - 15:08  (00:07)
qui                ttyp1    123.45.6.123    Ven 14 Mar 14:52 - 14:59  (00:07)
gastone            ttyv2                    Ven 14 Mar 14:51 - 21:51  (07:00)
archimede          ttyv1                    Gio 13 Mar 19:46   still logged in
qua                ttyv0                    Gio 13 Mar 19:46   still logged in
      </screen>
      La prima colonna da, com'&egrave; facile intuire, il
      nome dell'utente, la seconda indica il terminale al quale
      l'utente si &egrave; collegato; quindi, qualora l'utente
      abbia effettuato il login via rete, troviamo l'indirizzo IP
      del pc da cui &egrave; partita la richiesta di login; la
      quarta colonna indica la data di login e quella di logout,
      mentre tra parentesi si trova la durata della connessione.
      &man.last.1; ha moltissime opzioni, di cui la man page
      fornisce una accurata descrizione.</para>
    <sect1 id='w'>
      <title>Come posso sapere quali utenti sono connessi al
      momento?</title>
      <para>Da sempre il comando per sapere chi &egrave; connesso
      al sistema &egrave; &man.who.1; che da come output
      rispettivamente il nome dell'utente, il terminale al quale
      &egrave; collegato e la data e l'ora di login:
      <screen>qui              ttyv0    13 Mar 19:46 
quo              ttyv1    13 Mar 19:46 
quo              ttyp0    18 Mar 12:38 (:0.0)
      </screen>
      Se vogliamo avere altre informazioni riguardo agli utenti
      collegati e un minimo di statistiche riguardanti il
      sistema, si pu&ograve; usare &man.w.1;:
      <screen> 2:32pm  up 4 days, 18:53, 4 users, load averages: 0,30 0,26 0,19
USER             TTY      FROM              LOGIN@  IDLE WHAT
qui              v0       -                Gio07pm  1:00 -bash (bash)
quo              v1       -                Gio07pm 4days xinit /home/quo/.xinitrc -- -nolisten tcp
quo              p0       :0.0             12:38pm     - w
qua              p1       123.4.56.123    Ven03am  2:52 -bash (bash)
      </screen>
      &man.w.1; ci fornisce anche l'indirizzo IP della macchina
      dalla quale si &egrave; collegato l'utente, il tempo di
      inattivit&agrave; e cosa sta facendo in questo
      momento. Inoltre nella prima riga ci informa dell'ora
      corrente, dell'uptime del sistema, del numero di utenti
      collegati e infine la media del carico del sistema calcolata
      in un periodo di 1, 5, 15 minuti.</para>
    </sect1>
    <sect1 id='kldload'>
      <title>Come si caricano i moduli del kernel?</title>
      <para>Pu&ograve; accadere che, per motivi di licenza, non
      sia possibile includere staticamente il supporto per una
      periferica nel kernel, oppure, per motivi di ottimizzazione
      delle risorse, pu&ograve; essere conveniente non includere
      il supporto staticamente. Si ricorre dunque ai
      <emphasis>moduli</emphasis>, che  possono essere inseriti e
      rimossi "al volo" a seconda del bisogno. La locazione standard
      dei moduli &egrave; <filename>/boot/kernel/</filename> e la loro
      estensione &egrave; <filename>.ko</filename>.
      <warning>
        <para>: Nelle versioni di &os; precedenti alla
         5.0-RELEASE i moduli si trovano in
        <filename>/boot/kernel/</filename>.</para>
      </warning>
      &man.kldload.8;
      serve a caricare i moduli e solo <username>root</username>
      ha i permessi di esecuzione su questo comando:
      <screen>&prompt.root; <userinput>kldload msdos</userinput></screen>
      I nomi dei moduli identificano chiaramente il loro utilizzo:
      quello dell'esempio, <filename>msdos.ko</filename> fornisce
      il supporto per il filesystem FAT, usato da MS-DOS&reg; e 
      Windows&reg;.
      I moduli del kernel possono essere caricati anche all'avvio
      del sistema tramite il file
      <filename>/boot/loader.conf</filename>, le cui righe
      relative al caricamento dei moduli hanno il formato
      seguente:
      <screen>linux_load="YES"
agp_load="YES"
      </screen>
      Le righe precedenti caricano rispettivamente il modulo per
      l'esecuzione dei binari Linux e il modulo per
      l'AGP<footnote><para>Accelerated Graphics Port: porta per le
      chede grafiche.</para></footnote>.</para>
      <para>Per rimuovere i moduli caricati si usa
      &man.kldunload.8;:
      <screen>&prompt.root; <userinput>kldunload linux</userinput></screen>
      rimuove il modulo relativo alla compatibilit&agrave; dei 
      binari Linux.</para>
    </sect1>
    <sect1 id='kldstat'>
      <title>Come faccio a sapere quali moduli del kernel sono
      caricati?</title>
      <para>&man.kldstat.8; serve a conoscere quali moduli sono
      stati caricati:
      <screen>Id Refs Address    Size     Name
 1    9 0xc0100000 2b6c10   kernel
 2    1 0xc03b7000 18a88    linux.ko
 3    1 0xc03d0000 ac8c     agp.ko
 4    1 0xc03db000 149f44   nvidia.ko
 5    4 0xc16f8000 9000     netgraph.ko
 6    1 0xc1706000 3000     ng_ether.ko
 7    1 0xc170b000 5000     ng_pppoe.ko
 8    1 0xc1711000 3000     ng_socket.ko
 9    1 0xc178c000 2000     star_saver.ko
      </screen>
      Ci viene mostrato, da destra a sinistra, non solo il nome del
      modulo caricato, ma anche il suo indirizzo in memoria, la sua
      grandezza e il numero di moduli che dipendono da questo.</para>
    </sect1>
    <sect1 id='i18n'>
      <title>Come posso usare la lingua italiana nei programmi che la
      supportano?</title>
      <para>Moltissimi programmi, sia tra quelli compresi nel sistema
      base sia tra i ports, hanno il supporto per la lingua
      italiana. Tuttavia per utilizzarla &egrave; necessario mettere
      mano ad alcuni file di configurazione e aggiungere una variabile
      d'ambiente. Il file da editare &egrave
      <filename>/etc/login.conf</filename> se si desidera che ogni
      utente segua le impostazioni definite dall'amministratore di
      sistema, oppure <filename>$HOME/.login_conf</filename> qualora si
      voglia lasciare libert&agrave; di configurazione agli utenti. Nel
      primo caso il file dovr&agrave; contenere le seguenti righe:
      <screen>italian:<replaceable>paperino</replaceable>:\
        :charset=iso-8859-15:\
        :lang=it_IT.ISO8859-15:\
      </screen>
      mentre nel secondo caso bisogna cambiare la prima delle
      precedenti righe in
      <screen>me:\
      </screen>
      Fatto questo occorre esportare la variabile d'ambiente
      <screen>LANG=it_IT.ISO_8859-15
      </screen>
      da shell o mettendola nel file di configurazione della vostra
      shell.</para>
    </sect1>
    <sect1 id='whatperm'>
      <title>Cosa sono i permessi di un file?</title>
      <para>Tutti i file hanno dei permessi, come ben si pu&ograve;
      verificare analizzando l'output di
      <screen>&prompt.user; <userinput>ls -l</userinput>
total 122
-rw-r--r--  1 paperino  paperino   2015 31 Mar 21:03 debiti
-rw-r--r--  1 paperino  paperino   1513 16 Feb 17:21 sfortune
drwxr-xr-x  2 paperino  paperino    512  1 Apr 17:02 paperina
-rw-r--r--  1 paperino  paperino    325 24 Mar 12:56 debitiPDP
-rw-r--r--  1 paperino  paperino   2839  1 Apr 17:02 lettera
-rw-r--r--  1 paperino  paperino   2015 31 Mar 13:03 paperinik
-rw-r--r--  1 paperino  paperino  65058  2 Apr 15:07 Avviso
-rw-r--r--  1 paperino  paperino  22805 24 Mar 21:54 ciccio.jpg
-rw-r--r--  1 paperino  paperino    909 26 Mar 14:25 deposito.html
drwxr-xr-x  2 paperino  paperino   1536  1 Apr 17:00 quiquoqua
-rwxr--r--  1 paperino  paperino    253 20 Mar 20:55 dormire.sh
-rw-r--r--  1 paperino  paperino   4234  6 Mar 21:58 mailbox
-rw-r--r--  1 paperino  paperino   3417  3 Mar 14:27 DaFare
-rw-r--r--  1 paperino  paperino   1436 23 Mar 14:05 mailtopolino
drwxr-xr-x  8 paperino  paperino    512 10 Mar 18:12 foto_nonna
      </screen>
      Senza spiegare il significato di ogni colonna, reperibile
      comunque dalla man page di  &man.ls.1;, diciamo che la prima
      colonna &egrave; quella dei permessi, la terza identifica
      l'utente proprietario e la quarta il gruppo proprietario. La
      prima colonna contiene 10 spazi, che possono contenere
      ognuno un carattere, a loro volta suddivisi in 4 sezioni 
      rispettivamente da 1, 3, 3, 3 spazi ognuna; la prima sezione
      identifica se la entry in questione  &egrave; una directory, un link,
      un socket o un altro tipo di file, la 
      seconda i permessi del proprietario di questo file o directory,
      la terza i permessi del gruppo proprietario e la quarta i 
      permessi di tutti gli altri utenti. Ogni spazio pu&ograve; contenere
      uno solo tra i seguenti caratteri:
      <screen>d : identifica le directory e pu&ograve; stare solo nella prima sezione
l : il file in questione e' un link ad un altro file ,solo nella prima sezione
s : UNIX socket, solo nella prima sezione
r : permesso di lettura (read), si trova al primo posto della seconda,
    terza e quarta sezione
w : permesso di scrittura (write), al secondo posto di tutte le
    sezioni tranne la prima 
x : permesso di esecuzione (execution) (o di attraversamento per le
    directory), al terzo posto. 
      </screen>
       Ad esempio sul file
      <screen>-rw-r--r--  1 paperino  paperino   1513 16 Feb 17:21 sfortune
      </screen>
      hanno il permesso di lettura sia il proprietario, sia il 
      gruppo, sia tutti gli altri utenti, mentre solo il proprietario
      pu&ograve; modificarlo in quanto &egrave; l'unico ad avere il 
      permesso di scrittura.</para>
   </sect1>
   <sect1 id='camperm'>
      <title>Come cambio i permessi di un file?</title>
      <para>Il comando &man.chmod.1; serve a cambiare i permessi di
      un file. Occorre specificare al comando se vogliamo cambiare
      i permessi per il proprietario, il gruppo, o il 
      "resto del mondo", specificare se vogliamo aggiungere o togliere
      permessi e quali siano questi permessi. Per identificare 
      l'utente proprietario, il gruppo e gli altri utenti si usano
      i seguenti caratteri:
      <screen>u : proprietario
g : gruppo
o : altri utenti
      </screen>
      Se vogliamo aggiungere permessi useremo il simbolo 
      <literal>+</literal> mentre se vogliamo toglierne, il simbolo
      <literal>-</literal>. I permessi si identificano con la lettera
      che corrisponde ad ognuno di essi: <literal>r</literal> per la 
      lettura, <literal>w</literal> per la scrittura e 
      <literal>x</literal> per l'esecuzione. Per cambiare i permessi
      di un ipotetico file
      <screen>-rw-r--r--  1 paperino  paperino   1513 16 Feb 17:21 sfortune
      </screen>
      e aggiungere il permesso di scrittura anche per il gruppo
      proprietario, dovremo lanciare il seguente comando:
      <screen>&prompt.user; <userinput>chmod g+w sfortune</userinput>
      </screen> 
      oppure, per togliere il permesso di lettura a tutti gli altri
      utenti:
      <screen>&prompt.user; <userinput>chmod o-r sfortune</userinput>
      </screen>
      Vi &egrave; anche un altro sistema per cambiare i permessi,
      basato su cifre incece che su caratteri: &egrave; sempre
      presente la divisione in 4 sezioni, ma ognuna di esse pu&ograve;
      contenere solo un numero, risultato della somma dei permessi che
      si vogliono assegnare o 0 se non si vogliono assegnare permessi.
      Tralasciando la prima sezione, che assume valori particolari,
      ritrovabili nella man di &man.chmod.1;, queste sono le valenze
      di ogni permesso:
      <screen>4 : permesso in lettura
2 : permesso in scrittura
1 : permesso di esecuzione
      </screen>
      Ad esempio per ripristinare i permessi del file
<filename>sfortune</filename>, dovremo eseguire il seguente comando:
      <screen>&prompt.user; <userinput>chmod 0644 sfortune</userinput>
      </screen>
      in quanto:
      <screen>0 : prima sezione vuota
6 = 4 + 2 : permesso in lettura e scrittura per il proprietario
4 : permesso in lettura per il gruppo
4 : permesso in lettura per tutti gli utenti
      </screen>
      Un permesso in lettura, scrittura ed esecuzione avr&agrave;
      naturalmente valore 7, uno in lettura ed esecuzione valore 5 e
      cos&igrave; via.
      L'utilizzo dei permessi &egrave; un ottimo modo per aumentare
      la riservatezza personale e un'attenta politica consente di
      non correre il rischio di trovare compromessi i nostri  dati 
      importanti.</para>
   </sect1>
   <sect1 id='vidcontrol'>
      <title>Posso aumentare la risoluzione dello schermo in
      console?</title>
      <para>Ovviamente s&igrave;! In tre semplici passi, possiamo
      cambiare le dimensioni dei terminali:</para>
      <procedure>
        <step>
          <para>Ricompiliamo il kernel con le seguenti opzioni:
          <screen>options SC_PIXEL_MODE
options VGA_WIDTH90
options VESA
          </screen>
          </para>
        </step>
        <step>
          <para>Dopo aver riavviato, proviamo ad usare la nuova
          risoluzione con
          <screen>&prompt.root; <userinput>vidcontrol VESA_132x25</userinput>
          </screen>
          <literal>VESA_132x25</literal> indica la modalit&agrave;
          prescelta (colonne x righe) in questo caso. Tutti gli altri
          valori sono disponibili in &man.vidcontrol.1;
          </para>
        </step>
        <step>
          <para>Questo passo &egrave; opzionale e riguarda solo la
          modifica di <filename>/etc/rc.conf</filename> per utilizzare la
          modalit&agrave; prescelta su tutti i terminali. Il file in
          questione deve contenere la riga:
          <screen>allscreens_flags="VESA_132x25"
          </screen>
          Dal prossimo riavvio, tutti i terminali avranno la risoluzione
          specificata.
          </para>
        </step>
      </procedure>
   </sect1>
   <sect1 id='nat'>
      <title>Come configuro il mio sistema FreeBSD affinch&eacute;
      faccia da gateway tra la mia rete locale e Internet?</title>
      <para>Quasi sicuramente, uno degli utilizzi pi&ugrave; frequenti
      di FreeBSD &egrave; come sistema gateway tra due reti, solitamente
      tra un rete locale e Internet. Bastano pochi passi per impostare
      il sistema. Occorre sapere che gli indirizzi ip usati sulle reti
      locali non possono essere usati in Internet, per una questione di
      standard e tuttavia &egrave; difficile avere a disposizione un
      indirizzo IP pubblico per ogni macchina, occorre quindi effettuare
      un mascheramento degli indirizzi privati in modo che vengano visti
      come un solo indirizzo pubblico, quello del gateway; il termine
      tecnico di quest'operazione &egrave;
      <emphasis>NAT</emphasis><footnote><para>NAT: Network Addresses
      Translation (Traduzione degli indirizzi di rete). In ambiente
      Linux viene anche chiamato Masquerading IP.</para></footnote>. Ci
      sono due modi di effettuare il NAT: utilizzando l'opzione
      <literal>-nat</literal> del PPP<footnote><para>PPP: Point to
      Point Protocol.</para></footnote> di sistema oppure facendo uso del
      demone <literal>natd</literal>. Ma andiamo con ordine: prima di
      tutto occorre abilitare la trasmissione dei pacchetti da una rete
      all'altra (<emphasis>forwarding</emphasis>), inserendo la seguente
      riga nel file <filename>/etc/rc.conf</filename>:
      <screen>gateway_enable="yes"
      </screen>
      Al prossimo riavvio il forwarding sar&agrave; abilitato; tuttavia,
      se non possiamo riavviare il sistema in quanto esso offre dei
      servizi che non possono essere interrotti, possiamo cambiare il
      valore di una sysctl:
      <screen>&prompt.root; <userinput>sysctl net.inet.ip.forwarding=1</userinput>
      </screen>
      In questo modo possiamo utilizzare subito la trasmissione dei
      pacchetti tra due reti. Fatto questo possiamo scegliere se usare
      il NAT offertoci fa &man.ppp.8; oppure se usare il
      &man.natd.8;. Vediamo come agire in entrambi i casi.
      Prima di tutto per&ograve; occorre ricompilare il kernel con
      l'opzione
      <screen>options         IPDIVERT</screen>
      per abilitare il NAT, sia quello del PPP sia natd.
      <sect2 id='pppnat'>
        <title>Utilizzare il NAT di PPP</title>
        <para>Configurare la propria connessione in modo che utilizzi il
        NAT offerto da PPP &egrave; semplicissimo. Basta specificare
        l'opzione <literal>-nat</literal> quando lanciamo la connessione
        a Internet oppure inserire nel file di configurazione di PPP,
        <filename>/etc/ppp/ppp.conf</filename>, la riga
        <screen>nat enable yes
        </screen>
        Se facciamo partire la connessione all'avvio del
        sistema, &egrave; sufficiente
        aggiungere<filename>/etc/rc.conf</filename> la riga 
        <screen>ppp_nat="YES"
        </screen>
        </para>
      </sect2>
      <sect2 id='natd'>
        <title>Utilizzare &man.natd.8;</title>
        <para>Usare natd &egrave; facile quanto utilizzare il NAT del
        PPP, tuttavia di solito si preferisce quest'ultimo quando non si
        ha a che fare con pi&ugrave; reti locali. Per prima cosa apriamo
        <filename>/etc/rc.conf</filename> in un editor e aggiungiamo le
        righe:
        <screen>natd_enable="YES"
natd_interface="<replaceable>fxp0</replaceable>"
        </screen>
        <literal>fxp0</literal> indica l'interfaccia connessa ad
        Internet. Creiamo inoltre il file
        <filename>/etc/natd.conf</filename>: 
        <screen>interface <replaceable>fxp0</replaceable>
use_sockets yes
same_ports yes
        </screen>
        La prima riga indica nuovamente l'interfaccia di rete connessa ad
        Internet, mentre le altre due servono per assicurare il
        funzionamento di FTP e delle DCC<footnote><para>DCC: Direct Client
        Connection, particolari opzioni di IRC per lo scambio di file e
        altro.</para></footnote> di IRC. Dal prossimo riavvio del sistema
        il natd sar&agrave; funzionante. Ovviamente bisogna configurare
        appropriatamente anche i client della rete locale, in modo che
        usino la macchina su cui &egrave; in esecuzione natd come gateway
        principale per uscire in Internet.</para>
      </sect2>
   </sect1>
   <sect1 id='cambioprop'>
      <title>Come cambio l'utente e/o il gruppo proprietario di un
      file?</title> 
      <para>Ogni file ha un utente proprietario e un gruppo
      proprietario. Questi sono indicati rispettivamente nella terza e
      nella quarta colonna dell'output di 
      <screen>&prompt.user; <userinput>ls -l</userinput>
total 60
-rw-r--r--  1 paperino  paperino   2015 31 Mar 21:03 debiti
-rw-r--r--  1 paperino  paperino   1513 16 Feb 17:21 sfortune
drwxr-xr-x  2 paperino  paperino    512  1 Apr 17:02 paperina
-rw-r--r--  1 paperino  paperino    325 24 Mar 12:56 debitiPDP
-rw-r--r--  1 paperino  paperino   2839  1 Apr 17:02 letteraPaperina
-rw-r--r--  1 paperino  paperino   2015 31 Mar 13:03 paperinik
      </screen>
      Il comando usato per cambiare proprietario e gruppo &egrave;
      &man.chown.8, da sempre presente in &unix;. La sua sintassi &egrave;
      semplicissima: 
      <screen>&prompt.user; <userinput>chown <replaceable>gastone letteraPaperina</replaceable></userinput>
      </screen>
      per cambiare il proprietario da <username>paperino</username> a
      <username>gastone</username>, oppure
      <screen>&prompt.user; <userinput>chown :<replaceable>gastone letteraPaperina</replaceable</userinput>
      </screen>
      se vogliamo cambiare il gruppo proprietario. Ovviamente si possono
      sommare le due sintassi per cambiare contemporaneamente utente e
      gruppo proprietari:
      <screen>&prompt.user; <userinput>chown <replaceable>gastone</replaceable>:<replaceable>gastone</replaceable> letteraPaperina</userinput>
      </screen>
      Posssiamo utilizzare l'opzione <literal>-R</literal> per cambiare
      proprietario e/o gruppo a tutti i file di una directory e delle
      sue sottodirectory. 
      Piccola nota finale: per cambiare solo il gruppo si pu&ograve;
      usare anche il comando &man.chgrp.1;, che ha la seguente sintassi:
      <screen>&prompt.user; <userinput>chgrp <replaceable>gastone letteraPaperina</replaceable></userinput>
      </screen>.
      </para>
   </sect1>
   <sect1 id='ntpd'>
      <title>Come regolo l'orologio di sistema?</title>
      <para>Il sistema utilizza un orologio software che serve, oltre
      ad informare l'utente dell'ora corrente, anche per la corretta
      gestione del sistema Cron e quindi di tutto il sistema di 
      pianificazione dei processi. Tuttavia questo orologio non è
      precisissimo e dev'essere quindi sincronizzato con quello di
      alcuni server che hanno proprio questo compito specifico: tenere
      l'ora esatta. &Egrave; stato scritto un protocollo specifico per
      questo: NTP<footnote><para>NTP: Network Time
      Protocol</para></footnote> e ovviamente non poteva mancare un
      corrispondente demone: &man.ntpd.8;. Questo demone si occupa di
      collegarsi a un server da noi specificato nel file
      <filename>/etc/ntp.conf</filename> e aggiornare l'ora
      dell'orologio di sistema. Il formato del file di configurazione
      dev'essere il seguente, come specificato nella man page di
      <filename>ntp.conf</filename>:
      <screen>server <replaceable>time.ien.it</replaceable> prefer
server <replaceable>tempo.ien.it</replaceable>
driftfile <replaceable>/var/db/ntp.drift</replaceable>
      </screen>
      Vediamo di analizzarlo riga per riga: la prime due indicano i
      server NTP da usare, e quelli specificati sono quelli
      normalmente usati in Italia, gestiti dal CNR di Torino; tra
      l'altro la prima riga contiene anche la parola
      <literal>prefer</literal> per specificare il server da usare
      preferibilmente. L'ultima riga indica il file che dev'essere
      usato per indicare la frequenza delle oscillazioni dell'orologio
      di sistema, e viene aggiornato ogni volta che viene eseguito
      &man.ntpd.8;. Possiamo lanciare &man.ntpd.8; manualmente oppure
      ad ogni avvio del sistema, specificando, nel file
      <filename>/etc/rc.conf</filename>, la riga:
      <screen>xntpd_enable="YES"
      </screen>
      Bisogna notare che &man.ntpd.8; lascia dei messaggi di questo
      tipo nel syslog, facendoci sapere di quanto era sbagliato
      l'orologio di sistema:
      <screen>Apr 22 16:47:33 localhost ntpd[19103]: time reset 0.154413 s
      </screen>
      Per aggiornare l'orologio solo di tanto in tanto si pu&ograve;
      usare anche &man.ntpdate.8;, specificandogli come argomento il
      server NTP che vogliamo usare. Tuttavia bisogna evidenziare che
      &man.ntpdate.8; verr&agrave; tolto dal sistema tra un po' di
      tempo.</para>
   </sect1>
   <sect1 id='nomedevice'>
     <title>Come vengono identificati i dischi rigidi e i lettori
     cdrom in FreeBSD?</title>
     <para>FreeBSD assegna i nomi alle periferiche in maniera diversa
     da Linux o da altri sistemi &unix; e questo &egrave;
     particolarmente evidente con i dischi rigidi e i lettori di
     CD-ROM.
     <sect2 id='nomehd'>
       <title>Denominazione dei dischi rigidi sotto FreeBSD</title>
       <para>Prima di tutto bisogna fare una distinzione tra dischi
       rigidi ATA-EIDE e dischi rigidi SCSI: i primi utilizzano il
       driver &man.ad.4; mentre i secondi &man.da.4;. In linea con la
       tradizione BSD di nominare le periferiche in base al driver
       utilizzato, gli hard disk ATA-EIDE saranno identificati con
       <filename>adN</filename> con <filename>N</filename> numero
       positivo intero compreso tra 0 e 3 mentre i dischi SCSI avranno
       nome <filename>daN</filename>, con N numero positivo intero:
       <screen>/dev/ad0
/dev/ad1
/dev/da0
       </screen>
       Dopo il driver e il numero identificativo, si trovano le
       <emphasis>slice</emphasis> ovvero le suddivisioni del disco,
       che vengono chiamate "partizioni" dagli utenti di altri sistemi
       operativi. Le slice vengono identificate con
       <filename>sN</filename>, con N numero intero positivo compreso
       tra 1 e 4 per le slice primarie e tra 5 e 21 per le logiche:
       <screen>/dev/ad0s1 #prima slice primaria sul primo disco ATA/IDE
/dev/ad0s6 #seconda slice logica sul primo disco ATA/IDE
/dev/da1s4 #quarta slice primaria sul secondo disco SCSI
       </screen>
       Oltre alle slice, FreeBSD fa un ulteriore suddivisione logica
       delle slice formattate in UFS<footnote><para>Unix File System: 
       &egrave; il filesystem originario dei sistemi di derivazione 
       &unix;</para></footnote>: le <emphasis>partitions</emphasis> 
       che vengono indicate con le lettere dell'alfabeto a partire dalla
       <literal>a</literal> e fino alla
       <literal>h</literal>. Solitamente ogni partition rappresenta
       un punto di mount di un filesystem, eccezion fatta per la
       partition <literal>c</literal> che individua l'intera slice.
       &Egrave; facile capire questo guardando all'interno del file
       <filename>/etc/fstab</filename>, che contiene la tabella dei
       filesystem che possono essere montati sul sistema:
       <screen># Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad0s3b             none            swap    sw              0       0
/dev/ad0s4a             /               ufs     rw              1       1
/dev/ad0s4e             /tmp            ufs     rw              2       2
/dev/ad0s4f             /usr            ufs     rw              2       2
/dev/ad0s4d             /var            ufs     rw              2       2
/dev/acd0               /cdrom          cd9660  ro,noauto       0       0
/dev/acd1               /cdrom1         cd9660  ro,noauto       0       0
/dev/fd0                /mnt/floppy     msdos   rw,noauto       0       0
/dev/ad1s1              /archivio2      msdos   rw,noauto       0       0
/dev/ad0s1              /mnt/win        ntfs    rw,noauto       0       0
/dev/ad0s4              /archivio1      msdos   rw,noauto       0       0
/dev/ad0s3g             /oldusr         ufs     rw              2       2       
       </screen>
       Quindi, per esemplificare la cosa:
       <screen>/dev/ad0s3b #seconda partition della terza slice del primo disco ATA/IDE
/dev/ad1s4d #quarta partition della quarta slice del primo disco ATA/IDE
/dev/da1s3g #sesta partition della terza slice del secondo disco SCSI
       </screen>
       Se uno schema pu&ograve; aiutare a capire, ecco come viene
       suddiviso un disco:
  <screen>----------------------------------------------------------------
| disco ad0                                                     |
-----------------------------------------------------------------
| s1               | s2           | s3           | s4           |
|------------------|--------------|--------------|--------------|
| sliceFreeBSD     | NTFS         | Ext3 FS      | FAT32        |
|------------------|--------------|--------------|--------------|
| /| / | / | / | s |              |              |              |
|  | u | v | t | w |              |              |              |
|  | s | a | m | a |              |              |              |
|  | r | r | p | p |              |              |              |
|--|---|---|---|---|--------------|--------------|--------------|
| a| b | c | d | e |              |              |              |
----------------------------------------------------------------|
  </screen>
     </sect2>
     <sect2 id='nomecd'>
       <title>Denominazione dei lettori CDROM sotto FreeBSD</title>
       <para>Anche i lettori di CDROM usano una denominazione
       differente a seconda del driver utilizzato e, dipendendo il
       driver quasi sempre dall'interfaccia utilizzata, i nomi delle
       device che identificano i drive CDROM cominciano con
       <literal>acd</literal> per le periferiche ATAPI, e
       <literal>cd</literal> per i lettori SCSI. Dopo l'identificativo
       del driver si trova il numero progressivo di drive a partire da
       0:<screen>/dev/acd0 #primo lettore CDROM su interfaccia ATAPI
/dev/cd0 #primo lettore CDROM su SCSI
       </screen>
       Solitamente i CDROM non hanno le partitions, quindi il numero
       di identificazione è l'ultimo componente del nome del
       device.</para>
     </sect2>
   </sect1>
   <sect1 id='ufsformat'>
     <title>Come partiziono un disco per FreeBSD?</title>
     <para>
     Il partizionamento di un disco in un sistema FreeBSD &egrave; un
     processo un p&ograve; complesso se paragonato con quello relativo
     ad altri sistemi &unix; like come GNU/Linux, la
     procedura di partizionamento del disco pu&ograve; essere
     suddivisa in due parti.</para>
  <orderedlist>
   <listitem>
   <para>La prima parte &egrave; quella relativa alla suddivisione
   della nuova unit&agrave; a disco in partizioni fisiche che, come
   abbiamo visto in precedenza, prendono il nome di
   <emphasis>slice</emphasis>, una di queste partizioni o pi&ugrave;
   <emphasis>slice</emphasis> possono essere assegnate a FreeBSD.
   </para>
  </listitem>
   <listitem>
   <para>La <emphasis>slice</emphasis> che abbiamo dedicato a FreeBSD
   deve essere a sua volta suddivisa in ulteriori partizioni nelle
   quali verranno creati i relativi filesystem
   <emphasis>UFS</emphasis> oltre che alla partizione dedicata allo
   spazio per il file di <emphasis>swap</emphasis>.
   </para>
   </listitem>
   </orderedlist>
   <para>Per suddividere il disco e creare le partizioni fisiche, le
   <emphasis>slide</emphasis>, pu&ograve; essere utilizzata l'utility
   di installazione <emphasis>/stand/sysinstall</emphasis>, in
   alternativa pu&ograve; anche essere utilizzata l'utility
   &man.fdisk.8; che ci aiuter&agrave; a suddividere fisicamente il
   disco in <emphasis>slices</emphasis>. Nell'esempio sottostante
   creiamo una <emphasis>slice</emphasis> che include l'intero disco
   <screen>&prompt.root; <userinput>fdisk -i /dev/ad1</userinput>
   </screen>
   La <emphasis>slice</emphasis> &egrave; pronta a ricevere una
   <emphasis>label</emphasis>, una label BSD consente di creare sino ad
   8 partitions. Il comando <emphasis>disklabel</emphasis> ci
   aiuter&agrave; a creare le partizioni FreeBSD all'interno della 
   <emphasis>slice</emphasis>, il parametro <emphasis>auto</emphasis>
   consente di generare un layout di default per questa
   <emphasis>slice</emphasis> 
   <screen>&prompt.root; <userinput>disklabel -r -w <replaceable>ad1</replaceable> auto</userinput>
   </screen>
   Il flag <emphasis>-r</emphasis> consente di accedere al disco
   in modo diretto, il flag <emphasis>-w</emphasis> richiede anche di
   indicare il dispositivo del disco (<emphasis>ad1</emphasis> nel
   nostro caso). grazie al comando <emphasis>disklabel -e</emphasis>
   &egrave; ora possibile editare le label impostate di default,
   l'opzione <emphasis>-e</emphasis> specifica la variabile
   <emphasis>editor</emphasis> con la quale si avvia una sessione
   testuale che consentir&agrave; di editare e modificare il
   partizionamento. Dopo aver creato le partizioni possiamo finalmente
   generare il filesystem UFS utilizzando il comando
   <emphasis>newfs</emphasis> 
   <screen>&prompt.root; <userinput>newfs /dev/<replaceable>ad1s1a</replaceable></userinput>
   </screen>
   Con il comando fsck possiamo verificare che il filesystem sia
   realmente funzionante 
   <screen>&prompt.root; <userinput>fsck /dev/<replaceable>ad1s1a</replaceable></userinput>
   </screen>
   ora &egrave; possibile montare il filesystem con:
   <screen>&prompt.root; <userinput>mount /dev/<replaceable>ad1s1a /</replaceable></userinput>
   </screen>
   per abilitare lo spazio disco dedicato al file di paginazione della
   memoria (file di swap) dovremmo utilizzare il comando
   &man.swapon.8;
   <screen>&prompt.root; <userinput>swapon /dev/<replaceable>ad1s1b</replaceable></userinput>
   </screen>
   le entry contenute nel file <filename>/etc/fstab</filename>
   consentiranno di caricare automaticamente tutti i filesystems
   all'abbiamento del sistema, a questo punto riassumiamo come
   FreeBSD vede le device <emphasis>disco</emphasis>: 
   <screen>ad0    # primo disco IDE
ad0s1e # partizione "e" della slice1 del primo disco IDE 
ad1    # secondo disco IDE
ad1s1a # partizione "a" della slice1 del secondo disco IDE 
ad2    # terzo disco IDE 
ad2s1c # partizione "c" della slice1 del terzo disco IDE 
ad3    # quarto disco IDE 
ad3s1f # partizione "f" della slice1 del quarto disco IDE
   </screen>
   dopo aver analizzato come utilizzare le unit&agrave; a disco
   possiamo concludere questo paragrafo affermando che un semplice
   errore in fase di creazione di una <emphasis>slice</emphasis>
   pu&ograve; compromettere per sempre il funzionamento del Vostro
   sistema, &egrave; quindi sempre una buona idea utilizzare il
   comando &man.sysinstall.8;. 
   </para>
   </sect1>
   <sect1 id='openport'>
     <title>Come posso sapere quali porte sono aperte nel mio
     sistema?</title>
     <para>Sapere quali porte di rete siano aperte sul nostro sistema
     &egrave; fondamentale per la sicurezza del sistema stesso. Vi
     sono diversi modi per identrificare le porte aperte e le
     eventuali connessioni ad esse ed il primo e pi&ugrave; conosciuto
     di questi &egrave;:
     <screen>&prompt.root; <userinput>netstat -an -f inet</userinput>
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
tcp4       0      0  12.123.45.67.50033    195.22.198.15.80       ESTABLISHED
tcp4       0      0  12.123.45.67.50018    195.22.198.15.80       ESTABLISHED
tcp4       0      0  192.168.0.1.65232      217.220.29.16.6667     ESTABLISHED
tcp4       0      0  192.168.0.1.65231      213.92.8.4.6667        ESTABLISHED
tcp4       0      0  192.168.0.1.139        *.*                    LISTEN
tcp4       0      0  127.0.0.1.3493         127.0.0.1.49154        ESTABLISHED
tcp4       0      0  127.0.0.1.49154        127.0.0.1.3493         ESTABLISHED
tcp4       0      0  127.0.0.1.3493         127.0.0.1.49153        ESTABLISHED
tcp4       0      0  127.0.0.1.49153        127.0.0.1.3493         ESTABLISHED
tcp4       0      0  *.3493                 *.*                    LISTEN
tcp46      0      0  *.80                   *.*                    LISTEN
tcp4       0      0  *.25                   *.*                    LISTEN
tcp4       0      0  *.22                   *.*                    LISTEN
tcp6       0      0  *.22                   *.*                    LISTEN
tcp4       0      0  *.515                  *.*                    LISTEN
tcp6       0      0  *.515                  *.*                    LISTEN
tcp4       0      0  127.0.0.1.53           *.*                    LISTEN
tcp4       0      0  192.168.0.1.53         *.*                    LISTEN
udp4       0      0  192.168.0.1.138        *.*                    
udp4       0      0  192.168.0.1.137        *.*                    
udp4       0      0  *.138                  *.*                    
udp4       0      0  *.137                  *.*                    
udp4       0      0  *.3493                 *.*                    
udp4       0      0  127.0.0.1.123          *.*                    
udp4       0      0  192.168.0.1.123        *.*                    
udp4       0      0  *.123                  *.*                    
udp4       0      0  *.49152                *.*                    
udp4       0      0  127.0.0.1.53           *.*                    
udp4       0      0  192.168.0.1.53         *.*                    
udp4       0      0  *.514                  *.*
     </screen>
     L'output di <literal>netstat</literal> pu&ograve; sembrare un
     po' oscuro a prima vista: dopo l'identificazione del protocollo
     si trovano il numero dei pacchetti nelle code di ricezione e di
     invio, quindi l'indirizzo locale, composto da 4 campi per
     l'indirizzo IP e un quinto per la porta utlizzata. Un eventuale
     <literal>*</literal> (asterisco) in sostituzione dell'indirizzo
     IP evidenzia che la porta è attiva in ogni indirizzo locale. La
     quinta colonna indica l'host remoto e la porta dell'host remoto
     qualora ci sia una connessione, oppure <literal>*.*</literal> in
     caso la porta sia in ascolto e in attesa di una connessione.
     L'ultima colonna mostra lo stato della connessione:
     <literal>ESTABLISHED</literal> se &egrave; attiva e pronta a
     trasmettere e/o ricevere, <literal>LISTEN</literal> se il sistema
     &egrave; in attesa di una connessione su quella porta. Ci sono
     altri stati possibili e la consultazione della man page di
     &man.netstat.1; pu&ograve; chiarire tutti i dubbi. L'output di
     <literal>netstat</literal> è utile per sapere le connessioni attive,
     tuttavia se vogliamo chiuderne una e impedire che vengano
     effettuate altre connessione da/a quella porta occorre sapere
     almeno quali applicazioni e/o servizi utilizzano quella porta e
     il modo pi&ugrave; veloce per venirne a conoscenza &egrave;
     l'analisi del file <filename>/etc/services</filename>:
     <screen>&prompt.root; <userinput>cat /etc/services | grep <replaceable>3493</replaceable></userinput>
nut             3493/tcp   #Network UPS Tools
nut             3493/udp   #Network UPS Tools
     </screen>
     Un altro tool molto utile per conoscere le porte che stiamo
     utilizzando in questo momento &egrave;
     <literal>sockstat</literal>, che ci fornisce anche utente, comando e
     processo di ogni connessione e di ogni porta in ascolto:
     <screen>&prompt.root; <userinput>sockstat -46</userinput>
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS      
bind     named      59998 3  udp4   *:58314               *:*
paperino evolution- 59406 26 tcp4   12.123.45.67:51970    216.136.204.117:80
paperino evolution- 59406 27 tcp4   12.123.45.67:51971    63.236.73.26:80
paperino evolution- 59406 28 tcp4   12.123.45.67:51972    204.152.186.46:80
paperino ssh        56858 3  tcp4   12.123.45.67:50565    212.171.15.152:22
paperino irssi      14717 3  tcp4   192.168.0.1:65232     217.220.29.16:6667
paperino irssi      14717 5  tcp4   192.168.0.1:65231     213.92.8.4:6667
www      httpd      56922 3  tcp46  *:80                  *:*
www      httpd      56921 3  tcp46  *:80                  *:*
www      httpd      56920 3  tcp46  *:80                  *:*
www      httpd      5115  3  tcp46  *:80                  *:*
www      httpd      791   3  tcp46  *:80                  *:*
root     nmbd       639   8  udp4   *:137                 *:*
root     nmbd       639   9  udp4   *:138                 *:*
root     nmbd       639   10 udp4   192.168.0.1:137       *:*
root     nmbd       639   11 udp4   192.168.0.1:138       *:*
root     smbd       637   9  tcp4   192.168.0.1:139       *:*
root     upslog     631   3  tcp4   127.0.0.1:49154       127.0.0.1:3493
uucp     upsmon     630   3  tcp4   127.0.0.1:49153       127.0.0.1:3493
uucp     upsd       626   3  udp4   *:3493                *:*
uucp     upsd       626   4  tcp4   *:3493                *:*
uucp     upsd       626   8  tcp4   127.0.0.1:3493        127.0.0.1:49153
uucp     upsd       626   9  tcp4   127.0.0.1:3493        127.0.0.1:49154
     </screen>
     I titoli sopra le colonne spiegano chiaramente i dati di ognuna.
     Tuttavia l'analisi non &egrave; ancora completa, in quanto
     sappiamo che porte sono aperte e quali sono in attesa di una
     connessione, per&ograve; alcune potrebbero essere filtrate o
     chiuse da un firewall e quindi diventa importante sapere quali
     porte siano effettivamente raggiungibili dall'esterno.Un ottimo
     tool e probabilmente anche il più diffuso per conoscere eventuali
     "falle" &egrave; <filename>security/nmap</filename>, uno scanner
     che interroga tutte le porte dell'IP specificato e informa su
     quali siano aperte, filtrate o chiuse. Ovviamente &egrave;
     necessario eseguire <literal>nmap</literal> da una macchina posizionata su una
     rete esterna rispetto al sistema che vogliamo testare. Ad
     esempio, per fare una scansione di <hostid>target</hostid> da
     <hostid>base</hostid>:
     <screen>base&prompt.root; <userinput>nmap -sS -O <replaceable>target</replaceable></userinput>
Starting nmap 3.27 ( www.insecure.org/nmap/ ) at 2003-06-17 13:03 CEST
 Insufficient responses for TCP sequencing (3), OS detection may be less accurate
Interesting ports on target (12.34.56.78):
(The 1619 ports scanned but not shown below are in state: closed)
Port       State       Service
22/tcp     open        ssh
25/tcp     open        smtp
53/tcp     open        domain
80/tcp     open        http
Remote OS guesses: Mac OS X 10.1.4 (Darwin Kernel 5.4) on iMac, Mac OS X 10.1.5, FreeBSD 4.3 - 4.4PRERELEASE, FreeBSD 5.0-CURRENT (Jan 2003), FreeBSD 5.0-RELEASE (x86)
Uptime 13.967 days (since Tue Jun  3 13:51:42 2003)

Nmap run completed -- 1 IP address (1 host up) scanned in 16.704 seconds
     </screen>
     <literal>nmap</literal> fornisce la porta e il protocollo, lo
     stato della porta stessa e il servizio che è attivo su quella
     porta. Inoltre cerca di individuare il sistema operativo che gira
     su <hostid>target</hostid>.
     Ovviamente l'essere a conoscenza delle porte aperte &egrave; solo
     un primo passo verso la sicurezza di un sistema.</para> 
  </sect1>
  <sect1 id='apmacpi'>
     <title>Che differenza c'&egrave; tra APM e ACPI ?</title>
     <para>Sia APM<footnote><para>Advanced Power Management (Gestione
     avanzata del consumo): strumento
     per monitorare il consumo di energia di un sistema basandosi
     sull'attivit&agrave; dello stesso.</para></footnote> sia
     ACPI<footnote><para>Advanced Configuration and Power Interface
     (Interfaccia Avanzata per la Configurazione e il Consumo): standard
     scritto da un insieme di produttori di hardware per fornire
     un'interfaccia standard per gestire le risorse hardware e la gestione
     del consumo.</para></footnote> servono per monitorare le risorse
     della macchina in fatto di energia disponibile e consumo della
     stessa. Fino alla versione 4.x di &os; veniva forntio il supporto
     solo per apm, mentre tra le novit&agrave della versione 5.x c'è
     ACPI, seppure al momento attuale (&release.current;) non sia
     prefetto, anche a causa dei produttori hardware che non seguono
     correttamente lo standard.</para>
  </sect1>
  <sect1 id='apm5'>
     <title>Come attivo APM su una 5.x ?</title>
     <para>Di default le release di &os; superiori alla 5.0 hanno
     &man.acpi.4; attivo di default, ma ci sono alcuni sistemi
     pi&ugrave; vecchi che non supportano questo standard e devono
     utilizzare &man.apm.4;. Per utilizzarlo &egrave; necessario
     inserire le seguenti righe nel nostro file di configurazione del
     kernel:
     <screen>device       pmtimer
device       apm
     </screen>
     Mentre il nostro nuovo kernel viene compilato, editiamo
     <filename>/etc/rc.conf</filename>, aggiungendo le opzioni
     <screen>apm_enable="YES"
apmd_enable="YES"
     </screen>
     L'ultima operazione da compiere prima di riavviare &egrave;
     disabilitare &man.acpi.4; come spiegato alla domanda "Come
     disattivo ACPI ?" (<xref linkend='disab-acpi'>).</para>
  </sect1>
  <sect1 id='disab-acpi'>
    <title>Come disattivo ACPI ?</title>
    <para>A causa dell'importante ruolo che riveste nella gestione del
    sistema, ACPI pu&ograve; essere disabilitato solo a boot time. Per
    far ci&ograve; effettuiamo un normale avvio del sistema, 
    effettuiamo il login come root e aggiungiamo la seguente riga al
    file <filename>/boot/loader.conf</filename>:
    <screen>hint.acpi.0.disabled="1"
    </screen>
    Al prossimo reboot, &man.acpi.4; non entrer&agrave; in funzione.
    A partire dalla 5.1-RELEASE &egrave; presente un menu di start,
    che viene mostrato prima di effettuare il boot: possiamo scegliere
    che ACPI non sia avviato anche da qui, solitamente selezionando
    l'opzione 2.</para>
  </sect1>
  <sect1 id='tunefs'>
    <title>Come posso utilizzare tutto lo spazio possibile della
    partizione?</title>
    <para>Analizzando l'output di
    <screen>&prompt.user; <userinput>df</userinput>
Filesystem  1K-blocks     Used    Avail Capacity  Mounted on
/dev/ad0s4a    257838    93228   143984    39%    /
devfs               1        1        0   100%    /dev
/dev/ad0s4e    257838    67010   170202    28%    /tmp
/dev/ad0s4f   9541210  4636766  4141148    53%    /usr
/dev/ad0s4d    257838    99172   138040    42%    /var
/dev/ad0s3g   9172610  6273632  2165170    74%    /oldusr
/dev/ad1s1   39076608 27335488 11741120    70%    /data
    </screen>
    si pu&ograve; notare che la somma tra i blocchi usati e quelli
    disponibili non &egrave; uguale al numero di blocchi
    totali. Infatti 93228 + 143984 = 237212 e non 257838: ci sono
    20626 blocchi di differenza, pari all'8% di spazio non
    usato. Questo spazio in pi&ugrave; serve al sistema per impedire
    un effettivo riempimento totale del filesystem. Si può ridurre
    questo margine utilizzando il comando &man.tunefs.8; :
    <screen>&prompt.root; <userinput>tunefs -m<replaceable>5
    </replaceable></userinput>
    </screen>
    &man.tunefs.8; &egrave; l'utility principale per modificare le
    impostazioni di un certo filesystem.</para>
  </sect1>
  <sect1 id='passwd'>
    <title>Ho perso il file <filename>/etc/master.passwd</filename>,
    come lo ricreo?</title> 
    <para>Pu&ograve; capitare anche ad un esperto sysadmin di
    cancellare per errore il file delle password di sistema. Non
    c'&egrave; nessun problema, in quanto ricrearlo &egrave; molto
    semplice:
    <screen>&prompt.root; <userinput>pwd_mkdb /etc/master.passwd</userinput>
    </screen>
    &man.pwd.mkdb.8; ricrea il file in questione e altri 2 piccoli
    database contenenti le stesse informazioni
    <filename>/etc/spwd.db</filename> e
    <filename>/etc/pwd.db</filename> .</para>
  </sect1>
  <sect1 id='colourls'>
    <title>Perch&eacute; non riesco ad avere l'output di &man.ls.1; a
    colori?</title>
    <para>Molti utenti provenienti da GNU/Linux, cercano di ottenere
    l'output di &man.ls.1; a colori passando l'opzione
    <literal>--colour</literal> a <command>ls</command> stesso.
    In &os; invece l'opzione corretta &egrave;
    <literal>-G</literal>.</para>
  </sect1>
  <sect1 id='swapinfo'>
    <title>Come posso sapere quanta memoria di swap sto
    usando?</title>
    <para>La risposta &egrave; breve: &man.swapinfo.8;. Tuttavia anche
    &man.top.1; nella quarta riga del suo output, fornisce
    informazioni riguardanti l'utilizzo della partizione di swap. Per
    ottenere solo questa riga possiamo reindirizzare l'output di
    &man.top.1; come in
    <screen>&prompt.root; <userinput>top | grep Swap</userinput>
    </screen>
  </sect1>
  <sect1 id='dmesg-boot'>
    <title>Come posso rivedere il messaggi di probe delle device al
    boot?</title>
    <para>L'output completo che appare sulla console all'avvio del
    sistema &egrave; recuperabile in ogni momento nel file
    <filename>/var/log/dmesg.boot</filename>. Anche &man.dmesg.8;
    contiene i messaggi del boot, almeno finch&eacute; essi non
    vengono sostituiti da altri messaggi (infatti &man.dmesg.8;
    prendere le sue informazioni da un buffer).</para>
  </sect1>
  <sect1 id='mountiso'> 
    <title>Come posso montare un immagine ISO?</title>
    <para>Pu&ograve; capitare la situazione di voler montare
    un'immagine ISO per accedere ai dati in essa contenuti senza
    scrivere un CD, oppure per verificare la sua integrit&agrave;
    Innanzi tutto bisogna creare un Memory Disk, tramite il comando
    &man.mdconfig.8;:
    <screen>&prompt.root; <userinput>mdconfig -a -t vnode -f <replaceable>image.iso</replaceable> -u 0;</userinput>
    </screen>
    Questo comando creer&agrave; un nuovo device:
    <filename>/dev/md<replaceable>N</replaceable></filename>, che
    pu&ograve; essere montato con un normale
    <screen>&prompt.root; <userinput>mount -t cd9660 /dev/md<replaceable>0 /mountpoint</replaceable></userinput>
    </screen>
    Per eliminare il Memory Disk, si usano, dopo aver smontato
    l'immagine, le opzioni <literal>-d -u</literal> di
    &man.mdconfig.8;:
    <screen>&prompt.root; <userinput>mdconfig -d -u <replaceable>0</replaceable></userinput>
    </screen>
    </para>
  </sect1>
  <sect1 id='boot0cfg'>
    <title>Mi si è rovinato l'MBR, come posso reinstallarlo?</title>
    <para>Pu&ograve; capitare che il Master Boot Record del nostro
    disco venga sovrascritto da un sistema operativo possessivo,
    dall'installazione mal riuscita di un altro OS o da altri
    fattori. Ripristinarlo &egrave; molto semplice: bootiamo il
    sistema con un live cd come <ulink
    URL='http://www.freesbie.org'>FreeSBIE</ulink> oppure con il cd 2
    della nostra -RELEASE, e lanciamo il comando
    <screen>&prompt.root; <userinput>boot0cfg -B /dev/<replaceable>ad0</replaceable></userinput>
    </screen>
    La man page di &man.boot0cfg.8; fornisce moltissime informazioni
    riguardo le opzioni che possono essere passate a questo
    comando.</para>
  </sect1>
  <sect1 id='toor'>
    <title>Chi &egrave; l'utente <username>toor</username>?</title>
    <para><username>toor</username> svolge le funzioni di "superuser di
    comodo" su un sistema FreeBSD. L'utente <username>toor</username>
    ha infatti tutti i privilegi di <username>root</username>, ma non
    &egrave; fondamentale per la sopravvivenza del sistema ed &egrave;
    quindi pi&ugrave; atto ad essere configurabile secondo le preferenze
    dell'amministratore di sistema. Ad esempio, si potrebbe volere
    utilizzare la shell Bash invece della tcsh per amministrare il
    sistema: non essendo Bash inclusa di default in un sistema FreeBSD,
    non &egrave; opportuno sceglierla come shell di
    <username>root</username>, in quanto in caso di corruzione del
    filesystem <filename>/usr</filename>, si sarebbe impossibilitati (o
    quasi) ad effettuare il login come root senza essere fisicamente
    presenti alla console. &Egrave; quindi preferibile impostare la
    shell di <username>toor</username> a
    <filename>/usr/local/bin/bash</filename>, non quella di
    <username>root</username>. Ovviamente questo &egrave; solo un
    esempio dell'utilit&agrave; di <username>toor</username>.</para> 
  </sect1>
  <sect1 id='wheel'>
    <title>Non riesco a diventare <username>root</username> utilizzando
    &man.su.1;. Come posso fare?</title>
    <para>Per acquisire i privilegi di superuser &egrave; necessario
    che l'utente sia membro del gruppo
    <username>wheel</username> (gid 0). <username>root</username> dovr&agrave;
    dunque editare <filename>/etc/groups</filename>, aggiungendo gli
    utenti al gruppo <username>wheel</username>.</para>
  </sect1>
  <sect1 id='motd'>
    <title>Posso cambiare il messaggio che viene mostrato ad ogni
    login?</title>
    <para>Quel messaggio viene chiamato <literal>motd</literal> ossia
    Message of The Day. Per cambiare il testo visualizzato &egrave;
    sufficiente editare a piacimento il file
    <filename>/etc/motd</filename>.</para>
  </sect1>
  <sect1 id='inst-port'>
    <title>Come installo le applicazioni? Cos'&egrave; un
    <literal>port</literal>? Cos'&egrave; un <literal>package</literal>?</title>
    <para>Molta gente non usa un sistema operativo, ma usa
    <emphasis>applicazioni</emphasis>. &Egrave; quindi fondamentale
    che un sistema operativo ben fatto consenta all'utente di
    installare, rimuovere, aggiornare, configurare facilmente i
    programmi che preferisce. &os; ha un sistema di gestione pacchetti
    molto efficiente, denominato <emphasis>ports</emphasis>. Il
    sistema dei ports &egrave; costituito da un albero di directory
    che comincia in <filename>/usr/ports</filename> contententi
    <filename>Makefile</filename>: il software &egrave; suddiviso in
    diverse categorie a seconda della tipologia: audio, editors, net,
    security, x11, www...</para>
    <para>Installare un port &egrave; molto semplice: innanzi tutti
    &egrave; necessario individuare in quale directory si trovi il
    port. Per fare questo spostiamoci in
    <filename>/usr/ports/</filename> ed eseguiamo la ricerca nel
    seguente modo:
    <screen>&prompt.root; <userinput>make search name=<replaceable>wmnd</replaceable></userinput>
Port:   wmnd-0.4.7        <co id='port'>
Path:   /usr/ports/net/wmnd        <co id='path'>
Info:   Improved network monitoring dock app (with tons of features)        <co id='info'>
Maint:  flag@gufi.org        <co id='maint'>
Index:  net <co id='sect'>
B-deps: XFree86-libraries-4.3.0_6 expat-1.95.6_1 fontconfig-2.2.90_3
freetype2-2.1.5_1 gettext-0.12.1 gmake-3.80_1 imake-4.3.0_1
libiconv-1.9.1_3 perl-5.6.1_15 pkgconfig-0.15.0        <co id='bdeps'>

R-deps: XFree86-libraries-4.3.0_6 expat-1.95.6_1 fontconfig-2.2.90_3
freetype2-2.1.5_1 imake-4.3.0_1 perl-5.6.1_15 pkgconfig-0.15.0        <co id='rdeps'> 
    </screen>
    Questo comando esegue la ricerca di <literal>wmnd</literal> tra i
    nomi di tutti i ports, e se trova risultati, li mostra
    indicandone:
    <calloutlist>
      <callout arearefs='port'>
        <para>Nome e versione del software</para>
      </callout>
      <callout arearefs='path'>
        <para>Percorso completo della directory del port</para>
      </callout>
      <callout arearefs='info'>
        <para>Una brevissima descrizione del software</para>
      </callout>
      <callout arearefs='maint'>
        <para>L'indirizzo email del maintainer del port, ossia del
        responsabile del port, al quale vanno segnalati bug,
        aggiornamenti, patches, ecc.</para>
      </callout>
      <callout arearefs='sect'>
        <para>Le categorie di cui fa parte questo software</para>
      </callout>
      <callout arearefs='bdeps'>
        <para>I pacchetti necessari alla compilazione di questo
        software (pi&ugrave; oltre si vedr&agrave; esattamente cosa
        significa ci&ograve;).</para>
      </callout>
      <callout arearefs='rdeps'>
        <para>I pacchetti necessari al corretto funzionamento di
        questo software.</para>
      </callout>
   </calloutlist>
   &Egrave; possibile sostituire la parola <literal>key</literal> a
   <literal>name</literal> per allargare la ricerca a tutti i campi e
   non solo al nome.</para>
   <para>Entriamo quindi nella directory del port indicata dal campo
   <literal>Path:</literal> ed esaminiamo il suo contenuto:
   <screen>&prompt.root; <userinput>cd /usr/ports/<replaceable>net/wmnd</replaceable></userinput>
&prompt.root; <userinput>ls</userinput>
Makefile        README.html     distinfo
pkg-descr       pkg-message     pkg-plist
   </screen>
   <filename>Makefile</filename> contiene le istruzioni per la
   compilazione e l'installazione del
   port. <filename>README.html</filename> e
   <filename>pkg-descr</filename> contengono una descrizione del port
   in una decina di righe. <filename>pkg-message</filename> &egrave;
   un messaggio per l'utente che viene visualizzato una volta
   completata l'installazione. L'impronta md5 del pacchetto sorgente
   &egrave; contenuta nel file <filename>distinfo</filename>.</para>
   <para>L'installazione avviene con un semplice comando:
   <screen>&prompt.root; <userinput>make install clean distclean</userinput>
   </screen>
   Ora saranno scaricati i sorgenti del programma, che verranno
   patchati se necessario, compilati ed installati. Quindi
   verr&agrave; rimossa la directory di lavoro
   <filename>./work</filename> e il pacchetto dei sorgenti che era
   posto in <filename>/usr/ports/distfiles/</filename>.</para>
   <para>&Egrave; molto importante che tutte le applicazioni vengano
   installate attraverso i ports, perch&eacute; solo cos&igrave; si
   potr&agrave; garantire un perfetto funzionamento delle
   applicazioni stesse.</para>
   <para>I <emphasis>packages</emphasis> non sono altro che ports
   gi&agrave; compilati dal cluster di FreeBSD.org. Sono utili in caso
   si voglia risparmiare il tempo di compilazione, quindi specialmente
   per le macchine pi&ugrave; lente e/o i pacchetti pi&ugrave; grossi
   (OpenOffice, KDE, Gnome). Per installare un package si agisce in
   questo modo:
   <screen>&prompt.root; <userinput>pkg_add -r <replaceable>wmnd</replaceable></userinput> 
   </screen>
   Il pacchetto precompilato verr&agrave; scaricato ed installato.
   Se si ha gi&agrave; il pacchetto disponibile sul proprio computer
   &egrave; sufficiente
   <screen>&prompt.root; <userinput>pkg_add <replaceable>pacchetto</replaceable></userinput>
   </screen>
   </para>
  </sect1>
  <sect1 id='rem-port'>
    <title>Come rimuovo un port o un package?</title>
    <para>Per rimuovere un'applicazione installata sul nostro sistema
    si usa &man.pkg.delete.1;; seguito dal nome del pacchetto. Il nome
    dev'essere composto nella forma <literal>nome-versione</literal>,
    ottenibile eseguendo &man.pkg.info.1; e mandando l'output a
    &man.grep.1;:
    <screen>&prompt.root; <userinput>pkg_info | grep <replaceable>wmnd</replaceable></userinput>
wmnd-0.4.7          Improved network monitoring dock app (with tons of features
&prompt.root; <userinput>pkg_delete <replaceable>wmnd-0.4.7</replaceable></userinput>
    </screen>
    Il pacchetto <literal>wmnd</literal> sar&agrave; completamente
    rimosso dal nostro sistema.</para> 
  </sect1>
  <sect1 id='update-port'>
    <title>Come aggiorno i ports/packages installati?</title>
    <para>Non &egrave; affatto utile mantenere vecchie versioni di
    programmi, in quanto solitamente le nuove contengono molti
    bugfixes. Per aggiornare i pacchetti installati, bisogna prima di
    tutto eseguire l'update dell'albero dei ports come spiegato in
    "Come posso aggiornare il sistema?" (<xref linkend='cvsup'>). 
    Fatto ci&ograve; si aprono due strade: possiamo utilizzare le
    utilit&agrave; incluse nel sistema, oppure installare
    <filename>sysutils/portupgrade</filename>. Scelta una di queste
    due vie, bisogna capire quali pacchetti sono da aggiornare. Nel
    sistema base &egrave; compreso il programma &man.pkg.version.1;
    mentre la suite <application>portupgrade</application> comprende
    anche un comando <application>portversion</application>. Per
    conoscere quali pacchetti aggiornare si usa
    <screen>&prompt.root; <userinput>pkg_version |grep \</userinput>
    </screen>
    oppure
    <screen>&prompt.root; <userinput>portversion -l "<"</userinput>
    </screen>
    Ora che sappiamo quali pacchetti aggiornare, vediamo come procedere
    all'aggiornamento in entrambi i modi, con
    <application>portupgrade</application> e con le utilit&agrave; del
    sistema base.</para>
    <sect2 id='portupgrade'>
      <title>Aggiornare i ports con
      <filename>portupgrade</filename></title>
      <para>Per aggiornare un singolo pacchetto con
      <application>portupgrade</application>, &egrave; sufficiente un
      <screen>&prompt.root; <userinput>portupgrade <replaceable>wmnd</replaceable></userinput>
      </screen>
      Il port in questione verr&agrave; scaricato, compilato, ed
      installato. In caso di errore in una qualsiasi di queste fasi,
      <application>portupgrade</application> ripristiner&agrave; la
      versione precedente di cui aveva fatto un backup.
      &Egrave; possibile istruire
      <application>portupgrade</application> ad usate i packages
      specificando le opzioni <literal>-PP</literal>  o
      <literal>-P</literal>. La differenza tra le due &egrave; che
      <literal>-PP</literal> utilizza <emphasis>solo</emphasis> i
      packages, mentre <literal>-P</literal> ricorre ai packages solo
      se &egrave; possibile, ossia solo se il package viene trovato in
      locale o sul repository remoto.</para>
      <para><application>portupgrade</application> basa il suo
      funzionamento sul database dei package
      <filename>/var/db/pkg</filename>, e per evitare inconsistenze
      nel database stesso, &egrave; utile sistemarlo prima di
      utilizzare
      <application>portupgrade</application>. Quest'operazione si
      esegue nel seguente modo:
      <screen>&prompt.root; <userinput>pkgdb -F</userinput>
      </screen>
      Pu&ograve; risultare utile per il buon funzionamento di
      <application>portupgrade</application> anche mantenere
      aggiornato il database dei ports con
      <screen>&prompt.root; <userinput>portsdb -uU</userinput>
      </screen>
      Questo comando creer&agrave; il file
      <filename>/usr/ports/INDEX.db</filename>, utilizzato da alcuni
      programmi forniti con <application>portupgrade</application>.</para>
      <para>Si pu&ograve; ordinare a
      <application>portupgrade</application> di passare uno o
      pi&ugrave; argomenti a &man.make.1;, se stiamo utilizzando i
      ports, tramite l'opzione <literal>-m</literal>, come in
      <screen>&prompt.root; <userinput>portupgrade <replaceable>mplayer*</replaceable> -m <replaceable>WITH_GUI=yes</replaceable></userinput> 
      </screen>
      Molte altre opzioni, come <literal>-a</literal> per aggiornare
      tutti i pacchetti e <literal>-r</literal> per aggiornare i
      pacchetti che dipendono da quello specificato, sono disponibile
      nella man page di <application>portupgrade</application>.</para>
    </sect2>
    <sect2 id='pkg-up'>
      <title>Aggiornare i ports con le utility
      <filename>pkg_*</filename></title> 
      <para>Il secondo modo per aggiornare i pacchetti &egrave; molto
      facile: si rimuove il pacchetto in questione e tutti i pacchetti
      da cui questo dipende e che da questo dipende e lo si
      reinstalla. Pu&ograve; non sembrare uan cosa sensata, eppure non
      ci si pu&ograve; fidare completamente di
      <application>portupgrade</application>, in quanto, seppur la
      situazione sia molto migliorata rispetto al passato, si
      verificano ancora alcuni casi di errore da parte di questa
      applicazione.</para>
    </sect2> 
  </sect1>
</chapter>
