OsGate.org Logo

Server NFS su Slackware 13 - nfs slackware network

Networks Networks

Date 30.04.2010

Visits 3557

"Avere un server capace di offrire e garantire il supporto ad NFS all'interno di una rete permette ai client di accedere a risorse remote come se fossero un normale disco locale. In questo articolo vederemo come configurare il servizio NFS su un server Slackware."

NFS

Il Network File System è un protocollo application layer che permette di condividere file system in rete ed fu sviluppato da Sun Microsystems nel  1984.

Lo scopo principale di NFS è quello di permettere agli utenti di accedere a file remoti come se fossero sull'hard disk locale.

L'ultima major version, la numero 4 pubblicata nel 2000, include numerosi cambiamenti atti a rispettare i bisogni delle reti moderne. Possiamo trovare infatti miglioramenti a livello di sicurezza, performance, l'adozione del TCP e l'introduzione degli stati che fanno diventare NFS un protocollo stateful.

Nel gennaio 2010 è stata rilasciata la versione 4.1 che include pNFS(parallel NFS) come grande novità.

RPC e portmap

Le RPC (Remote Procedure Call) sono essenziali per fare funzionare NFS, infatti permettono di eseguire chiamate di sistema attraverso la rete, cosa che con NFS avviene molto spesso. Vengono usate siccome NFS non utilizza un formato dei messaggi dedicato, quindi lo scambio di informazioni tra client e server avviene tramite una remote procedure call. Le RPC all'interno di NFS sono gestite attraverso il server portmap.

Grazie a portmap quando effettuiamo dal client una RPC siamo in grado di eseguire le operazioni NFS sul server.

Per esempio al momento di montare una share NFS, effettuiamo tramite il comando mount una RPC verso il server, se portmap non è attivo il server non sarà in grado di rispondere alla RPC provocando cosi un fail e di conseguenza noi non potremo montare la share. La stessa cosa avviene in caso noi vogliamo smontare la share, se portmap non è attivo non saremo in grado di smontarla.

In caso la RPC venga portata a termine con successo il server restituirà un codice di successo che i client interpreterà come un operazione eseguita correttamente.

Installazione NFS

All'interno di Slackware tutti i pacchetti per fare funzionare NFS sono forniti con un installazione di default. In caso contrario è necessario installare due pacchetti contenenti tutti i tool necessari, nfs-utils e portmap. Scaricate i pacchetti da qui:

Nota: questi sono i pacchetti per la versione 13.0 di Slackware, nel caso la vostra versione sia differente, adattatela.

Dopodichè spostatevi nella cartella dove si trovano i pacchetti, eseguite il login come root e digitate:

bash-4.1# installpkg nfs-utils-1.1.4-i486-1.txz portmap-6.0-i486-1.txz

Cosi facendo verranno installati sul sistema i componenti NFS.

È essenziale che il modulo del kernel relativo a NFS sia caricato, sia sul server che sul client:

lsmod | grep nfs
nfs 110305 0
lockd 48475 1 nfs
sunrpc 131654 3 nfs,lockd

Questo indica che il modulo NFS è stato caricato correttamente.

Per controllare il server NFS su Slackware esiste uno script dedicato:

bash-4.1# sh /etc/rc.d/rc.nfsd start|stop|restart

Exports

Una volta messo in servizio NFS e tutti i suoi componenti dobbiamo decidere che cosa condividere. Per fare questo esiste un file, /etc/exports, che rappresenta una access control list per i demoni mountd e nfsd. Al suo interno vengono specificate le share da esportare verso gli altri client tramite una sintassi specifica.

Per ogni linea va specificata una share seguita dal client che vi può accedere e successivamente per ogni client tra parentesi vanno specificate le opzioni.

Ecco una riga di esempio:

/home/bob 	192.168.1.2(rw,no_subtree_check, no_root_squash)

Viene resa pubblica la cartella /home/bob solo all'indirizzo IP 192.168.1.2.

È possibile specificare piu client per una share, basta immetere uno spazio tra essi:

/home/bob 	192.168.1.2(rw,no_subtree_check, no_root_squash) 192.168.1.5(ro,sync)

Le opzioni specificate in questi due esempi sono spiegate più in basso.

I client che possono accedere alla risorsa possono essere specificati nei seguenti modi:

  • Un singolo indirizzo IP
  • Una sottorete indicata tramite la forma indirizzo/netmask (192.168.1.0/24 o 192.168.1.0/255.255.255.0)
  • Un FQDN
  • wildcard, per esempio *.ou.osgate.org, che permetterà l'accesso a tutti i client nel dominio uo.osgate.org

