Esta pagina se ve mejor con JavaScript habilitado

Compartir ficheros mediante NFS

 ·  🎃 kr0m

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:

File systems –> Network File Systems –> NFS client support, NFS server support


Servidor:

emerge -av nfs-utils

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:

vi /etc/exports

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:

/etc/init.d/nfs start
rc-update add nfs default

Podemos recargar la config sin reiniciar el servicio NFS:

exportfs -r

Para ver si hay clientes conectados:

nfsstat

Podemos forzar al cliente a utilizar una versión determinada de NFS:

vi /etc/conf.d/nfs

OPTS_RPC_MOUNTD="-V 4 -N 3 -N 2"

Hemos forzado la 4 y deshabilitado la 3 y la 2


Cliente:

emerge -av nfs-utils
/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:

vi /etc/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.

/etc/init.d/nfsmount start
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:

netstat -tn | egrep ‘2049|Active|Pro’ –> Conexiones
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:

netstat -nputa | egrep ‘rpc|Active|Proto’
rpcinfo -p –> Servicios arrancados
exportfs -v –> Directorios exportados
netstat -tn | egrep ‘2049|Active|Proto’ –> Conexiones

Si te ha gustado el artículo puedes invitarme a un RedBull aquí