Capitolo 9. Network File System (NFS)

NFS (Network File System) consente di montare delle partizioni su un sistema remoto e utilizzarle come se fossero filesystem locali. Ció permette l'amministratore del sistema di immagazzinare le risorse in una posizione centrale sulla rete, garantendo agli utenti autorizzati la possibilità di accedervi costantemente.

Al momento sono disponibili due versioni di NFS. La versione 2 (NFSv2), che esiste già da alcuni anni, è ampiamente supportata da diversi sistemi operativi. La versione 3 (NFSv3) offre alcune opzioni aggiuntive, come un file handle di lunghezza variabile e report di errore più completi. Red Hat Linux ha il supporto per entrambi le versioni (NFSv2 e NFSv3) e utilizza NSFv3 per default in caso di connessione con un server che supporta tale versione.

Questo capitolo si concentra sulla versione 2 di NFS, ma molti degli argomenti presentati si adattano anche alla versione 3. Inoltre, vengono presentati solo i concetti fondamentali relativi a NFS, con l'aggiunta di qualche informazione supplementare; pertanto, se desiderate delle istruzioni specifiche circa la configurazione e il funzionamento di NFS su macchine client o server, dovrete consultare il capitolo Network File System (NFS) nella Red Hat Linux Customization Guide.

9.1. Metodologia

Per consentire la condivisione dei file NFS, Linux utilizza il supporto a livello del kernel combinato con una serie di processi demoni in continua esecuzione; il supporto NFS deve essere abilitato nel kernel di Linux per poter funzionare. Per instradare le richieste tra client e server, NFS utilizza delle chiamate RPC (Remote Procedure Call); questo significa che il servizio portmap deve essere abilitato e attivato con runlevel corretti perché la comunicazione possa avere luogo. Lavorando con portmap, vari altri processi permettono l'avvio di una connessione NFS e ne garantiscono la corretta esecuzione:

Non tutti questi programmi sono necessari per il servizio NFS. Gli unici servizi che bisogna abilitare sono rpc.mountd, rpc.nfsd e portmap. Gli altri demoni forniscono funzionalità aggiuntive e dovrebbero essere utilizzati soltanto qualora il server lo richiedesse.

La versione 2 di NFS utilizza il protocollo UDP (User Datagram Protocol) per instaurare una connessione di tipo stateless tra il client e il server. NFSv3 è in grado di utilizzare UDP o TCP su connessione IP. La connessione stateless con UDP riduce al minimo il traffico di rete, poiché il server NFS invia un cookie al client dopo che è stato autorizzato ad accedere al volume condiviso. Questo cookie, un valore casuale memorizzato dalla parte del server, viene trasmesso con le richieste RPC inviate dal client. Il server NFS può essere riavviato senza coinvolgere i client e il cookie rimane intatto.

NFS effettua l'autenticazione solo quando il client cerca di eseguire un montaggio su un filesystem remoto. Per limitare l'accesso, il server NFS attiva i wrappers TCP, che leggono i file /etc/hosts.allow e /etc/hosts.deny per stabilire se concedere o negare a un determinato client l'accesso al server NFS. Per maggiori informazioni su come configurare i controlli di accesso con wrapper TCP, consultate il Capitolo 15.

Una volta che il client ha passato i wrapper TCP, il server NFS fa riferimento al suo file di configurazione, /etc/exports, per determinare se il client possiede i privilegi minimi necessari per montare i filesystem esportati. Dopo aver consentito l'accesso, tutte le operazioni di file e directory vengono inviate al server mediante chiamate di procedura remota.

AttenzioneAvvertenza
 

I privilegi di montaggio NFS vengono concessi a un client, non a un utente. Qualsiasi utente che userà su di una macchina potrá accedere ai filesystem esportati.

Nel configurare il file /etc/exports, fate molta attenzione a concedere permessi di lettura/scrittura (rw) per un file systema esportato.

9.1.1. NFS e portmap

NFS si serve di chiamate di procedura remota (RPC)per poter funzionare; il comando portmap è necessario per mappare le richieste RPC ai servizi corretti. I processi RPC notificano al portmap quando si avviano, rivelando il numero di porta che stanno monitorando e quali numeri di programmi RPC che sono pronti a servire. Il sistema client poi contatta portmap sul server con un particolare numero di programma RPC. A questo punto, portmap reindirizza il client al numero di porta corretto perché possa comunicare con il servizio desiderato.

Dal momento che i servizi basati su RPC si affidano al portmap per effettuare tutte le connessioni con le richieste in ingresso dei client, è chiaro che portmap deve essere disponibile prima che i servizi di cui sopra siano avviati. Se, per qualche motivo, il servizio portmap si arresta in modo inaspettato, riavviate portmap insieme a tutti i servizi che erano in esecuzione quando l'avevate lanciato.

Il servizio portmap può essere usato con i file di accesso del TCP wrappers (/etc/hosts.allow e /etc/hosts.deny) per controllare quali sistemi remoti possono utilizzare i servizi RPC sulla vostra macchina. Per maggiori informazioni consultate il Capitolo 15. Le regole di controllo dell'accesso al portmap riguardano tutti i servizi RPC. Alternativamente, potete specificare a quale demone RPC di NFS applicare una determinata regola. Le pagine man relative a rpc.mountd e rpc.statd contengono informazioni sulla sintassi precisa di queste regole.

9.1.1.1. Stato del portmap

Poiché portmap serve per coordinare i servizi RPC con i numeri di porta utilizzati per comunicare con loro, può essere utile farsi un'idea dei servizi RPC che attualmente usano portmap nelle operazioni di risoluzione dei problemi. Il comando rpcinfo mostra ogni singolo servizio RPC con accanto il suo numero di porta, il numero di programma RPC, la versione e il tipo di protocollo IP (TCP o UDP).

Il comando rpcinfo-p vi può essere utile se volete accertarvi che i servizi RPC di NFS corretti siano abilitati per il portmap:

   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp   1024  status
    100024    1   tcp   1024  status
    100011    1   udp    819  rquotad
    100011    2   udp    819  rquotad
    100005    1   udp   1027  mountd
    100005    1   tcp   1106  mountd
    100005    2   udp   1027  mountd
    100005    2   tcp   1106  mountd
    100005    3   udp   1027  mountd
    100005    3   tcp   1106  mountd
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100021    1   udp   1028  nlockmgr
    100021    3   udp   1028  nlockmgr
    100021    4   udp   1028  nlockmgr

L'opzione -p verifica il corretto funzionamento del portmapper sull'host specificato o, se nessun host specifico è presente nell'elenco, opera di default sull'host locale. Nella pagina man di rpcinfo troverete le altre opzioni disponibili.

Osservando l'output mostrato sopra, si nota che vi sono vari servizi di NFS in esecuzione. Se uno dei servizi non si avvia in modo corretto, portmap non sarà in grado di mappare alla porta corretta le richieste RPC dei client relative a quel servizio. In molti casi, è opportuno riavviare NFS come root (service nfs restart), per consentire a quel servizio di registrarsi correttamente in portmap ed entrare in funzione.