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


97. 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'.

97.1 Supporto nel kernel

Per poter condividere file attraverso NFS, sia come cliente che come servente, occorre includere il supporto al filesystem NFS nel kernel ( 20.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

97.2 Dal lato del servente

Dalla parte dell'elaboratore servente è 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

97.2.1 # rpc.mountd

rpc.mountd [<opzioni>]

È il demone che si occupa di gestire il montaggio del filesystem di rete dal lato del servente. 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.

97.2.2 # rpc.nfsd

rpc.nfsd [<opzioni>]

È il demone che si occupa di gestire le richieste, da parte dei clienti, per i servizi NFS. Deve essere in funzione nel servente. 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>

97.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ò provare eliminando del tutto i due processi, riavviandoli 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 di `/etc/exports' sembra non funzionare senza un motivo apparente, è 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:

  • indicazione di un nodo singolo

    quando si utilizza un nome o un indirizzo IP che fa riferimento da un elaboratore specifico;

  • uso di caratteri jolly

    possono essere utilizzati i caratteri jolly `*' e `?' per indicare un gruppo di nomi di elaboratore con una sola notazione, tenendo presente che questi simboli non possono sostituirsi ai punti di un nome di dominio;

  • rete IP

    attraverso la notazione `<indirizzo-IP>/<maschera-di-rete>' è possibile indicare simultaneamente tutti gli elaboratori collocati all'interno della rete o della sottorete a cui si fa riferimento.

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 servente, 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 cliente 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 clienti 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.

97.2.4 Verifica

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

97.3 Dal lato del cliente

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 clienti, è anche disponibile il programma `showmount' che permette di conoscere cosa viene messo a disposizione dai vari serventi.

97.3.1 Montaggio 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 ( 52.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.

97.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 servente NFS a consentire il montaggio di determinate directory, oppure permette di verificare chi stia montando qualcosa dal proprio servente locale.

Alcune opzioni

-a | --all

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

-e | --exports

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

97.4 Riferimenti

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

Appunti Linux 2000.04.12 --- Copyright © 1997-2000 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]