Configurar un servidor NFS en Linux es una de las formas más rápidas de compartir archivos entre máquinas en la misma red sin instalar pilas de software complejas. NFS (Network File System) permite montar un directorio remoto como si fuera un disco local, lo que lo hace ideal para directorios de inicio compartidos, clústeres de laboratorio, cachés de compilación y bibliotecas multimedia. En esta guía configurarás un servidor y cliente NFS completo desde cero, comprenderás las opciones clave de /etc/exports, elegirás entre NFSv3 y NFSv4, ajustarás los tamaños de búfer de lectura/escritura para optimizar el rendimiento y persistirás los montajes de forma confiable con /etc/fstab.

Requisitos Previos

  • Dos máquinas Linux en la misma red — una actuando como servidor y otra como cliente. Ambos roles también pueden estar en máquinas virtuales.
  • Acceso root o sudo en ambas máquinas.
  • Acceso al firewall para el puerto 2049/TCP (y puertos adicionales para NFSv3 si se usa).
  • Familia Debian/Ubuntu o RHEL/Fedora/Rocky — los comandos para ambas se muestran a lo largo del documento.
  • Conocimiento básico de direccionamiento IP y permisos de archivos en Linux.

Instalación del Servidor NFS

En el nodo servidor, instala el paquete del servidor NFS del kernel:

# Debian / Ubuntu
sudo apt update && sudo apt install -y nfs-kernel-server

# RHEL / Fedora / Rocky / AlmaLinux
sudo dnf install -y nfs-utils

Habilita e inicia el servicio para que sobreviva a los reinicios:

sudo systemctl enable --now nfs-server
sudo systemctl status nfs-server

Verifica que el servidor NFS esté escuchando en el puerto 2049:

ss -tlnp | grep 2049

Deberías ver una entrada para nfsd vinculada a 0.0.0.0:2049.

Configuración de /etc/exports

El archivo /etc/exports es el núcleo de la configuración del servidor NFS. Cada línea define una ruta exportada y qué clientes pueden acceder a ella, junto con las opciones de montaje.

Sintaxis básica:

/ruta/al/exportado  especificacion_cliente(opciones)

Un ejemplo mínimo funcional que exporta /srv/nfs a toda una subred:

/srv/nfs  192.168.1.0/24(rw,sync,no_subtree_check)

Crea el directorio compartido y establece los permisos antes de exportar:

sudo mkdir -p /srv/nfs
sudo chown nobody:nogroup /srv/nfs   # mapeo anónimo típico de NFS
sudo chmod 755 /srv/nfs

Opciones comunes de /etc/exports explicadas:

OpciónSignificado
rwPermite acceso de lectura y escritura
roPermite acceso de solo lectura
syncEscribe datos en disco antes de confirmar; más seguro pero más lento
asyncConfirma escrituras antes de vaciar al disco; más rápido pero riesgoso en fallos
no_subtree_checkDeshabilita la verificación de subárbol; reduce errores espurios cuando se mueven archivos
subtree_checkHabilita la verificación de subárbol; requerido por seguridad al exportar un subdirectorio
root_squashMapea root del cliente al usuario nobody (predeterminado, recomendado)
no_root_squashPermite que root del cliente actúe como root; úsalo solo en entornos completamente confiables
all_squashMapea todos los clientes al usuario anónimo
anonuid=1000Establece el UID para los mapeos anónimos
fsid=0Marca esta exportación como la pseudo raíz de NFSv4

Un archivo de exports listo para producción con múltiples recursos compartidos:

# Recurso compartido de lectura/escritura para la subred del equipo de desarrollo
/srv/nfs/projects  192.168.10.0/24(rw,sync,no_subtree_check,root_squash)

# Repositorio de ISOs de solo lectura disponible para todos los clientes internos
/srv/nfs/isos  192.168.0.0/16(ro,sync,no_subtree_check)

# Directorios de inicio compartidos — solo hosts específicos
/home  192.168.10.5(rw,sync,no_subtree_check) 192.168.10.6(rw,sync,no_subtree_check)

Después de editar /etc/exports, aplica los cambios sin reiniciar el servidor:

sudo exportfs -ra    # recargar todas las exportaciones
sudo exportfs -v     # listar exportaciones activas con sus opciones

Comparación NFSv3 vs NFSv4

Elegir la versión correcta de NFS es importante para la seguridad, la configuración del firewall y la compatibilidad de funciones. Los despliegues modernos deben usar NFSv4 por defecto, a menos que sistemas legacy requieran NFSv3.

CaracterísticaNFSv3NFSv4
Estado del protocoloSin estadoCon estado
Puertos usados2049 + dinámicos (111, mountd, statd, lockd)Solo 2049
Reglas de firewallComplejas — múltiples puertos dinámicosSimples — un solo puerto
SeguridadAUTH_SYS (solo UID/GID)AUTH_SYS + Kerberos (RPCSEC_GSS)
Bloqueo de archivosNLM (daemon separado)Integrado, obligatorio
Soporte de ACLSolo extensiones del proveedorACL POSIX de forma nativa
Nombres de archivo UTF-8OpcionalRequerido
DelegaciónNoSí — caché del lado del cliente
Pseudo raízNoSí — espacio de nombres unificado
Recomendado paraSistemas legacy, configuraciones simplesClústeres Linux modernos, cross-firewall