Opzioni

Ecco alcune opzioni principali all'interno del file:

  • secure: permette connessioni solo da una porta minore a 1024. Viene impostata di default, il contrario è insecure.
  • rw / ro: abilita gli accessi in lettura e scrittura / abilita gli accessi solo in lettura
  • sync: risponde a una richiesta solo dopo che tutti i cambiamenti sono stati scritti su disco
  • async: risponde ad una richiesta prima che i cambiamenti siano effettivamente scritti tutti sul disco. Con async vi è un aumento delle performance, rischiando però la perdita di dati/informazioni.
  • subtree_check: se una sottocartella viene esportata ma il file system in cui è contenuta no, il server controlla se il file richiesto si trova effettivamente nella sottocartella esportata. L'opzione opposta è no_subtree_check, in cui si disabilita questo controllo. Se si esportano interi file system disabilitare il subtree_check può aumentare le performance.

Queste opzioni sono relative agli utenti:

  • root_squash: mappa le richieste da un utente con gid/uid 0 (root) all'utente con gid/uid anonymous. L'opposto è no_root_squash.
  • all_squash: tutte le richieste verranno mappate all'utente anonymous. No_all_squash è l'opzione opposta.
  • anonuid / anongid: impostano l'uid e il gid dell'utente anonymous. Se non specificato verrà usato 65534 come uid e gid delle richieste.

Configurazione /etc/exports

Nel nostro caso effettueremo una semplice condivisione adatta ad un intera sotto rete. Verrà condivisa un interna partizione del disco, creata al momento del partizionamento montata in /nfs. Disabilitamo il subtree_check, e mappiamo le richieste dell'utente root all'utente anonymous.

Successivamente esportiamo la directory /nfs/bobby, e mappiamo tutte le richieste all'utente anonymous avente gid e uid pari a 1000.

/nfs 192.168.1.0/24(rw, no_subtree_check, root_squash)
/nfs/bobby 192.168.1.5(rw, all_squash, anonuid=1000, anongid=1000)

Dopo aver scritto il file /etc/exports, dobbiamo riavviare il server NFS:

bash-4.1# sh /etc/rc.d/rc.nfsd restart

Focus portmap

Per comprendere meglio le RPC e portmap eseguiamo questo comando:

rcpinfo -p 
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 50126 status
100024 1 tcp 40406 status
100011 1 udp 924 rquotad
100011 2 udp 924 rquotad
100011 1 tcp 927 rquotad
100011 2 tcp 927 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100021 1 udp 45684 nlockmgr
100021 3 udp 45684 nlockmgr
100021 4 udp 45684 nlockmgr
100021 1 tcp 40933 nlockmgr
100021 3 tcp 40933 nlockmgr
100021 4 tcp 40933 nlockmgr
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100005 1 udp 49154 mountd
100005 1 tcp 37483 mountd
100005 2 udp 49154 mountd
100005 2 tcp 37483 mountd
100005 3 udp 49154 mountd
100005 3 tcp 37483 mountd

Come possiamo vedere appare la lista dei programmi / porte abilitati per trattare delle RPC. Quando un client per esempio esegue un mount, viene inviata una richiesta RPC al server sulla porta 111 ovvero quella di portmap, contenente un MOUNT(100005), successivamente portmap risponde inviando la porta(37483) sulla quale mountd è in ascolto. Il client potrà cosi comunicare con il demone per montare la directory. Dopo il mount il client invia una richiesta NFS(100003) e il server risponde con la porta 2049. Successivamente tutte le richieste di lettura/modifica/scrittura di file e directory verranno inviate alla porta 2049 del server. Al momento di smontare la directoy si avrà ancora una richiesta MOUNT(100005) sulla porta 49154.

/etc/fstab

È anche possibile montare una share NFS all'avvio tramite /etc/fstab.

Per farlo basta inserire una linea relativa a questa:

"server":"percorso_share" "mount_point_locale" nfs "opzioni" 0 0 

In questo modo le share saranno sempre montate all'avvio.

Comandi utili

Server

  • rpcinfo -p, mostra la lista dei programmi e delle porte abilitati a ricevere una RPC
  • sh /etc/rc.d/rc.nfsd start | stop | restart, controlla i demoni NFS
  • nfsstat, mostra le statistiche NFS
  • showmount, mostra i client che hanno una share attualmente montata

Client

  • mount / mount.nfs, monta una directory / monta una directory NFS
  • umount, smonta una directory
  • nfsstat, mostra le statistiche NFS