NFS

NFS permite compartir directorios por red de forma sencilla en entorno Linux, aunque como todo tiene sus pegas (la principal, es sensible por defecto a cortes en la conexión cliente-servidor)

A continuación un pequeño ejemplo, en el que compartimos el directorio /nas/work/dir1 en server2 para que esté accesible en el directorio /mnt/server2/dir1 en client.

En NFS, configuramos lo que queremos hacer en ambos extremos. En el servidor, el fichero clave es /etc/exports:

# Una chuleta rápida de las opciones disponibles está en "man exports"
# Generalmente se puede omitir el fsid, pero si el sistema de ficheros donde se encuentra
# /nas/work/dir1 es XFS, <a href="https://www.mmacleod.ca/blog/2014/02/nfs-exports-and-xfss-inode64-mount-option/">mejor especificarlo</a> (a fin de evitar esotéricos problemas al montar
# o acceder al directorio...)
# rw -> lectura y escritura
# no_subtree_check -> "as a general guide, disable subtree_check"
# no_root_squash -> no "mapear" uid/gid 0 al uid/gid "anonymous"
/nas/work/dir1 client.xyz.com(rw,no_subtree_check,no_root_squash,fsid=1)

Ojo con utilizar fsid=0, ya que tiene un significado especial (“NFS root”)

Luego notificamos los cambios con exportfs:

# -r notifica y también hace limpieza (directorios que se han eliminado de /etc/exports)
# -f limpia completamente la tabla de exportacion en el kernel, y va añadiendo nuevas 
#    entradas segun los clientes hacen peticiones
exportfs -r

En el cliente, modificamos /etc/fstab:

# Una chuleta rápida de las opciones disponibles está en "man nfs"
# defaults -> opciones por defecto (se pueden comprobar concretamente con "mount" o "nfsstat -m"
#    Habitualmente son: relatime, vers=4, rsize=1048576, wsize=1048576, namlen=255, 
#    proto=tcp, port=0, sec=sys, minorversion=0, local_lock=none
# soft,retrans=N -> despues de N retransmisiones, se aborta la operación (hay una cierta
#    probabilidad de "corrupción de datos silenciosa")
# timeo=D -> esperar D decimas de segundo antes de reintentar mandar la petición (retransmisión)
# bg, retry=M -> permanecer intentando "montar" el recurso NFS en segundo plano (background)
#    durante M minutos
# intr -> permitir que señales interrumpan operaciones NFS (se ignora desde el kernel 2.6.25)
server2.xyz.com:/nas/work/dir1 /mnt/server2/dir1 nfs defaults,bg,retry=5,timeo=5,soft,retrans=5 0 0

Resolución de problemas

  • Añade la opción “-v” a mount
  • Verifica que el cliente puede ver los puertos del servidor (con nmap o similar)
  • showmount -e SERVER
  • rpcinfo -p SERVER
  • rpcdebug

Mas info: NFS Troubleshooting

Why file and directory operations are synchronous in NFS

Cuotas XFS

Una de las ventajas del sistema de ficheros XFS es que permite establecer cuotas de disco por directorio (“proyecto”, en terminología XFS). A continuación la chuleta para ello.

Montar el sistema de ficheros con las opciones de quotas (previsoramente añadiendolas a fstab):

# habilitar quotas de usuario y de proyecto
/dev/sdd3 /mnt/projects xfs defaults,uquota,pquota 0 3

Después, para cada proyecto seguir este protocolo:

# vincular el id de proyecto (100) con su directorio (p1)
echo 100:/mnt/projects/p1 >> /etc/projects
# asociar el nombre del proyecto (project1) al id
echo project1:100 >> /etc/projid
# habilitar la quota para el proyecto
xfs_quota -xc 'project -s project1' /mnt/projects
# limitar el proyecto a 20 GB
xfs_quota -xc 'limit -p bhard=20g project1' /mnt/projects
# informe de las quotas del sistema de ficheros (/mnt/projects)
xfs_quota -xc 'report -p' /mnt/projects

Obviamente, con XFS también se pueden hacer operaciones más “básicas”:

# informe de las cuotas, por usuario 
xfs_quota -xc report /mnt/projects
# definir una cuota de 500GB para "joe"
xfs_quota -xc 'limit bsoft=490g bhard=500g joe' /mnt/projects
# desactivar las cuotas para "joe"
xfs_quota -xc 'limit bsoft=0 bhard=0 joe' /mnt/projects