Cloud with rain
.:G
G:.
0 and 1 serie, black on white
pulled card
myjsp.feelinglinux.com
ver. 1.1.9-4
Hallo, welcome to my world.
Here you can find some stuff about computer science.
<<< Enjoy your visit! >>>
0 and 1 serie, white on black

NFS (Network File System), configurazione client e server

        Scritto: Giansante Gabriele, 16/10/2016     

Introduzione NFS (Network File System)
Configurazione server (esempio su "CentOS 6.5")
Configurazione client (esempio su "CentOS 6.5")


Introduzione NFS (Network File System)

Di recente ho comprato un NAS ZyXEL economico da usare come repository per le tante foto che faccio nei miei viaggi e per conservare alcuni backup periodici dei miei server.
Sarebbe comodo produrre i backup e spostarli in automatico sul NAS.
Per ottenere il mio scopo, ho visto che questo NAS ha il supporto ad NFS mediante l'aggiunta di un modulo opportunamente configurabile.
L'articolo prende spunto da questa situazione in cui mi sono trovato.
Pubblicita'

Ma cos'e' NFS?

NFS sta per "Network File System", un protocollo standard creato negli anni '80 ed usato per la condivisione di porzioni di filesystem attraverso una rete locale.
Mediante NFS possiamo rendere disponibile, in modo logico, parte di un filesystem situato su una macchina ad un'altra macchina che lo potra' vedere ed usare come fosse presente localmente (seguendo comunque determinate regole imposte nella configurazione della condivisione).

Appare evidente che e' necessaria una componente server (che condivide) ed una componente client (che accede alla porzione di filesystem condivisa).

Vedremo come configurare Linux CentOS (ma va bene qualsiasi distribuzione con le opportune modifiche) prima come server, poi come client.

Innanzitutto dobbiamo procurarci il software necessario, se non e' gia' installato.
Ricordo che sto usando un Linux CentOS come riferimento.
Da linea di comando digitiamo (come da screenshot) "yum search nfs" per cercare i package disponibili per la gestione del NFS.
Ricerca package NFS

Ricerca package NFS
Guardando le descrizioni, ci interessano
  • nfs-utils (utility client, server daemon)
  • nfs-utils-lib (librerie di supporto)
Installiamo sia sul client che sul server i due pacchetti con i seguenti comandi
    [root@cattivik ~]# yum install nfs-utils
    [root@cattivik ~]# yum install nfs-utils-lib
Se i due package in questione dovessero essere gia' installati, i comandi precedenti non avrebbero effetto.
Vediamo il contenuto di "nfs-utils" (ho evidenziato i file che ci interessano per gli scopi di questo articolo):
    [root@cattivik ~]# rpm -ql nfs-utils
    /etc/nfsmount.conf
    /etc/rc.d/init.d/nfs
    /etc/rc.d/init.d/nfslock
    /etc/rc.d/init.d/rpcgssd
    /etc/rc.d/init.d/rpcidmapd
    /etc/rc.d/init.d/rpcsvcgssd
    /etc/request-key.d/id_resolver.conf
    /etc/sysconfig/nfs
    /sbin/mount.nfs
    /sbin/mount.nfs4
    /sbin/nfs_cache_getent
    /sbin/rpc.statd
    /sbin/umount.nfs
    /sbin/umount.nfs4
    /usr/sbin/exportfs
    /usr/sbin/mountstats
    /usr/sbin/nfsidmap
    /usr/sbin/nfsiostat
    /usr/sbin/nfsstat
    /usr/sbin/rpc.gssd
    /usr/sbin/rpc.idmapd
    /usr/sbin/rpc.mountd
    /usr/sbin/rpc.nfsd
    /usr/sbin/rpc.svcgssd
    /usr/sbin/rpcdebug
    /usr/sbin/showmount
    /usr/sbin/sm-notify
    /usr/sbin/start-statd
    [... doc, man, lib ...]
Pubblicita'

Configurazione condivisione (server)

La condivisione dei file avviene attraverso l'utilizzo di RPC (Remote Procedure Call). Per questo motivo avremo bisogno, oltre all'utility nfs, anche di un altro oggetto, "rpcbind", ovvero un server che "mappa" numeri RPC di programma in indirizzi universali accessibili tramite interrogazione dai client (in pratica le stesse funzioni di un DNS).
Verifichiamo che "rpcbind" sia installato:
    [root@cattivik ~]# rpm -qa rpcbind
    rpcbind-0.2.0-12.el6.i686
