Capitolo successivo Capitolo precedente Indice

52. NFS

NFS è un servizio di rete che, avvalendosi delle RPC, permette la condivisione di porzioni di filesystem da e verso altri computer connessi.

Solitamente, in un sistema Linux, è sufficiente predisporre il file /etc/exports per permettere agli altri computer della rete di accedere al proprio con un semplice mount.

52.1 Supporto nel kernel

Per poter condividere file attraverso NFS, sia come client che server, occorre includere il supporto al filesystem NFS nel kernel ( `NFS filesystem support').

Per controllare che questo supporto esista, è sufficiente leggere il contenuto del file /proc/filesystems. L'esempio seguente rappresenta una situazione in cui è possibile accedere a filesystem NFS.

        ext2
        minix
        umsdos
        msdos
        vfat
nodev   proc
nodev   nfs
nodev   smbfs
        iso9660

52.2 Dal lato del server

Dalla parte del computer server è necessario che oltre al portmapper siano in funzione i daemon mountd e nfsd e che il file di configurazione /etc/exports sia stato configurato correttamente.

$ rpcinfo -p [Invio]

   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100005    1   udp    844  mountd
    100005    1   tcp    846  mountd
    100003    2   udp   2049  nfs
    100003    2   tcp   2049  nfs

# rpc.mountd

rpc.mountd [<opzioni>]

È il daemon che si occupa di gestire i mount del filesystem di rete dal lato del server. Viene generalmente avviato dalla procedura di inizializzazione del sistema, in modo standalone, cioè indipendente da inetd. Mantiene il file /etc/rmtab che elenca i mount in essere. Tuttavia, il contenuto di questo file non è accurato e non può essere utilizzato per determinare con certezza quali siano le connessioni in corso.

# rpc.nfsd

rpc.nfsd [<opzioni>]

È il daemon che si occupa di gestire le richieste, da parte dei client, per i servizi NFS. Deve essere in funzione nel server. Viene generalmente avviato dalla procedura di inizializzazione del sistema, subito dopo mountd, e come questo, in modo standalone, cioè indipendente da inetd.

/etc/exports

Il file /etc/exports contiene l'indicazione delle porzioni di filesystem locale da concedere in condivisione alla rete: NFS. Questo file viene utilizzato in pratica dai daemon mountd e nfsd.

Se il file manca o è vuoto, non viene concesso l'utilizzo di alcuna parte del filesystem locale all'esterno.

Ogni record del file è composto da:

In pratica si utilizza la sintassi seguente.

<directory-di-partenza> [<computer>][(<opzioni>)]...

Identificazione dei computer

I computer che possono accedere alla directory condivisa, possono essere specificati in vari modi, alcuni dei quali sono elencati di seguito:

Alcune opzioni

Alcune delle opzioni da applicare sono elencate di seguito.

---------

ro

Consente l'accesso in sola lettura. Questa è la modalità di funzionamento predefinita.

rw

Consente l'accesso in lettura e scrittura.

noaccess

Non concede la directory in condivisione. Può essere utile quando si vuole evitare l'accesso ad una sottodirectory di una directory già concessa in condivisione.

link_relative

Trasforma i link simbolici assoluti, contenuti nel filesystem da condividere, in link relativi.

Un percorso è assoluto quando parte dalla directory radice (/), mentre è relativo quando parte dalla posizione corrente. Nello stesso modo, un link simbolico può essere fatto utilizzando l'indicazione di un percorso assoluto o relativo. Quando si utilizza un filesystem di rete, difficilmente si ricostruisce la situazione del filesystem contenuto nel computer che opera da server, di conseguenza, gli eventuali link simbolici assoluti, non sarebbero più validi.

Questo tipo di trasformazione risolve questo problema ed è anche la modalità di funzionamento predefinita.

link_absolute

Mantiene il link simbolici così come sono.

root_squash

Si tratta di una opzione di sicurezza, attraverso la quale si impedisce l'accesso come utente root. In pratica, quando un utente root presso un client utilizza il filesystem condiviso, viene trattato come utente nobody.

L'utente nobody corrisponde spesso al numero UID 65534 o -2. In ogni caso, in alcuni sistemi si preferisce utilizzare un numero differente.

no_root_squash

Non effettua la trasformazione dell'UID root e ciò è necessario quando si utilizzano client senza disco fisso. Questa è la modalità di funzionamento predefinita.

Anche se in tutti i documenti che si incontrano, si afferma che la trasformazione dell'UID root non avviene se non espressamente richiesto, in realtà, la maggior parte delle distribuzioni Linux compilano i sorgenti in modo che, se non viene specificato diversamente, avvenga tale trasformazione.

Esempi

/usr *.zigozago.dg(ro)

Concede a tutto il dominio zigozago.dg l'accesso in lettura alla directory /usr/ e seguenti.

/ pippo.zigozago.dg(ro,root_squash)

Concede a pippo.zigozago.dg di accedere in sola lettura a partire dalla directory radice, escludendo i privilegi dell'utente root.

/home pippo.zigozago.dg(rw) basettoni.zigozago.dg(rw)

Concede a pippo.zigozago.dg e a basettoni.zigozago.dg di accedere in lettura e scrittura alla directory /home/.

52.3 Dal lato del client

Con Linux, l'utilizzo di un filesystem di rete richiede solo che il kernel sia stato predisposto per questo. Non occorrono programmi daemon, basta il normalissimo mount.

Mount di un filesystem di rete

Il mount di un filesystem di rete avviene in modo analogo a quello di una normale unità di memorizzazione, con la differenza fondamentale del modo di esprimere il dispositivo virtuale corrispondente al filesystem remoto da connettere.

<computer-remoto>:<directory-remota>

La notazione sopra riportata rappresenta la porzione di filesystem remoto cui si vuole accedere, attraverso l'indicazione simultanea del computer e della directory di partenza.

Supponendo che il computer topolino.zigozago.dg conceda l'utilizzo della directory /usr/ e successive, il computer pippo.zigozago.dg potrebbe sfruttarne l'occasione attraverso il programma mount nel modo seguente.

mount -t nfs topolino.zigozago.dg:/usr /usr

Inoltre, nel computer pippo si potrebbe aggiungere una riga nel file /etc/fstab in modo da automatizzarne la connessione ( fstab).

topolino.zigozago.dg:/usr  /usr   nfs      defaults

Sia attraverso il programma mount (preceduti dall'opzione -o), che nel file /etc/fstab (nel campo delle opzioni) possono essere specificate delle opzioni particolari riferite a questo tipo di filesystem.

---------

rsize=n

Permette di specificare la dimensione dei datagram utilizzati in lettura da parte del client NFS. Il valore predefinito è di 1024 byte.

wsize=n

Permette di specificare la dimensione dei datagram utilizzati in scrittura da parte del client NFS. Il valore predefinito è di 1024 byte.

timeo=n

Permette di definire il valore del timeout, espresso in decimi di secondo, per il completamento delle richieste. In pratica, se entro quel tempo, non si ottiene una conferma si verifica un minor timeout e l'operazione viene ritentata con una durata di timeout doppia. Quando si raggiunge un timeout massimo di 60 secondi si verifica un major timeout. Il valore predefinito è 7 corrispondente a 0,7 secondi.

hard

Stabilisce che la connessione deve essere ritentata all'infinito, anche dopo un major timeout. È la modalità di funzionamento predefinita.

soft

Stabilisce che venga generato un errore di I/O non appena si verifica un major timeout. Questa modalità si contrappone a quella hard.

intr

Permette l'interruzione di una chiamata NFS attraverso l'uso di segnali. Può essere utile per interrompere una connessione quando il server non risponde.

52.4 Riferimenti

 

1997.10.26 - Scritto da Daniele Giacomini   daniele@calion.com   (vedi copyright: Appunti Linux).


Capitolo successivo Capitolo precedente Indice