[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]

86. NFS

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

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

86.1 Supporto nel kernel

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

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 (è la riga nodev nfs a rivelarlo).

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

86.2 Dal lato del server

Dalla parte dell'elaboratore server è necessario che oltre al portmapper siano in funzione i demoni 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  rpcbind
    100000    2   udp    111  rpcbind
    100005    1   udp    844  mountd
    100005    1   tcp    846  mountd
    100003    2   udp   2049  nfs
    100003    2   tcp   2049  nfs

86.2.1 # rpc.mountd

rpc.mountd [<opzioni>]

È il demone che si occupa di gestire il montaggio del filesystem di rete dal lato del server. Generalmente, viene avviato dalla procedura di inizializzazione del sistema, in modo autonomo, cioè indipendente da inetd. Mantiene il file /etc/rmtab che elenca i montaggi in essere. Tuttavia, non è garantito che il contenuto di questo file sia esatto, per cui non lo si può utilizzare per determinare con certezza quali siano le connessioni in corso.

86.2.2 # rpc.nfsd

rpc.nfsd [<opzioni>]

È il demone che si occupa di gestire le richieste, da parte dei client, per i servizi NFS. Deve essere in funzione nel server. Viene avviato generalmente dalla procedura di inizializzazione del sistema, subito dopo mountd. Anche rpc.nfsd funziona in modo autonomo rispetto a inetd.

Il funzionamento di questo programma dipende dal file /etc/exports. Quando quest'ultimo dovesse essere riconfigurato, per fare in modo che rpc.nfsd lo rilegga, è necessario inviargli un segnale di aggancio.

kill -HUP <PID-di-rpc.nfsd>

86.2.3 /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 demoni 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> [<host>][(<opzioni>)]...

Quando si fanno modifiche a questo file, è necessario riavviare il sistema di gestione del servizio NFS. Di solito è sufficiente inviare un segnale di aggancio ai demoni mountd e nfsd.

kill -HUP <PID-di-rpc.mountd>

kill -HUP <PID-di-rpc.nfsd>

Se non si riesce in questo modo, si può tentare di eliminare del tutto i due processi, per riavviarli manualmente subito dopo.

Purtroppo, la configurazione di questo file non è sempre funzionante e questo a causa di difetti nei demoni mountd e nfsd. In generale, si è cercato sempre di garantire la sicurezza, a discapito della funzionalità. Se una configurazione particolare di /etc/exports sembra non funzionare senza un motivo particolare, è bene provarne altre, limitando l'uso di opzioni particolari, o cercando di identificare meglio gli elaboratori a cui si concede di accedere. Eventualmente, si veda anche la pagina di manuale exports(5).

Identificazione degli elaboratori

Gli elaboratori 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 a una sottodirectory di una directory già concessa in condivisione.

link_relative

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

Un percorso è assoluto quando parte dalla directory radice (/), mentre è relativo quando parte dalla posizione corrente. Nello stesso modo, un collegamento 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 nell'elaboratore che opera da server, di conseguenza, gli eventuali collegamenti simbolici assoluti, non sarebbero più validi. Questo tipo di trasformazione risolve il problema ed è anche la modalità di funzionamento predefinita.

link_absolute

Mantiene il collegamenti simbolici così come sono.

root_squash

Si tratta di un'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. *1*

no_root_squash

Non effettua la trasformazione dell'UID root e ciò è necessario quando si utilizzano client senza disco fisso. *2*

Esempi

/usr *.brot.dg(ro)

Concede ai nodi del dominio brot.dg l'accesso in lettura alla directory /usr/ e seguenti.

---------

/ roggen.brot.dg(ro,root_squash)

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

---------

/home roggen.brot.dg(rw) weizen.mehl.dg(rw)

Concede a roggen.brot.dg e a weizen.mehl.dg di accedere in lettura e scrittura alla directory /home/.

---------

/   *(rw,no_root_squash)

Questa definizione non dovrebbe funzionare più. Sembrerebbe voler concedere a tutta la rete di accedere in lettura e scrittura a partire dalla directory radice, permettendo ai vari utenti root di mantenere i loro privilegi. Tuttavia l'asterisco non dovrebbe riuscire a rimpiazzare i punti che compongono i nomi di dominio, risolvendosi così in una directory che in pratica non viene condivisa.

86.2.4 Verifica

Per verificare l'utilizzo effettivo del servizio da parte dei client, è disponibile il programma showmount, che viene descritto più avanti. Infatti, questo si presta anche all'utilizzo dal lato client per conoscere le directory esportate da un server.

86.3 Dal lato del client

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

Per facilitare il compito degli amministratori dei client, è anche disponibile il programma showmount che permette di conoscere cosa viene messo a disposizione dai vari server.

86.3.1 Mount di un filesystem di rete

Il montaggio 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.

<host-remoto>:<directory-remota>

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

Supponendo che l'elaboratore dinkel.brot.dg conceda l'utilizzo della directory /usr/ e successive, l'elaboratore roggen.brot.dg potrebbe sfruttarne l'occasione attraverso il programma mount nel modo seguente:

mount -t nfs dinkel.brot.dg:/usr /usr

Inoltre, nell'elaboratore roggen si potrebbe aggiungere una riga nel file /etc/fstab in modo da automatizzarne la connessione ( 48.3.6).

dinkel.brot.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 pacchetti (o datagram, dal momento che si tratta del protocollo UDP, che è di tipo non connesso) utilizzati in lettura da parte del client NFS. Il valore predefinito è di 1024 byte.

wsize=n

Permette di specificare la dimensione dei pacchetti (o datagram, dal momento che si tratta del protocollo UDP, che è di tipo non connesso) 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.

86.3.2 # showmount

showmount [<opzioni>] [<host>]

showmount è un programma collocato nella directory /usr/sbin/, il cui utilizzo è rivolto prevalentemente all'utente root, ma che non viene impedito agli utenti comuni. showmount permette di verificare la disponibilità di un server NFS a consentire il montaggio di determinate directory, oppure permette di verificare chi stia montando qualcosa dal proprio server locale.

Alcune opzioni

-a | --all

Elenca i client che utilizzano il proprio servizio e anche le directory che questi hanno montato.

-e | --exports

Elenca le directory esportate dal server locale o dal server remoto (se indicato come ultimo argomento del comando).

86.4 Riferimenti

---------------------------

Appunti Linux 1999.09.21 --- Copyright © 1997-1999 Daniele Giacomini --  daniele @ pluto.linux.it


1.) L'utente nobody corrisponde spesso al numero UID 65534 o -2. Tuttavia, questo utente non ha un numero UID standard, tanto che in alcuni sistemi si preferisce utilizzare un numero più basso di quelli assegnati agli utenti comuni.

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


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]