se non dovesse essere presente, lo possiamo installare con il solito "yum" (o software analogo per altre distribuzioni)
    [root@cattivik ~]# yum install rpcbind
Con "rpcbind" e "nfs-utils" abbiamo tutto cio' che ci serve per procedere:
  1. configurare la condivisione
  2. avviare il servizio "rpcbind"
  3. avviare il servizio "nfs"

Prima di avviare i servizi necessari, dobbiamo decidere cosa condividere, come farlo e a chi condividere.
Supponiamo di voler attivare le seguenti condivisioni:
    • Cartella: "/home/pippo/documents" (ad esempio i documenti dell'utente "pippo")
    • Client: tutti i PC della rete locale 192.168.20.1/255.255.255.0
    • Modalita': sola lettura

    • Cartella: "/data/projects/chess" (ad esempio progetto gioco scacchi)
    • Client: solo 192.168.20.100 e 192.168.20.140
    • Modalita': sia lettura che scrittura per il ".100", sola lettura per ".140"

La configurazione delle condivisioni puo' essere fatta nel file "/etc/exports" oppure possono essere creati, a seconda delle esigenze, vari file "<nome>.exports" posti nella cartella "/etc/exports.d". Sia "/etc/exports" che i file in "/etc/exports.d" hanno lo stesso formato (visto piu' avanti).
Per "esportare" le cartelle indicate, in questo articolo, modifichiamo il file "/etc/exports"
    [root@cattivik ~]# vi /etc/exports
