Per configurare un server NFS su Linux è essenziale editare il file /etc/exports
e avviare i servizi portmap e nfs.
Il file /etc/exports non è altro che un elenco dove si specifica quali risorse condividere e con quali modalità (Es read-only o read-write), e con quali credenziali i client potranno accedere a tale risorse (Es ip sorgente di una certa network).
Per modificare tale file occorre essere utente root, di seguito è riportato un esempio del file:
[opgnc@draco root]$ cat /etc/exports
La directory /export e tutto il suo contenuto è esportato via NFS in moadalità read-only(ro) e ai soli client con un ip di network uguale a 10.0.0.0/24
/export 10.0.0.0/255.255.255.0(ro)
La directory /home/kernel e tutto il suo contenuto è esportato via NFS in moadalità read-write(rw) e ai soli client con un ip di network uguale a 10.0.0.0/24
/home/kernel 10.0.0.0/255.255.255.0(rw)
Eseguite le modifiche al file /etc/exports, passiamo ad avviare i demoni RPC e NFS:
/etc/rc.d/init.d/portmap start
/etc/rc.d/init.d/nfs start
Nel caso in cui il servizio era già attivo occorre semplicemente eseguire il seguente comando per fare in modo che il file /etc/exports venga riletto e si aggiornino le tabelle interne di appoggio del servizio NFS:
exportfs -a
Per montare sul sistema locale un filesystem NFS di un server remoto si può:
- usare una soluzione temporanea, utilizzando il comando mount
, per rendere disponibile nella sessione corrente la share condivisa dal NFS server;
- aggiungere una riga di comandi al file /etc/fstab
, in modo tale che ogni avvio il sistema monti e smonti automaticamente le share NFS.
Le comuni opzioni lato client per il mounting del filesystem remoto, sono le seguenti:
-rw
Monta la partizione NFS con i permessi di lettura e scrittura.
-ro
Monta la partizione NFS con i soli permessi di lettura.
-bg
Nel caso in cui il primo mounting di un nfs share vada in timeout, il processo passa in backgroung.
-soft
Permette al client NFS di riportare l'errore al processo che accede alle share NFS.
-hard
Permette al processo che accede ad un share nfs di rimanere appeso in caso di crash del server. Nel caso in cui la risorsa venga risprestinata, automaticamente anche il processo viene riprestinato, altrimenti l'unico modo per interrompere tale processo è quello di specificare l'opzione intr.
-intr
Permette di interrompere il processo nel caso di problemi con la share nfs.
Esempi:
Comando Mount:
Per montare
mount -t nfs -o bg,intr,hard 10.0.0.25:/export/8.0 /rpms
Per smontare
umount /rpms
Entry in /etc/fstab
Entry in fstab
10.0.0.25:/export/8.0 /rpms nfs bg,hard,intr,ro 0 0
Comando per montare nella sessione corrente
mount -a -t nfs
Per poter montare una condivisione remota via nfs, sul client deve essere attivo il portmapper, per attivarlo (su RedHat e simili):
/etc/init.d/portmap start
E' il file che permette di gestire gli accessi alle share (condivisione) del server NFS oltre che il file di supporto per i comandi exportfs e mount.
Come nella maggior parte dei file di configurazione, le linee bianche o che iniziano con '#' vengono ignorate.
Ogni singola riga corrisponde ad una entry relativa ad una share e deve contenere almeno le seguenti informazioni:
- Export point (la directory o la partizione che viene esportata)
- Access List (Chi puo accedere alla risorsa e con quali permessi)
[root@draco root]# cat /etc/exports
# Export NFS share, Added by neo at 08 Feb 2002
# kickstart Share
L'export point /export/7.2 può essere montata solo dai client provenienti dalla rete 10.0.0.0/24 e solo in read-only
/export/7.2 10.0.0.0/255.255.255.0(ro)
/export/7.3 10.0.0.0/255.255.255.0(ro)
/export/8.0 10.0.0.0/255.255.255.0(ro)
/home/ksfile 10.0.0.0/255.255.255.0(ro)
# Errata & Contrib
/export/contrib_7.2 10.0.0.0/255.255.255.0(ro)
/export/contrib_7.3 10.0.0.0/255.255.255.0(ro)
/export/errata_7.2 10.0.0.0/255.255.255.0(ro)
/export/errata_7.3 10.0.0.0/255.255.255.0(ro)
/export/errata_8.0 10.0.0.0/255.255.255.0(ro)
/export/tarballs 10.0.0.0/255.255.255.0(ro)
# Home
In questo caso viene esportata la home dell'utente neo e può essere solo montata dall'host dido e in modalità read-write
/home/neo dido(rw)
La sintassi del file risulta molto simile al file export di Sun Solaris, tranne per alcune opzioni.
Di seguito è riportato un elenco delle comuni opzioni e le possibili 'formattazione' di una entry:
Opzioni comuni
ro
Accesso in sola lettura
rw
Accesso in lettura e scrittura
no_root_squash
Di default, tutte le richieste effettuate da root dal client vengono tracciate sul server come richieste effettuate da nobody.Se tale opzione è abilitata l'utente root sulla macchina client ha esattamente gli stessi privilegi dell'utente root della macchina server.Ovviamente ciò potrebbe avere implicazioni serie relative alla sicurezza, evitare di usare questa opzione senza un valido motivo.
no_subtree_check
Opzione che abilita un check particolare per i file richiesti dal client. Utile solo in caso in cui la share esportate sono composto solo da una parte di un volume(ES. sottodirectory etc...), altrimenti è bene non specificare questa opzione per aumetare le prestazioni del server NFS.
Sintassi Access List
E' possibile specificare in più modi quali client possono accedere alle risorse sharate:
Singolo Host
Ovvero si specifica semplicemente il singolo host o tramite il suo ip o tramite il nome che verrà risolto tramite DNS.
Esempio:
/home/neo dido(ro)
netgrups
Si possono utilizzzare i netgrups di NIS, specifincandoli con il @
Esempio:
/home/www @webserver(ro)
wildcards
E' possibile specificare wildcards come * o ? per ampliare il matching di una entry.
Esempio:
Tutti gli host del dominio openskills.info possono accedere alla share /home/www in lettura e scrittura
/home/www *.openskills.info(rw)
<IP Networks>
Inoltre è possibile specificare una intera network o subnet, utilizzando al seguente sintassi:
Indirizzo IP/Netmask
Esempio:
/home/www 192.168.0.0/255.255.255.0(rw)
oppure
/home/www 192.168.0.0/24(rw)
E' possibile tramite l'utilizzo di hosts.allow e hosts.deny limitare l'accesso alle share a determinati indirizzi.
Di seguito è riportato un piccolo esempio di configurazione di hosts.allow e hosts.deny:
[root@draco root]# cat /etc/hosts.deny
# hosts.deny This file describes the names of the hosts which are
# *not* allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
Limitare l'accesso a tutti i singoli demoni relativi a NFS
portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL
[root@draco root]# cat /etc/hosts.allow
# hosts.allow This file describes the names of the hosts which are
# allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
Consentire l'accesso solo a chi è considerato trusted
portmap:10.0.0.0/255.255.255.0
lockd:10.0.0.0/255.255.255.0
mountd:10.0.0.0/255.255.255.0
rquotad:10.0.0.0/255.255.255.0
statd:10.0.0.0/255.255.255.0
Comando che permette di gestire le share condivise via NFS.
exportfs [-avi] [-o options,..][client:/path..]
exportfs -r [-v]
exportfs [-av] -u [client:/path ..]
Opzioni
-a
Esegue l'export o l'unexport di tutte le directory.
-o
Pemette di specificare le opzioni che verrebbero utilizzate per configurare il server NFS tramite il file /etc/exports
-i
Ignora il file di configurazione di /etc/exports
-r
Esegue il re-export di tutte le directory, sincronizzando il file /var/lib/nfs/xtab con /etc/exports.
-u
Un-export di una o più directory
-v
Abilita il verbose mode
File di appoggio per NFS server per mantenere traccia dei filesystem esportati.
Esempio di un file xtab di un kickstart server con un NFS server:
[root@draco root]# cat /var/lib/nfs/xtab
[...]
/export/8.0 10.0.0.93 (ro,async,wdelay,hide,secure,no_root_squash,no_all_squash,subtree_check,secure_locks, mapping=identity,anonuid=-2,anongid=-2)
[...]
In questo caso la entry indica che il client con IP 10.0.0.93 ha eseguito il mounting della risorsa /export/8.0 con le opzioni evidenziate in parentesi.
Essendo NFS un servizio basato sull'architettura client/server, il tuning, per ottimizzare le performance del servizio può avvenire sia lato server che lato client.
Ottimizzazione della velocità di trasferimento dati
Tramite le opzioni del comando mount rsize e wsize è possibile specificare la dimensione dei blocchi di dati in lettura e scrittura a livello di client, i valori che si possono indicare dipendono dalla release del kernel e della versione del protocollo NFS utilizzato.
Il protocollo NFS v2 prevede un limite di 8k (Con le patch per implementare NFS over TCP per il kernel 2.4.x si può arrivare fino a 32k), mentre per il protocollo NFS v3 il limite risiede lato server e specificato dalla costante NFSSVC_MAXBLKSIZE.
[neo@dido neo]$ cat /usr/src/linux/include/linux/nfsd/const.h |grep -i nfs
[...]
#define NFSSVC_MAXVERS 3
#define NFSSVC_MAXBLKSIZE 8192
#ifndef NFS_SUPER_MAGIC
# define NFS_SUPER_MAGIC 0x6969
[...]
NFS over TCP
Dal kernel 2.4.20 è possibile selezionare l'opzione "NFS over TCP" dal menu config per l'abilitazione di tale feature con la compilazione del kernel. Il fatto di utilizzare TCP al posto di UDP permette di aggiungere tutti i vantaggi di questo protocollo come la possibilità di ritrasmettere il singolo pacchetto perso piuttosto che tutta l'intera richiesta RPC oltre ad non essere un protocollo stateless come UDP.
In linea di massima questo vantaggio si ha solo in caso di una network non del tutto performante dove per qualche motivo gli errori di trasmissione sono elevati; in caso di una network performante ove gli errori di trasmissione e malformazione dei pacchetti è ridotto al minimo il protocollo UDP può risultare ancora una scelta sensata poichè tale protocollo prevede un tempo di latenza inferiore al protocollo TCP.
Numero istanze di NFSD
La configurazione standard (RedHat) prevede 8 istanze di nfsd, ed è possibile modificare questo valore modificando una variabile (RPCNFSDCOUNT) nello script di gestione del servizio: /etc/rc.d/init.d/nfs
:
[root@dido linux]# grep RPCNFSDCOUNT /etc/rc.d/init.d/nfs
RPCNFSDCOUNT=8
Indicativamente il numero di istanze dovrebbe essere maggiore nei server nfs che devono sopportare molto traffico da client diversi e ridotto in quelli che subiscono un trafico minore.
General TIPS
Oltre al tuning specifico di NFS occorre ottimizzare anche tutte quei aspetti non strettamente legati al servizio come la velocità di lettura e di scrittura su disco oppure utilizzare apparati di rete e cablaggio ottimizzati e performanti.