Para forzar una versión específica de NFS en el cliente:

# Montar usando NFSv4 explícitamente
sudo mount -t nfs4 servidor:/srv/nfs /mnt/nfs

# Montar usando NFSv3 (si lo requiere un servidor legacy)
sudo mount -t nfs -o vers=3 servidor:/srv/nfs /mnt/nfs

Instalación del Cliente NFS y Montaje de Recursos Compartidos

En el nodo cliente, instala las utilidades del cliente NFS:

# Debian / Ubuntu
sudo apt install -y nfs-common

# RHEL / Fedora / Rocky
sudo dnf install -y nfs-utils

Crea un punto de montaje local y monta la exportación:

sudo mkdir -p /mnt/nfs
sudo mount -t nfs4 192.168.1.100:/srv/nfs /mnt/nfs

Confirma que el montaje está activo y verifica el espacio disponible:

df -hT /mnt/nfs
mount | grep nfs

Prueba el acceso de escritura desde el cliente:

touch /mnt/nfs/testfile && echo "Acceso de escritura confirmado"

Persistir Montajes NFS con /etc/fstab

Un montaje manual desaparece tras el reinicio. Agrega el recurso compartido a /etc/fstab para hacerlo permanente:

# Formato: <servidor>:<exportacion>  <punto_montaje>  <tipo>  <opciones>  <dump>  <pass>
192.168.1.100:/srv/nfs  /mnt/nfs  nfs4  defaults,_netdev  0  0

Opciones clave de fstab para NFS:

OpciónPropósito
_netdevRetrasa el montaje hasta que la red esté activa — esencial para NFS al arrancar
nofailEl arranque continúa aunque el servidor NFS sea inalcanzable
softDevuelve un error si el servidor no responde (en lugar de colgarse)
hardReintenta indefinidamente hasta que el servidor responda (predeterminado, más seguro para datos)
timeo=30Tiempo de espera en décimas de segundo antes de reintentar
retrans=3Número de retransmisiones antes de rendirse (con soft)

Una entrada fstab robusta para producción:

192.168.1.100:/srv/nfs  /mnt/nfs  nfs4  defaults,_netdev,nofail,hard,timeo=30  0  0

Después de editar fstab, pruébalo sin reiniciar:

sudo mount -a
df -hT /mnt/nfs

Ajuste de Rendimiento: rsize y wsize

Por defecto, NFS usa tamaños de búfer conservadores (a menudo 1 MB en kernels modernos, pero sistemas más antiguos pueden usar 32 KB o 64 KB por defecto). En una LAN de gigabit o superior, aumentar rsize (búfer de lectura) y wsize (búfer de escritura) a 1 MB mejora significativamente el rendimiento.

Montar con búferes ajustados:

sudo mount -t nfs4 -o rsize=1048576,wsize=1048576 192.168.1.100:/srv/nfs /mnt/nfs

Medir el rendimiento antes y después del ajuste:

# Prueba de escritura (cliente a servidor)
dd if=/dev/zero of=/mnt/nfs/testfile bs=1M count=512 conv=fdatasync

# Prueba de lectura (servidor a cliente)
dd if=/mnt/nfs/testfile of=/dev/null bs=1M

Opciones adicionales de rendimiento:

OpciónEfecto
async (en el servidor)Aumenta la velocidad de escritura a costa de la seguridad de datos en caso de fallo
noatimeDeshabilita las actualizaciones de tiempo de acceso; reduce el tráfico de escritura en cargas de lectura intensiva
actimeo=60Almacena en caché los atributos de archivo por 60 segundos; reduce los RPC de metadatos
nconnect=4Usa múltiples conexiones TCP al servidor (Linux 5.3+, NFSv4.1+)

Para servidores con respaldo NVMe en una red 10 GbE, combina rsize=1048576,wsize=1048576,nconnect=4,noatime para máximo rendimiento.

Agrega las opciones de ajuste a fstab:

192.168.1.100:/srv/nfs  /mnt/nfs  nfs4  defaults,_netdev,nofail,rsize=1048576,wsize=1048576,noatime  0  0

Escenario Real: /home Compartido en un Clúster de Laboratorio

Tienes un clúster de laboratorio Linux de cuatro nodos — un nodo de gestión (lab-mgmt) y tres nodos de trabajo (lab-worker-1, lab-worker-2, lab-worker-3). Todos los nodos comparten las mismas cuentas de usuario, y quieres que los usuarios vean sus directorios de inicio sin importar en qué nodo inicien sesión. NFS hace esto posible de forma transparente.

En lab-mgmt (servidor NFS):

# Instalar el servidor
sudo apt install -y nfs-kernel-server

# Los directorios de inicio ya existen bajo /home
# Exportar /home a todos los nodos de trabajo
sudo bash -c 'cat >> /etc/exports <<EOF

