Nfs-kernel-server: possibili problemi e prestazioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
NFS

Sommario

Spazio Kernel
  1. Lato server
  2. Lato client

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

È 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 l'identificazione degli utenti avviene esclusivamente tramite il loro UID, pertanto se banalmente 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.

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).

GID/UID 4294967294

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; tale numero identifica infatti l'utente nobody. Nel caso si utilizzi il protocollo v4 assicurarsi che nel file /etc/default/nfs-common del client risulti essere impostato NEED_IDMAPD=yes.

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
  • SFTP;
    • Velocità media trasferimento: 5,5 MB/s circa