Per poter abilitare un server NFS in ambiente Linux occorre semplicemente configurare e compilare il kernel con il supporto NFS server (anche client se si desidera) e installare tramite rpm o sorgenti le nfs-utils, ovvero tutti i comandi per la gestione dei demoni e delle share.
Nel caso della distribuzione RedHat, il kernel di default supporta sia NFS server che client tramite moduli, ma nel caso si utilizzi una distribuzione differente o più semplicemente si è disabilitato il supporto di NFS nel kernel, occorre riabilitarlo, con la ricompilazione del kernel.
La sezione relativa a NFS è File-System ---> Network File System --->NFS client o server, come si può vedere dalla screenshot:
Si consiglia di evitare di utilizzare i moduli, per evitare problemi con le dipendenze.
Abilitato il supporto in kernel space occorre installare tramite rpm o sorgenti
portmap le nfs-utils, il primo è un servizio che deve essere abilitato sia sul client che sul server e si occupa di convertire da RPC program port in DARPA protocol port numbers, il secondo invece, è l'insieme di binari,librerie, manuali e tutto ciò che serve per supportare e gestire NFS in user space.
Installazione delle nfs-utils
Il modo più veloce è certamente quello di utilizzare i package come RPM o DEB
[root@GIOVE root]# rpm -ihv nfs-utils-1.0.1-2.i386.rpm
Preparing... ########################################### [100%]
1:nfs-utils ########################################### [100%]
[root@GIOVE root]# rpm -qil nfs-utils
[...]
Script per la gestione dei demoni per nfs server
/etc/rc.d/init.d/nfs
/etc/rc.d/init.d/nfslock
binari dei demoni e utility
/sbin/rpc.lockd
/sbin/rpc.statd
/sbin/rpcdebug
/usr/sbin/exportfs
/usr/sbin/nfsstat
/usr/sbin/nhfsstone
/usr/sbin/rpc.mountd
/usr/sbin/rpc.nfsd
/usr/sbin/showmount
Documentazione e manuali
/usr/share/doc/nfs-utils-1.0.1
/usr/share/doc/nfs-utils-1.0.1/ChangeLog
/usr/share/doc/nfs-utils-1.0.1/INSTALL
/usr/share/doc/nfs-utils-1.0.1/KNOWNBUGS
/usr/share/doc/nfs-utils-1.0.1/NEW
/usr/share/doc/nfs-utils-1.0.1/README
[...]
/usr/share/man/man5/exports.5.gz
/usr/share/man/man8/exportfs.8.gz
/usr/share/man/man8/lockd.8.gz
/usr/share/man/man8/mountd.8.gz
/usr/share/man/man8/nfsd.8.gz
/usr/share/man/man8/nfsstat.8.gz
/usr/share/man/man8/nhfsgraph.8.gz
/usr/share/man/man8/nhfsnums.8.gz
/usr/share/man/man8/nhfsrun.8.gz
/usr/share/man/man8/nhfsstone.8.gz
/usr/share/man/man8/rpc.lockd.8.gz
/usr/share/man/man8/rpc.mountd.8.gz
/usr/share/man/man8/rpc.nfsd.8.gz
/usr/share/man/man8/rpc.statd.8.gz
/usr/share/man/man8/showmount.8.gz
/usr/share/man/man8/statd.8.gz
File di supporto per tenere traccia delle share montate
/var/lib/nfs
/var/lib/nfs/etab
/var/lib/nfs/rmtab
/var/lib/nfs/statd
/var/lib/nfs/xta
Nel caso in cui si vogliano compilare direttamente i sorgenti è possibile scaricarli dal seguente indirizzo:
http://sourceforge.net/project/showfiles.php?group_id=14&release_id=100684.
[root@GIOVE root]# tar zxvf nfs-utils-1.0.1.tar.gz
[...]
nfs-utils-1.0.1/utils/statd/statd.man
nfs-utils-1.0.1/utils/statd/state.c
nfs-utils-1.0.1/utils/statd/svc_run.c
nfs-utils-1.0.1/utils/statd/system.h
nfs-utils-1.0.1/utils/statd/version.h
[root@GIOVE root]# cd nfs-utils-1.0.1
[root@GIOVE nfs-utils-1.0.1]# ./configure
[...]
creating ./config.status
creating config.mk
creating nfs-utils.spec
creating utils/Makefile
creating support/include/config.h
[root@GIOVE nfs-utils-1.0.1]# make
Making all in tools
Making all in rpcgen
gcc -O2 -I../../support/include -Wall -pipe -DVERSION="\"nfs-utils 1.0.1\"" -DNFS3_SUPPORTED -c -o rpc_clntout.o rpc_clntout.c
[...]
[root@GIOVE nfs-utils-1.0.1]# make install
Making install in tools
Making install in rpcgen
Making install in getiversion
Making install in getkversion
Making install in rpcdebug
Making install in locktest
Making install in support
Making install in include
Making install in nfs
Making install in export
Making install in lib
Making install in misc
Making install in utils
Making install in exportfs
[...]
Nella distribuzione RedHat il package portmap viene installato di default poichè è richiesto da altri servizi come ad esempio NIS.
[root@GIOVE root]# rpm -qil portmap
[...]
Script per las gestione del servizio
/etc/rc.d/init.d/portmap
Binari
/sbin/portmap
/usr/sbin/pmap_dump
/usr/sbin/pmap_set
Documentazione e manuali
/usr/share/doc/portmap-4.0
/usr/share/doc/portmap-4.0/BLURB
/usr/share/doc/portmap-4.0/CHANGES
/usr/share/doc/portmap-4.0/README
/usr/share/man/man8/pmap_dump.8.gz
/usr/share/man/man8/pmap_set.8.gz
/usr/share/man/man8/portmap.8.gz
Sia gli RPM di binari sia di sorgenti di portmap sono disponibili al seguente indirizzo:
http://rpmfind.net/linux/rpm2html/search.php?query=portmap&submit=Search+...
Esempio di installazione da sorgente:
Download dei sorgenti in formato rpm
[root@GIOVE root]# wget
ftp://rpmfind.net/linux/redhat/8.0/en/os/i386/SRPMS/portmap-4.0-46.src.rpm
--15:14:02-- ftp://rpmfind.net/linux/redhat/8.0/en/os/i386/SRPMS/portmap-4.0-46.src.rpm
=> `portmap-4.0-46.src.rpm'
[root@GIOVE root]# rpm -ihv portmap-4.0-46.src.rpm
1:portmap ########################################### [100%]
Costruzione dei binari tramite l'utility rpmbuild
[root@GIOVE root]# rpmbuild -bb /usr/src/redhat/SPECS/portmap.spec
[...]
Una volta costruito il package lo ritroviamo nella seguente directory
/usr/src/redhat/RPMS/i386/
Visualizza a video tutte le statistiche relative a NFS e RPC.
nfsstat [opzioni] [-o facility]
Opzioni
-s
Visualizza solo le informazioni relative al server
-c
Visualizza solo le informazioni relative al client
-n
Visualizza solo le informazioni relative a NFS
-r
Visualizza solo le informazioni relative al RPC
-z
Azzera le statistiche
Facility
nfs
Visualizza solo le informazioni relative a NFS
rpc
Visualizza solo le informazioni relative a RPC
net
Visualizza solo le informazioni relative al network layer come il numero di connessioni, il numero dei poacchetti ricevuti
fh
Visualizza le informazioni relative al server file handle cache
sc
Visualizza le informazioni relative al server file reply cache
Esempi di output del comando nfsstat con alcune comuni opzioni.
Visualizzazione delle statistiche della rete
[root@draco root]# nfsstat -o net
Server packet stats:
packets udp tcp tcpconn
0 18729 0 0
Client packet stats:
packets udp tcp tcpconn
0 0 0 0
Visualizzazione delle statistiche lato server
[root@draco root]# nfsstat -s
Server rpc stats:
calls badcalls badauth badclnt xdrcall
18729 0 0 0 0
Server nfs v2:
null getattr setattr root lookup readlink
0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
read wrcache write create remove rename
0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
link symlink mkdir rmdir readdir fsstat
0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
Server nfs v3:
null getattr setattr lookup access readlink
0 0% 273 1% 0 0% 302 1% 262 1% 0 0%
read write create mkdir symlink mknod
209 1% 0 0% 0 0% 0 0% 0 0% 0 0%
remove rmdir rename link readdir readdirplus
0 0% 0 0% 0 0% 0 0% 53 0% 0 0%
fsstat fsinfo pathconf commit
8815 47% 8815 47% 0 0% 0 0%
Essendo il servizio NFS gestito dal kernel e da processi che girano in user-space occorre verificare l'effettivo supporto del kernel e verificare lo status di alcuni demoni.
Per verificare che il proprio kernel supporti nfs, ci si può appoggiare al proc filesystem, visualizzando il contenuto del file /proc/filesystem, se all'interno di questo file è presente una entry simile nodev nfs, significa che il kernel supporta il suddetto filesystem.
[root@draco root]# cat /proc/filesystems
nodev rootfs
nodev bdev
nodev proc
nodev sockfs
nodev tmpfs
nodev shm
nodev pipefs
nodev binfmt_misc
ext3
ext2
nodev coda
iso9660
nodev devfs
vxfs
nodev nfs
nodev smbfs
ntfs
affs
nodev autofs
reiserfs
nodev devpts
nodev usbdevfs
Per quanto riguarda i servizi e i processi che girano in user space occorre appoggiarsi ai soliti comandi per il troubleshooting dei servizi di network, come netstat
per verificare le porte in listening e ps
per visualizzare i processi attivi.
I servizi attivi per un server dovranno essere portmap (rpc.statd, rpc.quotad, rpciod), e il demone nfs (nfsd, lockd) attivabili tramite gli script di gestione del servizio (per Redhat):
/etc/rc.d/init.d/nfs
/etc/rc.d/init.d/nfslock
/etc/rc.d/init.d/portmap
Mentre per un client è necessario attivare solo portmap.
[root@draco root]# ps -adef
UID PID PPID C STIME TTY TIME CMD
[...]
root 444 1 0 Mar18 ? 00:00:00 syslogd -m 0
root 449 1 0 Mar18 ? 00:00:00 klogd -2
rpc 469 1 0 Mar18 ? 00:00:00 portmap
rpcuser 497 1 0 Mar18 ? 00:00:00 rpc.statd
root 666 1 0 Mar18 ? 00:00:00 rpc.rquotad
root 676 1 0 Mar18 ? 00:00:00 [nfsd]
root 677 1 0 Mar18 ? 00:00:00 [lockd]
root 678 677 0 Mar18 ? 00:00:00 [rpciod]
root 679 1 0 Mar18 ? 00:00:00 [nfsd]
root 680 1 0 Mar18 ? 00:00:00 [nfsd]
root 681 1 0 Mar18 ? 00:00:00 [nfsd]
root 682 1 0 Mar18 ? 00:00:00 [nfsd]
root 683 1 0 Mar18 ? 00:00:00 [nfsd]
root 684 1 0 Mar18 ? 00:00:00 [nfsd]
root 685 1 0 Mar18 ? 00:00:00 [nfsd]
root 18513 1 0 Mar21 ? 00:00:00 rpc.mountd
[...]
Il comando netstat ci permette di verificare che le porte siano realmente in listening e la relazione porte e servizio.
[root@draco root]# netstat -nap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN 497/rpc.statd
tcp 0 0 0.0.0.0:50789 0.0.0.0:* LISTEN 9911/rpc.mountd
tcp 0 0 0.0.0.0:41546 0.0.0.0:* LISTEN 18513/rpc.mountd
[...]
tcp 0 0 0.0.0.0:846 0.0.0.0:* LISTEN 666/rpc.rquotad
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 469/portmap
tcp 0 0 0.0.0.0:758 0.0.0.0:* LISTEN 9906/rpc.rquotad
tcp 0 0 127.0.0.1:860 127.0.0.1:111 TIME_WAIT -
udp 0 0 0.0.0.0:32768 0.0.0.0:* 497/rpc.statd
udp 0 0 0.0.0.0:33031 0.0.0.0:* 18513/rpc.mountd
udp 0 0 0.0.0.0:33045 0.0.0.0:* 9911/rpc.mountd
udp 0 0 0.0.0.0:673 0.0.0.0:* 497/rpc.statd
udp 0 0 0.0.0.0:843 0.0.0.0:* 666/rpc.rquotad
udp 0 0 0.0.0.0:111 0.0.0.0:* 469/portmap
udp 0 0 0.0.0.0:755 0.0.0.0:* 9906/rpc.rquotad
[...]
Oppure tramite l'utility rpcinfo che esegue un "probe" su di un host per verificare quali servizi si appoggiano a rpc.
[root@draco root]# rpcinfo -p
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 32768 status
100024 1 tcp 32768 status
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100021 1 udp 32770 nlockmgr
100021 3 udp 32770 nlockmgr
100021 4 udp 32770 nlockmgr
100011 1 udp 755 rquotad
100011 2 udp 755 rquotad
100011 1 tcp 758 rquotad
100011 2 tcp 758 rquotad
100005 1 udp 33045 mountd
100005 1 tcp 50789 mountd
100005 2 udp 33045 mountd
100005 2 tcp 50789 mountd
100005 3 udp 33045 mountd
100005 3 tcp 50789 mountd
Per la gestione e visualizzazione delle share esportate occorre appoggiarsi all'utility exportfs.
Visualizzazione delle share
[root@draco root]# exportfs
/home/ksfile 10.0.0.0/255.255.255.0
/home/kernel 10.0.0.0/255.255.255.0
/export 10.0.0.0/255.255.255.0
[root@draco root]# exportfs -v
/home/ksfile 10.0.0.0/255.255.255.0(ro,async,wdelay,no_root_squash)
/home/kernel 10.0.0.0/255.255.255.0(ro,async,wdelay,no_root_squash)
/export 10.0.0.0/255.255.255.0(ro,async,wdelay,no_root_squash)
Rilettura del file di configurazione /etc/export.
Comando utile per i cambiamenti in modalità run-time
[root@draco root]# exportfs -arv
exporting 10.0.0.0/255.255.255.0:/home/kernel
exporting 10.0.0.0/255.255.255.0:/home/ksfile
exporting 10.0.0.0/255.255.255.0:/export
Per avere statistiche e informazioni sul funzionamento di NFS, l'utility nfsstat fornisce varie utili opzioni:
Visualizzazione delle statistiche lato server
[root@draco root]# nfsstat -s
Server rpc stats:
calls badcalls badauth badclnt xdrcall
18729 0 0 0 0
Server nfs v2:
null getattr setattr root lookup readlink
0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
read wrcache write create remove rename
0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
link symlink mkdir rmdir readdir fsstat
0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
[...]
Visualizza un report riguardante il servizio RPC, sia dell'host locale sia di un possibile host remoto.
rpcinfo -p [host]
rpcinfo [-n portnum] -u host program [version]
rpcinfo [-n portnum] -t host program [version]
rpcinfo -b program version
rpcinfo -d program version
Opzioni:
-p
Visualizza tutti i processi/programmi che si basano su rpc attivi in quell'istante.
-u
Esegue una chiamata RPC tramite il protocollo UDP e ne visualizza un report.
-t
Esegue una chiamata RPC tramite il protocollo TCP e ne visualizza un report.
-n
Opzione per specificare il numero porta, quando si utilizzano le opzioni -u o -t.
-b
Esegue un RPC broadcast e visualizza tramite un report quali host hanno risposto.
-b
Esegue la cancellazione di un servizio RPC per un programma specifico (può essere eseguito solo da root).