Chapter 28. Servizi di rete

Table of Contents

28.1. Il Network File System (NFS)
28.1.1. Esempio di messa a punto di NFS
28.1.2. Messa appunto dell'automontaggio di NFS per /net con amd(8)
28.2. Il Network Time Protocol (NTP)

28.1. Il Network File System (NFS)

Ora che la rete è funzionante è possibile condividere file e directory attraverso la rete utilizzando il Network File System (NFS). Dal punto di vista della condivisione, il computer che dà accesso ai suoi file e directory è chiamato server, e il computer che utilizza questi file e directory è il client. Un computer può essere client e server allo stesso tempo.

  • Un kernel deve essere compilato con le opzioni appropriate per il client e il server (le opzioni sono semplici da trovare nel file di configurazione del kernel. Vedere Section 23.1, “A walk through the kernel configuration” per maggiori informazioni sulle opzioni del kernel correlate ad NFS.

  • Il server deve abilitare i demoni rpcbind, mountd lockd statd e nfs_server in /etc/rc.conf:

    rpcbind=yes
    mountd=yes
    nfs_server=yes
    lockd=yes
    statd=yes
  • Il client deve abilitare i demoni rpcbind, lockd statd e nfs_client in /etc/rc.conf:

    rpcbind=yes
    nfs_client=yes
    lockd=yes
    statd=yes
  • Il server deve elencare le directory esportate in /etc/exports quindi eseguire il comando kill -HUP `cat /var/run/mountd.pid (hup mountd può funzionare pure!).

Un host client può accedere a una directory remota attraversoA clien NFS se:

  • L'host server esporta la directory sul client. L'elenco dei filesystem che un server NFS esporta può essere controllato con il comando showmount -e, vedere showmount(8):

    # showmount -e 192.168.1.2
    Exports list on 192.168.1.2:
    /home                              host1 host2 host3
  • L'host client monta la directory remota con il comando mount 192.168.1.2:/home /home

Il comando mount a una ricca gamma di opzioni per le directory remote, le quali non sono molto intuitive (come minimo).

28.1.1. Esempio di messa a punto di NFS

Lo scenario qui descritto è il seguente: cinque macchine client (cli1, ..., cli5) condividono qualche directory sul server (buzz.toys.org). Alcune directory esportate dal server sono riservate per un client specifico, le altre sono comuni per tutte le macchine client. Tutti i client si avviano dal server e devono montare le directory.

Le directory esportate dal server sono:

/export/cli?/root

le cinque directory radice per le cinque macchine client. Ogni client ha la sua directory radice.

/export/cli?/swap

Cinque directory di scambio per le cinque macchine di scambio.

/export/common/usr

la directory /usr; comune per tutti gli host client.

/usr/src

Directory /usr/src comune per tutte le macchine client.

I seguenti filesystem esistono sul server

/dev/ra0a on /
/dev/ra0f on /usr
/dev/ra1a on /usr/src
/dev/ra2a on /export

Ogni client necessita dei seguenti file system

buzz:/export/cli?/root   on /
buzz:/export/common/usr  on /usr
buzz:/usr/src            on /usr/src

La configurazione del server è la seguente:

# /etc/exports
/usr/src  -network 192.168.1.0 -mask 255.255.255.0
/export   -alldirs -maproot=root -network 192.168.1.0 -mask 255.255.255.0

Nelle macchine client /etc/fstab contiene:

buzz:/export/cliX/root  /        nfs rw
buzz:/export/common/usr /usr     nfs ro,nodev,nosuid
buzz:/usr/src           /usr/src nfs rw,nodev,nosuid

Ogni macchina client ha il suo numero sostituito dal carattere “X” nella prima riga dell'esempio precedente.

28.1.2.  Messa appunto dell'automontaggio di NFS per /net con amd(8)

28.1.2.1. Introduzione

Il problema col mount di NFS (e altri) è che generalmente bisogna essere root per farlo, cosa che può essere piuttosto sconveniente per gli utenti. Utilizzando amd(8) è possibile mettere a punto una certa directory (Comunemente /net), sotto la quale è possibile effettuare ogni NFS-mount come utente normale, finchè il filesystem da accedere è effettivamente esportato dal server NFS.

Per controllare se un certo server esporta un filesystem, e quale, usare il comando showmont con lo switch -e (export).

$ showmount -e wuarchive.wustl.edu
Exports list on wuarchive.wustl.edu:
/export/home                       onc.wustl.edu
/export/local                      onc.wustl.edu
/export/adm/log                    onc.wustl.edu
/usr                               onc.wustl.edu
/                                  onc.wustl.edu
/archive                           Everyone

Se si vuole quindi montare una directory per accedere ad ogni cosa al suo interno (per esempio /archive/systems/unix/NetBSD), basta andare in quella directory:

$ cd /net/wuarchive.wustl.edu/archive/systems/unix/NetBSD

Il filesystem verrà montato (da amd), e si potrà accedere ad ogni file semplicemente come se la directory fosse montata dal superutente sul sistema locale.

28.1.2.2. Messa a punto

Si può mettere a punto directory del tipo di /net con i seguenti passi (inclusa la configurazione di base per amd):

  1. in /etc/rc.conf, impostare le seguenti variabili:

    amd=yes
  2. mkdir /amd

  3. mkdir /net

  4. Partendo da /usr/share/examples/amd/amd.conf, mettere quanto segue in /etc/amd.conf:

    [ /net ]
    map_name =              /etc/amd/net
    map_type =              file
  5. Partendo da /usr/share/examples/amd/net come esempio, mettere quanto segue in /etc/amd/net:

    /defaults       type:=host;rhost:=${key};fs:=${autodir}/${rhost}/root
    *             host==${key};type:=link;fs:=/                           \
                  host!=${key};opts:=ro,soft,intr,nodev,nosuid,noconn
  6. Fare il reboot, o (ri)avviare amd a mano:

    # sh /etc/rc.d/amd restart

28.2. Il Network Time Protocol (NTP)

Non è usuale trovare che l'orologio di sistema sia sbagliato, spesso di diversi minuti: per qualche strana ragione sembra che gli orologi dei computer non siano molto accurati. Il problema si complica se si stanno amministrano molti host in rete: tenere gli orologi sincronizzati può facilmente diventare un incubo. Per risolvere questo problema, il protocollo NTP (versione 3) viene in nostro supporto: questo protocollo può essere usato per sincronizzare gli orologi di una rete di stazioni di lavoro usando uno o più server NTP

Grazie al protocollo NTP è possibile agiustare l'orologio di una singola stazione di lavoro ma anche sincronizare un'intera rete. Il protocollo NTP è abbastanza complesso, definendo una struttura gerarchica master-slave (padrone-schiavo, NdT) di server divisi per strati: la cima della gerarchia è occupata dai server dello strato 1, connessi ad un orologio esterno (es. un orologio radio) per garantire un alto livello di accuratezza. Scendendo, i server dello strato 2 sincronizzano i loro orologi con lo strato 1, e così via. L'accuratezza diminuisce man mano si procede verso i livelli più bassi. Questa struttura gerarchica previene le congestioni che potrebbero essere causate avendo tutti gli host che si riferiscono agli stessi (pochi) server dello strato 1. Se, per esempio, si vuole sincronizzare una rete, non bisogna collegare tutti gli host allo stesso server pubblico dello strato 1. Invece, si crea un server locale da collegare al server principale e i rimanenti host sincronizzano i loro orologi con il server locale.

Fortunatamente, per usare gli strumenti NTP non è necessario comprendere i dettagli del protocollo e la sua implementazione (se si è interessati, riferirsi al RFC 1305) e si bisogna solo sapere come configurare e avviare qualche programma. il sistema di base di NetBSD contiene già gli strumenti necessari per utilizzare questo protocollo (e altri protocolli relativi al tempo, come vedremo), derivati dall'implementazione xntp. Questa sezione descrive un metodo semplice per avere sempre un orario di sistema corretto.

Prima, è necessario trovare l'indirizzo dei server NTP pubblici da usare come riferimenti; un elenco dettagliato può essere trovato su http://ntp.isc.org/bin/view/Servers/WebHome. Ad esempio, per l'Italia possono essere utilizzati i due server di strato 1 ntp1.ien.it e ntp2.ien.it.

Successivamente, si agiusta l'orario di sistema dando il seguente comando da root:

# ntpdate -b ntp1.ien.it ntp2.ien.it

(sostituire i nomi dei server nell'esempio con quelli che si stanno effettivamente utilizzando). L'opzione -b dice a ntpdate di impostare l'orario di sistema con la chiamata di sistema settimeofday, invece di rallentarlo con adjtime (il default). Questa opzione è suggerita quando la differenza fra l'orario di sistema e l'orario corretto è considerevole.

Come si è visto, ntpdate non è difficile da usare. Il prossimo passo è avviarlo automaticamente, al fine di avere sempre un orario di sistema corretto. Se si ha una connessione permanente ad Internet, si può avviare il programma al boot con la seguente linea di /etc/rc.conf:

ntpdate=YES      ntpdate_hosts="ntp1.ien.it"

Il nome del server NTP da usare è specificato nella variabile ntpdate_hosts; se si lascia vuota questa voce, lo script di boot proverà ad estrarre il nome dal file /etc/ntp.conf.

Se non si ha una connessione permenante ad Internet (es. si ha una connessione con modem dial-up attraverso un ISP) si può avviare ntpdate dallo script ip-up, come spiegato in Chapter 23, Setting up TCP/IP on NetBSD in practice. In questo caso aggiungere la seguente linea allo script ip-up:

/usr/sbin/ntpdate -s -b ntp1.ien.it

(il percorso è obbligatorio o lo script probabilmente non troverà l'eseguibile). L'opzione -s devia l'output di login dallo standard output (questo è il default) alla funzione syslog(3) di sistema, ciò significa che i messaggi da ntpdate si concluderanno generalmente in /var/log/messages.

Oltre ad ntpdate ci sono altri utili comandi NTP. É anche possibile girare uno degli host locali in un server NTP per gli host rimanenti nella rete. Il server locale sincronizzerà il suo orario con un server pubblico. Per questo tipo di configurazione si deve usare il demone ntpd e creare il file di configurazione /etc/ntp.conf. Per esempio:

server ntp1.ien.it
    server ntp2.ien.it

ntpd può anche essere avviato da rc.conf, usando le opzioni rilevanti:

ntpd=YES

NTP non è la sola opzione se si vuole sincronizzare la rete: si può anche usare il domeno timed o allo stesso modo il comando rdate(8). timed fu sviluppato per 4.3BSD.

Anche timed usa una gerarchia master-slave: quando avviato su un host, timed chiede l'orario di rete a un master e aggiusta di conseguenza l'orario locale. Si può usare una struttura mista, con entrambe timed e ntpd. Uno degli host locali ottiene l'orario corretto da un server NTP pubblico ed è il master timed per i rimanenti host della rete, i quali diventano i suoi client e sincronizzano i loro orologgi usando timed. Questo vuol dire che il server locale deve eseguire entrambe NTP e timed; bisogna stare attenti che questi non interferiscano con gli altri (timed dev'essere avviato con l'opzione -F hostname così da non provare ad aggiustare l'orologio locale).

Infine, rdate(8) può essere usato per sincronizzare ancora una volta un dato host, in modo molto simile a ntpdate(8). L'host in questione deve avere il servizio "tempo" (porta 37) abilitato in /etc/inetd.conf.