/home  192.168.10.11(rw,sync,no_subtree_check) 192.168.10.12(rw,sync,no_subtree_check) 192.168.10.13(rw,sync,no_subtree_check)
EOF'

sudo exportfs -ra
sudo exportfs -v

En cada nodo de trabajo (lab-worker-1/2/3):

# Instalar el cliente
sudo apt install -y nfs-common

# Crear el punto de montaje (hacer copia de seguridad del /home local si es necesario)
sudo mount -t nfs4 192.168.10.10:/home /home

# Probar: iniciar sesión como usuario normal y verificar que los archivos estén presentes
ls /home/jcarlos

Persistir con fstab en cada nodo de trabajo:

192.168.10.10:/home  /home  nfs4  defaults,_netdev,hard,timeo=30,rsize=1048576,wsize=1048576  0  0

Cuando un usuario inicie sesión en cualquier nodo de trabajo, su directorio de inicio — incluyendo el historial del shell, las claves SSH y los archivos de configuración — será idéntico en todos los nodos. Combina esto con un /etc/passwd compartido o LDAP para cuentas de usuario completamente consistentes.

Errores Comunes y Casos Especiales

  • Desajuste de UID/GID: NFS se basa en UIDs y GIDs numéricos, no en nombres de usuario. Si un usuario tiene UID 1001 en el servidor pero UID 1002 en el cliente, verán los archivos del otro como propietario incorrecto. Sincroniza UIDs/GIDs en todos los nodos con LDAP o un /etc/passwd compartido, o usa NFSv4 con idmapd.
  • root_squash y operaciones privilegiadas: Con root_squash habilitado (el valor predeterminado), el usuario root de un cliente se mapea a nobody. Esto rompe operaciones como chown y algunas copias de seguridad. Usa no_root_squash solo en redes internas completamente confiables.
  • Reglas de firewall para NFSv3: NFSv3 usa puertos RPC dinámicos para mountd, statd y lockd. Fíjalos a puertos estáticos en /etc/sysconfig/nfs y ábrelos en tu firewall, o cambia a NFSv4 que solo necesita el puerto 2049.
  • async vs sync: La opción async mejora el rendimiento de escritura, pero los datos que aún no se han vaciado al disco pueden perderse si el servidor falla. Usa siempre sync para bases de datos compartidas, artefactos de compilación o cualquier cosa donde la integridad de los datos sea importante.
  • Manejadores NFS obsoletos: Si el servidor se reinicia o las exportaciones cambian mientras los clientes están montados, los procesos pueden recibir errores de “Stale file handle”. Desmonta y vuelve a montar el recurso compartido para limpiar el estado obsoleto.
  • Montaje automático con autofs: Para entornos grandes, considera autofs en lugar de entradas estáticas en fstab. Autofs monta los recursos compartidos bajo demanda y los desmonta cuando están inactivos, reduciendo el tiempo de arranque y evitando fallos cuando los servidores NFS no están disponibles temporalmente.

Solución de Problemas

El montaje se cuelga indefinidamente: El cliente no puede alcanzar el servidor. Verifica la conectividad con ping, comprueba que el servicio NFS esté activo en el servidor (systemctl status nfs-server), y confirma que el puerto 2049 esté abierto (nc -zv servidor 2049).

Permiso denegado al montar: La dirección IP del cliente no está en /etc/exports. Verifica con exportfs -v y agrega el CIDR o nombre de host del cliente correcto, luego ejecuta exportfs -ra.

Archivos con propietario nobody en el cliente: Desajuste de UID/GID. Alinea los UIDs entre sistemas o configura idmapd para el mapeo de identidades en NFSv4. Revisa /var/log/syslog en el servidor para errores de idmapd.

Rendimiento NFS lento: Verifica los valores de rsize y wsize con mount | grep nfs. Aumenta a 1048576. También verifica que la exportación del lado del servidor use async si la velocidad de escritura es crítica y el riesgo de durabilidad es aceptable.

“exportfs: /etc/exports: No such file or directory”: Crea el archivo: sudo touch /etc/exports, luego agrega tus líneas de exportación y ejecuta exportfs -ra.

Resumen

  • NFS comparte directorios desde un servidor a múltiples clientes usando un protocolo ligero nativo del kernel.
  • Instala nfs-kernel-server en el servidor y nfs-common en los clientes (Debian/Ubuntu), o nfs-utils en ambos para sistemas RHEL.
  • Configura las exportaciones en /etc/exports con el formato /ruta cliente(opciones) y recarga con exportfs -ra.
  • Prefiere NFSv4 para despliegues modernos: puerto único (2049), conexiones con estado, bloqueo integrado y mejor compatibilidad con firewall.
  • Usa _netdev en /etc/fstab para asegurar que los montajes NFS esperen la red al arrancar, y prueba con mount -a.
  • Ajusta rsize=1048576,wsize=1048576 en el cliente para transferencias de alta velocidad en LAN; agrega nconnect=4 en Linux 5.3+ para NFSv4.1 con múltiples conexiones.
  • Sincroniza UIDs/GIDs en todos los nodos para evitar desajustes de permisos — el problema más común con NFS.

Artículos Relacionados