Nfs-kernel-server: possibili problemi e prestazioni
NFS |
Sommario |
|
Diagnostica
Comandi utili
Determinare le versioni di protocollo ammesse dal server mio_server:
# rpcinfo -p mio_server
Un output del seguente tipo dimostra che tutti i protocolli sono abilitati:
100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100005 1 udp 39543 mountd 100005 1 tcp 57880 mountd 100005 2 udp 55276 mountd 100005 2 tcp 37396 mountd 100005 3 udp 43230 mountd 100005 3 tcp 59453 mountd
rpc.mountd è in sintesi il demone che si occupa di esportare le risorse da condividere per i protocolli v1, v2 e v3. Se nel precedente elenco non dovessero comparire le righe relative a mountd per una certa versione del protocollo, è possibile che non si riesca ad accedere alle risorse condivise usando la relativa versione del protocollo di NFS.
Visualizzare le risorse montate sul client in uso tramite protocolli v2-v3:
# mount -l -t nfs
Visualizzare le risorse montate sul client in uso tramite protocollo v4:
# mount -l -t nfs4
Entrambi i suddetti comandi permettono quindi di accertarsi che una certa risorsa oltre che essere effettivamente montata utilizzi anche la versione di protocollo desiderata.
Visualizzare le risorse esportate dal server mio_server:
# showmount -e mio_server
Visualizzare le proprietà del collegamento col/i server NFS (compresa la versione del protocollo in uso):
# nfsstat -m
Errori
Le risorse remote non vengono caricate...
...nemmeno manualmente con mount
Una prima verifica banale è quella di assicurarsi che la cartella dove devono essere montate le risorse remote sia indicata correttamente (per esempio /home/nfs
è DIVERSO da /home/NFS
). Una seconda causa potrebbe essere dovuta al numero della porta che NFS sceglie casualmente, infatti se il numero della porta è maggiore di 1024 scatta un errore di sicurezza; in tal caso è sufficiente aggiungere alle opzioni indicate nel file /etc/exports
anche insecure, ad esempio (nfsv4):
/home 192.168.1.0/24(rw,fsid=0,no_subtree_check,sync,insecure) /home/altro 192.168.1.0/24(rw,no_subtree_check,sync,insecure)
Un altro motivo potrebbe essere costituito dal set di permessi delle cartelle esportate; provare ad impostare temporaneamente i loro permessi su 777. Se il problema è risolto provare a reimpostare i permessi sul vecchio schema e vedere se l'errore si ripropone.
...in automatico all'avvio
Se le risorse remote non vengono automaticamente caricate all'avvio, ma è comunque possibile caricarle manualmente, assicurarsi in primis che nella riga dedicata al caricamento delle risorse remote in /etc/fstab/
sia presente l'opzione _netdev, se assente, aggiungerla e provare a riavviare.
Qualora il problema persista controllare il file /var/log/syslog
alla ricerca di un messaggio come il seguente:
if-up.d/mountnfs[eth0]: if-up.d/mountnfs[eth0]: lock /var/run/network/mountnfs exist, not mounting
In caso affermativo digitare:
# ls -ahl /var/run/network/mountnfs
Se la cartella è vuota, a meno dei soliti .
e ..
, eliminarla:
# rm -R /var/run/network/mountnfs
Altrimenti limitarsi a rinominarla, per esempio digitando:
# mv /var/run/network/mountnfs /var/run/network/nome_a_caso
A questo punto riavviando le risorse dovrebbero venir automaticamente caricate all'avvio.
Accesso in sola lettura o nessun accesso
La prima cosa da fare è verificare di aver definito correttamente i giusti permessi lato server, sia direttamente sulle directory condivise sia nel file /etc/exports
. Se è effettivamente tutto giusto allora potrebbe essere un problema di mappatura utenti non corretta.
Avvio lento dei client con server spento
Nel caso il server sia spento e sulla macchina client sia presente un collegamento simbolico alle risorse esterne, creato per esempio con un comando del tipo:
# ln -s /home/nfs/nome_arbitrario /home/nome_utente/nome_arbitrario
è probabile che si noti un ritardo di circa 2 minuti all'avvio di gnome (nel caso di caricamento automatico all'avvio) ed ogni volta che si lancia nautilus per visualizzare una qualche cartella. La semplice presenza del collegamento simbolico è infatti sufficiente ad innescare una richiesta di caricamento per le risorse remote, con la conseguenza che essendo il server spento queste falliscano inevitabilmente. Di base nfs è impostato per ripetere la richiesta di caricamento risorse dopo 2 minuti, ecco dunque da dove nascerebbero il ritardo sistematico. In tal caso la soluzione più semplice è rinunciare ai collegamenti simbolici verso le risorse remote caricate tramite nfs, altrimenti è possibile ridurre tale ritardo specificando nelle opzioni di mount (o di fstab o di auto.nfs, ecc.) retry=X
, dove X è il nuovo numero di minuti (si noti che l'opzione retrans
è utile solo nel caso si usi l'opzione soft e non hard).
Può anche capitare che uno o più processi legati a nfs rimangano in sospeso nonostante il server sia normalmente funzionante; in tal caso se si sono specificate le opzioni hard,intr
dovrebbe essere possibile uccidere i relativi processi con kill -9 pid
, in caso contrario è probabile che non ci sia altra soluzione che riavviare brutalmente la macchina client.
Altre problematiche sono descritte al punto 7 di questa pagina.
Il server si congela durante il trasferimento di grossi file
Potrebbe capitare che trasferendo grossi file il server si congeli obbligando ad un riavvio forzato, in tal caso potrebbe essere utile specificare sulla macchina client le opzioni rsize (influenza le operazioni di scrittura sulla macchina client) e wsize (influenza le operazioni di scrittura sulla macchina server) indicando valori non troppo grandi, per esempio:
- Caso statico:
mount -t nfs4 -o _netdev,rsize=4096,wsize=4096,hard,intr indirizzo_server:/ /home/NFS
- Caso statico, file
/etc/fstab
aggiungere (o modificare quella già esistente):indirizzo_server:/ /home/NFS nfs4 _netdev,auto,rsize=4096,wsize=4096,hard,intr 0 0
- Caso dinamico, file
/etc/auto.nfs
aggiungere (o modificare quella già esistente)nome_arbitrario -fstype=nfs4,_netdev,rsize=4096,wsize=4096,hard,intr indirizzo_server:/
A tal proposito potrebbe essere utile leggere questo.
Crollo della velocità di trasferimento dati
Potrebbe anche capitare nel caso di NFSv4 che la macchina client veda crollare drasticamente a poche centinaia di kb/s la velocità di trasferimento dati quando si va a scrivere sulla macchina server grossi file. In tal caso controllare in primis di usare l'opzione crossmnt
invece di nohide
(si riveda la sezione dedicata al rimontaggio delle cartelle), se anche questo non funziona provare ad aggiungere nel file exports
le opzioni async
e no_wdelay
ad ogni cartella da esportare. Un'altra possibilità è provare ad usare il protocollo UDP invece di TCP, si tratta di aggiungere l'opzione proto=UDP
al comando mount
(trattasi cioè di un opzione lato client). Se anche questo non dovesse funzionare provare a guardare questa pagina (si tratta di ricompilare il kernel, sempre che poi sia proprio questo il problema).
Problemi di UID e GID
Mappatura utenti non corretta
È possibile che pur avendo configurato correttamente server e client l'accesso alle risorse non sia completo come invece ci si aspetterebbe. Una tipica causa è una scorretta mappatura degli utenti tra client e server, ovvero un diverso valore di UID per lo stesso utente tra server e client; si sottolinea che questa situazione non può evidentemente verificarsi in quelle reti dove l'autenticazione degli utenti è centralizzata tramite controller di dominio.
Come già detto nella sezione sicurezza della pagina principale i permessi unix degli utenti sono attribuiti esclusivamente tramite il loro UID, pertanto se pur avendo gli stessi utenti su server e client questi sono stati creati in ordine differente si avrà appunto una discrepanza tra UID del client e del server. Questo potrebbe comportare che per il server l'utente Caio ha UID=1000, mentre per il client ha UID=1001; in tal caso quando Caio dalla sua macchina client accede alle risorse del server non viene identificato come Caio, ma come quell'utente che sul server ha UID=1001. Evidentemente se si è impostata una risorsa per consentire l'accesso in lettura e scrittura solo a Caio, quest'ultimo si vedrà negato il permesso di scrittura quando accede alle risorse tramite NFS, proprio perché per il server lui non è Caio, ma un altro utente.
In tale circostanza quindi l'utente o permette l'accesso in scrittura a tutti, oppure deve cambiare sul client (o sul server) l'UID dell'utenza desiderata in modo che il valore sia il medesimo per entrambi.
4294967294:4294967294 (nfsv4)
Se dal lato client si ottiene il valore 4294967294 (che significa "-1" sui sistemi a 64 bit) come GID/UID di file e/o cartelle remote allora molto probabilmente esiste un problema di mappatura utenti tra client e server. Nel caso si utilizzi il protocollo v4 assicurarsi che nel file /etc/default/nfs-common
del client risulti essere impostato NEED_IDMAPD=yes
(scrivere yes minuscolo per sicurezza). Se così non fosse modificare tale file e riavviare nfs-common:
/etc/init.d/nfs-common restart
nobody:nogroup (nfsv4)
Assicurarsi che i file /etc/idmapd.conf
del server e dei client siano coerenti tra loro, in particolare assicurarsi che la voce Domain sia la medesima per tutte le macchine. Si riveda la relativa sezione nella pagina di configurazione del server.
Si noti infine che anche se i gruppi e gli utenti figurano tutti come nogroup e nobody questo non significa a priori che gli utenti non siano stati mappati correttamente, ovvero è tranquillamente possibile che ogni utente abbia accesso alle risorse condivise con i permessi corretti pur vedendo (lato client) utente e gruppo sempre come nobody:nogroup
.
Altro
Si provi questa pagina
Prestazioni
È possibile migliorare le prestazioni affinando i valori dei vari parametri, ed è argomento tutt'altro che ridotto, come dimostrato qui e qui.
I primi parametri da controllare sono tuttavia rsize
e wsize
, che di base valgono 8192 per NFSv2-NFSv3 e 32768 per NFSv4. Stando al manuale tali valori devono essere multipli interi di 1024 e compresi tra un minimo di 4096 byte e 1048576 byte.
Esempio 1
- Cavo rete sstp cat.6, L = 50 m;
- Server: Debian Wheezy, AMD Sempron 145 2,8 GHz, scheda di rete GBit integrata, HD 2,5" sata II 5400 rpm ext4, DDr2 2 GB 667 Mhz ram;
- Client: Debian Wheezy, Intel Core Duo 2 3 GHz, scheda di rete GBit integrata, HD 3,5" sata II 5400-7200 rpm (caviar green) ext4, DDr2 3 GB 1066 Mhz ram;
- File trasferito: video '.mkv' da 8 GB.
- NFSv4: rsize=wsize=65536,sync,TCP,no_subtree_check,hard,intr;
- Velocità media trasferimento Server --> Client: 49,8 MB/s circa
- Velocità media trasferimento Client --> Server: 72,8 MB/s circa
- SFTP;
- Velocità media trasferimento Server --> Client: 22,8 MB/s circa
- Velocità media trasferimento Client --> Server: 26,3 MB/s circa
Esempio 2
- Come esempio 1 salvo ove diversamente specificato;
- Server: Debian Squeeze, AMD Athlon (slot A) 650 MHz, scheda di rete GBit PCI, HD 3,5" ATA100 5400 rpm ext4 lvm2, DIMM 364 MB ram 100 Hz;
- NFSv4: rsize=wsize=8192,sync,TCP,no_subtree_check,hard,intr;
- Velocità media trasferimento: 15 MB/s circa
- Velocità media trasferimento: 15 MB/s circa
- SFTP;
- Velocità media trasferimento: 5,5 MB/s circa