NFS(Network File System) es un sistema de ficheros el cual puede ser importado por los clientes, de este modo se consigue compartir directorios por red entre diferente máquinas.
En el kernel debemos tener habilitado la parte del cliente o del servidor según corresponda:
Servidor:
NOTA: En la versión 4 se pasa de UDP a TCP.
La configuración de los directorios a exportar están en el fichero:
DIR IP(OPCIONES):
/data/AAA IP/32(rw,no_root_squash,no_subtree_check,insecure)
Las opciones disponibles son:
- rw –> Permite lectura y escritura
- sync/async –> Permite responder al cliente confirmando la ejecución de una escritura cuando todavÃa no se ha escrito al HD
- no_wdelay –> El servidor normalmente esperará a acumular un cierto número de escrituras para volcar al HD, con esto forzamos que escriba al momento. Si async está activo esta opción no puede habilitarse.
- nohide –> Si se importa un directorio que tiene otro directorio montado dentro de este y el de nivel inferior reside en otra partición el cliente solo será capaz de ver el contenido del superior.
Con esta opción activada se mostrará el contenido de SDB1 montando SDA1. Pero en el exports se tendrán que definir las dos entradas, la del padre y la del hijo, indicando en el padre la opción nohide.
- crossmnt –> Es equivalente a nohide pero no hace falta hacer las entradas en exports del directorio hijo.
- no_subtree_check –> Además de comprobar si el fichero solicitado está en un sistema de ficheros exportado comprueba que también lo esté el directorio(puede dar problemas si se accede a un fichero y otro cliente lo renombra).
- insecure –> Permite el acceso a los clientes que no utilizan un puerto reservado para NFS
- insecure_locks, no_auth_nlm –> En cada bloqueo de fichero(para que no haya inconsistencia al acceder dos clientes), se solicitan credenciales(el id-user con el que se ha conectado al NFS), hay clientes viejos que no soportan esto por lo tanto solo pueden bloquear ficheros que tienen permisos de letura para todo el mundo, si habilitamos esta opción ya podrá bloquear otros ficheros.
- no_acl –> Se puede tener un sistema de ficheros con soporte para ACLs y el kernel preparado para ello, se puede configurar NFS para que no revele las ACLs al cliente, solo le pasa un sub-set los permisos. Para versiones 2 y 3(viejas) de NFS habilitar este parámetro es seguro ya que estos clientes realizan las decisiones de que pedir al servidor de forma local(el servidor luego en su parte supongo que también lo comprobará), en versiones mas modernas de NFSv3 esto se realiza a través de RPC.
- mp –> Imaginemos que tenemos una partición para boot en /boot, exportamos /boot pero el montaje falló por lo que sea, se estarÃa exportando el directorio de la partición de raÃz, indicando el punto de montaje a exportar de este modo la exportación fallarÃa ;)
- fsid=num|root|uuid –> Le indicamos a NFS como debe identificar cada sistemas de ficheros a exportar. Por UUID(identificativo de partición, nuevo estilo fstab), por número el equivalente del UUID en kernels < 2.6.20, ya que estos no soportan UUID y root para indicarle a NFSv4 que ese directorio exportado se trata de raÃz.
- refer=path@host[+host][:path@host[+host]] –> Esta opción sirve para enlazar un directorio exportado con otro que está exportando un segundo servidor NFS(cadena de exportación). Solo lo soporta V4 por parte de servidor, los clientes es indistinto ya que se les presenta como un enlace simbólico ;)
Si SERVER1 exporta /exports/doc en SERVER2 podemos configurar una exportación tal que asÃ:
exportnfs_docs   *  (rw,async,insecure,no_root_squash,no_subtree_check,refer=/docs@SERVER1)
- replicas=path@host[+host][:path@host[+host]] –> Si el cliente pregunta por una localización alternativa del directorio exportado se le presentará una lista(útil cuando se tienen replicas de los datos en diferentes servidores)
- root_squash –> El control de acceso a los directorios exportados se controla en base al UID del cliente, para el caso de root puede no ser conveniente este comportamiento por lo tanto cuando el cliente se conecta al servidor NFS su UID se remapea a anonymous o nobody.
- no_root_squash –> Se conserva el UID de root
- all_squash –> Se remapean TODOS los UIDs a anonymous.
- anonuid –> Mapea TODOS los UIDs al ID indicado
- anongid –> Mapea TODOS los GUIDs al ID indicado
Arranque del servicio:
rc-update add nfs default
Podemos recargar la config sin reiniciar el servicio NFS:
Para ver si hay clientes conectados:
Podemos forzar al cliente a utilizar una versión determinada de NFS:
OPTS_RPC_MOUNTD="-V 4 -N 3 -N 2"
Hemos forzado la 4 y deshabilitado la 3 y la 2
Cliente:
/etc/init.d/rpc.statd start
mkdir /mnt/nfs
mount -t nfs IP:DIR /mnt/nfs
Si se desea se puede configurar en el fstab:
IP:DIR /mnt/nfs nfs rw,vers=4,async,noatime,nodiratime,soft,timeo=3,intr 0 0 0 0
NOTA: El parámetro Soft nos evitará muchos problemas cuando el NFS esté inaccesible, ya que intentará acceder al recurso y al no conseguirlo arrojará un error, no se quedará intentándolo indeterminadamente hasta colapsar el servidor por completo, XDD. Bajamos el Timeout a la mitad y permitimos llamadas a interrupciones, muy útil para evitar ls colgados por NFSs inaccesibles.
rc-update add nfsmount default
Si el nfs se va a utilizar desde Apache:
If the pages are served from a remote file system (NFS, Samba), it is necessary to disable the use of mmap and sendfile.
<Directory "/var/www/data">
EnableMMAP off
EnableSendfile off
</Directory>
Troubleshooting:
Cliente:
df -h, mount –> Dir montados
Hay ocasiones en las que debido a problemas en la red NFS se queda perchado los pasos para recuperarlo serÃan:
- Matar todos los procesos que estén utilizando la ruta importada
- umount -l PATH
- mount PATH
Servidor:
rpcinfo -p –> Servicios arrancados
exportfs -v –> Directorios exportados
netstat -tn | egrep ‘2049|Active|Proto’ –> Conexiones