Questo file contiene la tabella di export del server NFS, ovvero un elenco di risorse locali che devono essere rese accessibili ai client nfs. Il programma "exportfs" (evidenziato nell'elenco di file di "nfs-utils") leggera' prima "/etc/exports" e poi tutti i file dentro "/etc/exports.d" con il nome nel formato corretto, ignorando gli altri.
Ogni linea della tabella di export e' formata da una cartella da esportare, opzioni globali (facoltative) applicabili a tutti i client, l'elenco dei client (singoli host, reti, ecc.) verso cui esportare, opzioni per i singoli client che definiscono la modalita' di esportazione.
    <cartella> -<opz.Globali> <client-1>(<opz.Client-1>) <client-2>(<opz.Client-2>) ...
Le opzioni a disposizione sono varie, leggere il manuale exports(5) per scoprirle tutte (" Manpage of EXPORTS (5) ").

Inseriamo le nostre condivisioni (le linee vuote non sono considerate, quelle che cominciano per "#" rappresentano commenti):
    # File /etc/exports

    # Es. documenti utente "pippo"
    /home/pippo/documents 192.168.20.1/255.255.255.0(ro,subtree_check)

    # Es. nuovo gioco di scacchi
    /data/projects/chess 192.168.20.100(rw,no_root_squash,sync) 192.168.20.140(ro)
La cartella documenti viene esportata come sola lettura (opzione "ro", ovvero "read only") e con la verifica della struttura della cartella abilitata ("subtree_check", per default disabilitata, messa per mostrare l'utilizzo di piu' opzioni).
La cartella del progetto "chess" viene esportata a due client di cui il primo con diritti di lettura e scrittura (opzione "rw", ovvero "read write"), il secondo con diritti di sola lettura ("ro"). Inoltre per il primo client sono state specificate altre due opzioni, "no_root_squash" e "sync". L'opzione "no_root_squash" e' indispensabile per consentire al client di scrivere nella cartella (se questa e' accessibile solo da root). L'opzione "sync" (opzionale perche' abilitata per default) indica che ogni risposta a richieste del client deve essere fornita solo quanto tutte le modifiche sono state "committate" (fissate). L'opzione "async" assicura l'indipendenza da eventuali "commit" (meno sicura).

Le configurazioni contenute in "/etc/exports" e nei file "/etc/exports.d/*", in realta' non sono utilizzate direttamente, ma devono essere "compilate" ed inserite in un file binario che verra' utilizzato ad ogni richiesta di mount da parte di un client.
Il file binario contenente l'insieme degli "export" e'
/var/lib/nfs/etab
Non modificheremo a mano questo file perche' ci pensera' per noi il comando "/usr/sbin/exportfs".
Il comando "exportfs" si occupa di mantenere aggiornata la tabella di export effettivamente utilizzata con i dati contenuti nei file che abbiamo modificato in precedenza. Inoltre consente di inserire condivisioni al volo o di rimuovere condivisioni in atto senza passare per gli "/etc/exports*". Vedere " Manpage of EXPORTFS (8) " per ulteriori dettagli sul comando.

Proviamo a compilare (l'opzione "a" aggiunge tutto, l'opzione "v" stampa dettagli):
    [root@cattivik ~]# exportfs -av
    exporting 192.168.20.100:/data/projects/chess
    exporting 192.168.20.140:/data/projects/chess
    exporting 192.168.20.1/255.255.255.0:/home/pippo/documents
    exporting 192.168.20.100:/data/projects/chess to kernel
    exportfs: internal: no supported addresses in nfs_client
    exportfs: 192.168.20.100:/data/projects/chess: No such file or directory

    exporting 192.168.20.140:/data/projects/chess to kernel
    exportfs: internal: no supported addresses in nfs_client
    exportfs: 192.168.20.140:/data/projects/chess: No such file or directory

Qualcosa non va. Proviamo allora ad avviare i servizi necessari ("rpcbind" e, soprattutto, "nfs").
    [root@cattivik ~]# service rpcbind start
    Avvio di rpcbind:                                          [  OK  ]
    [root@cattivik ~]# service nfs start
    Avvio dei servizi NFS:                                     [  OK  ]
    Avvio delle quote NFS:                                     [  OK  ]
    Avvio di NFS mountd:                                       [  OK  ]
    Avvio del demone NFS:                                      [  OK  ]
    Avvio di RPC idmapd:                                       [  OK  ]
    [root@cattivik ~]# exportfs -av
    exporting 192.168.20.100:/data/projects/chess
    exporting 192.168.20.140:/data/projects/chess
    exporting 192.168.20.1/255.255.255.0:/home/pippo/documents

Perche' "exportfs" funzioni come vogliamo, devono essere attivi i "servizi NFS".
Attenzione che il servizio "rpcbind" deve essere attivato prima di ogni altro servizio che utilizzi RPC.

Se si vuole modificare la tabella di condivisione (eliminando condivisioni, aggiungendone altre o modificandone alcune delle esistenti), possiamo modificare i file di configurazione e lanciare successivamente il comando
    [root@cattivik ~]# exportfs -rv
che esporta nuovamente tutte le cartelle indicate sincronizzando il file /var/lib/nfs/etab con le modifiche effettuate.

Ricapitolando, una volta configurato il tutto, per attivare la condivisione con NFS, e' necessario
  • attivare rpcbind: service rpcbind start
  • attivare nfs: service nfs start
  • esportare, se necessario: exportfs -a, exportfs -r
A questo punto il server dovrebbe essere in ascolto delle richieste dei client come indicato nella configurazione.

Ulteriori opzioni di configurazione per il server nfs possono essere modificate nel file
/etc/sysconfig/nfs
Fra queste opzioni, una che potrebbe valere la pena di modificare e' "MOUNTD_PORT", ovvero la porta su cui sara' in ascolto "rpc.mountd". Per default la proprieta' e' commentata, scommentandola abiliteremmo l'ascolto sulla porta di default 892 o su qualsiasi altra porta decidessimo di usare. Questa porta serve, ad esempio, per l'utilizzo del comando "showmount" con cui un client puo' scoprire le cartelle condivise messe a disposizione dal server.
P.S.: A seconda della politica di sicurezza adottata sulla rete, per consentire la comunicazione, potrebbe essere necessario aprire sui firewall determinate porte (le prime due obbligatoriamente):
  • 111: servizio rpcbind
  • 2049: servizio nfs
  • altre porte: specificate in /etc/sysconfig/nfs
Pubblicita'


Configurazione lato client

Configurare il client e' decisamente piu' semplice. Fermo restando il fatto che deve essere possibile comunicare attraverso le porte "2049", "111" e tutte le altre del caso, dobbiamo procedere come segue:
  • Installare "nfs-utils"
  • Decidere a quali cartelle condivise accedere
  • Eseguire il mount sulle cartelle condivise scelte
  • Opzionalmente, configurare il mount automatico sulle cartelle scelte
L'installazione di "nfs-utils" e "nfs-utils-lib" e' stata gia' vista nel paragrafo relativo alla configurazione del server.
Ricapitolando, se i package non sono stati gia' installati, lo si puo' fare con
    [root@paperino ~]# yum install nfs-utils
    [root@paperino ~]# yum install nfs-utils-lib
Nel paragrafo relativo al server abbiamo configurato la condivisione della cartella "/data/projects/chess" per il client "192.168.20.100". Supponiamo ora di configurare appunto il client "192.168.20.100" (paperino) per accedere alla cartella remota (il tutto e' facilmente applicabile a qualsiasi altra condivisione).

Vogliamo che la cartella condivisa sia accessibile tramite il percorso locale
/mnt/nfs/chess
Creiamo le cartelle locali
    [root@paperino ~]# mkdir /mnt/nfs
    [root@paperino ~]# mkdir /mnt/nfs/chess
Per una connessione base non serve altro. Supponiamo che il server su cui e' configurata la condivisione abbia indirizzo IP 192.168.20.50 (cattivik). Con il comando "showmount -e <host>" controlliamo quali mount point sono disponibili sul server (lato server deve essere aperta la porta specificata con l'opzione "MOUNTD_PORT" in "/etc/sysconfig/nfs"), mentre con il comando "mount" montiamo effettivamente la cartella condivisa:
    [root@paperino ~]# showmount -e 192.168.20.50
    Export list for 192.168.20.50:
    /home/pippo/documents 192.168.20.1/255.255.255.0
    /data/projects/chess  192.168.20.100,192.168.20.140
    [root@paperino ~]# mount 192.168.20.50:/data/projects/chess /mnt/nfs/chess
La sintassi del "mount" e' la seguente:
mount <host>:<cartellaRemota> <mountLocale>
Verifichiamo l'effetto del mount:
    [root@paperino ~]# df -hPT
    Filesystem                          Type   Size  Used Avail Use% Mounted on
    /dev/mapper/vg_cattivik-lv_root     ext4    35G  6,4G   27G  20% /
    tmpfs                               tmpfs  947M  612K  947M   1% /dev/shm
    /dev/sda1                           ext4   477M   56M  396M  13% /boot
    192.168.20.50:/data/projects/chess  nfs    6,5G  1,8G  4,4G  30% /mnt/nfs/chess
Il comando "df" mostra statistiche sull'utilizzo dello spazio di memorizzazione su ogni partizione montata. L'opzione "h" mostra i valori in formato piu' leggibile, l'opzione "P" formatta l'output in formato Posix (formattazione migliore rispetto a quella di default), l'opzione "T" mostra il tipo di filesystem.

Ed ora testiamo la possibilita' di scrittura:
Client (192.168.20.100)

    [root@paperino ~]# cd /mnt/nfs/chess
    [root@paperino chess]# echo "ciao" > pippo.txt
    [root@paperino chess]# ls
    pippo.txt

Server (192.168.20.50)

    [root@cattivik ~]# cd /data/projects/chess
    [root@cattivik chess]# cat pippo.txt
    ciao

Per "smontare" la cartella si usa il solito comando "umount".

Un ultimo passaggio, non obbligatorio ma sicuramente comodo, e' configurare il mount automatico della cartella condivisa.
Per eseguire il mount automatico basta modificare "/etc/fstab", esattamente come per tutti gli altri filesystem.
    [root@paperino ~]# vi /etc/fstab
Inseriamo una riga relativa al mount della cartella condivisa (" Manpage di FSTAB (5) " per dettagli sul formato)
    #remoto                             locale          tipo  opzioni
    192.168.20.50:/data/projects/chess  /mnt/nfs/chess  nfs   defaults  0 0
Ad ogni reboot la cartella sara' montata automaticamente.
Opzioni relative al mount possono essere configurate in
/etc/nfsmount.conf

Le applicazioni a quanto visto sono praticamente infinite, vanno dalla condivisione dei documenti, alla condivisione di progetti, salvataggio backup su server esterni e quant'altro ci possa suggerire la fantasia.

Ricordo che per approfondimenti possono essere lette le seguenti pagine del manuale


Hai trovato utile questo articolo?
Aiutami a condividerlo o metti un "mi piace".
Grazie mille!


Gli strumenti di condivisione (Google+, Facebook) sono visibili in alto a destra solo dopo aver accettato la policy di utilizzo dei cookie per questo sito.
FAQ - Come faccio a cambiare la mia scelta?

 

Strumenti (myjsp.feelinglinux.com)
Gioco: allenamento con la tastiera Strumenti di codifica/decodifica URI (%-encoding) e Base64 Strumenti di calcolo online per IP e Reti
QUIZ GAME
Quiz game

Cerca @myjsp.feelinglinux.com

Pubblicita'