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
sudoen 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ón | Significado |
|---|---|
rw | Permite acceso de lectura y escritura |
ro | Permite acceso de solo lectura |
sync | Escribe datos en disco antes de confirmar; más seguro pero más lento |
async | Confirma escrituras antes de vaciar al disco; más rápido pero riesgoso en fallos |
no_subtree_check | Deshabilita la verificación de subárbol; reduce errores espurios cuando se mueven archivos |
subtree_check | Habilita la verificación de subárbol; requerido por seguridad al exportar un subdirectorio |
root_squash | Mapea root del cliente al usuario nobody (predeterminado, recomendado) |
no_root_squash | Permite que root del cliente actúe como root; úsalo solo en entornos completamente confiables |
all_squash | Mapea todos los clientes al usuario anónimo |
anonuid=1000 | Establece el UID para los mapeos anónimos |
fsid=0 | Marca 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ística | NFSv3 | NFSv4 |
|---|---|---|
| Estado del protocolo | Sin estado | Con estado |
| Puertos usados | 2049 + dinámicos (111, mountd, statd, lockd) | Solo 2049 |
| Reglas de firewall | Complejas — múltiples puertos dinámicos | Simples — un solo puerto |
| Seguridad | AUTH_SYS (solo UID/GID) | AUTH_SYS + Kerberos (RPCSEC_GSS) |
| Bloqueo de archivos | NLM (daemon separado) | Integrado, obligatorio |
| Soporte de ACL | Solo extensiones del proveedor | ACL POSIX de forma nativa |
| Nombres de archivo UTF-8 | Opcional | Requerido |
| Delegación | No | Sí — caché del lado del cliente |
| Pseudo raíz | No | Sí — espacio de nombres unificado |
| Recomendado para | Sistemas legacy, configuraciones simples | Clú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ón | Propósito |
|---|---|
_netdev | Retrasa el montaje hasta que la red esté activa — esencial para NFS al arrancar |
nofail | El arranque continúa aunque el servidor NFS sea inalcanzable |
soft | Devuelve un error si el servidor no responde (en lugar de colgarse) |
hard | Reintenta indefinidamente hasta que el servidor responda (predeterminado, más seguro para datos) |
timeo=30 | Tiempo de espera en décimas de segundo antes de reintentar |
retrans=3 | Nú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ón | Efecto |
|---|---|
async (en el servidor) | Aumenta la velocidad de escritura a costa de la seguridad de datos en caso de fallo |
noatime | Deshabilita las actualizaciones de tiempo de acceso; reduce el tráfico de escritura en cargas de lectura intensiva |
actimeo=60 | Almacena en caché los atributos de archivo por 60 segundos; reduce los RPC de metadatos |
nconnect=4 | Usa 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/passwdcompartido, o usa NFSv4 conidmapd. - root_squash y operaciones privilegiadas: Con
root_squashhabilitado (el valor predeterminado), el usuariorootde un cliente se mapea anobody. Esto rompe operaciones comochowny algunas copias de seguridad. Usano_root_squashsolo en redes internas completamente confiables. - Reglas de firewall para NFSv3: NFSv3 usa puertos RPC dinámicos para
mountd,statdylockd. Fíjalos a puertos estáticos en/etc/sysconfig/nfsy ábrelos en tu firewall, o cambia a NFSv4 que solo necesita el puerto 2049. asyncvssync: La opciónasyncmejora el rendimiento de escritura, pero los datos que aún no se han vaciado al disco pueden perderse si el servidor falla. Usa siempresyncpara 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
autofsen 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-serveren el servidor ynfs-commonen los clientes (Debian/Ubuntu), onfs-utilsen ambos para sistemas RHEL. - Configura las exportaciones en
/etc/exportscon el formato/ruta cliente(opciones)y recarga conexportfs -ra. - Prefiere NFSv4 para despliegues modernos: puerto único (2049), conexiones con estado, bloqueo integrado y mejor compatibilidad con firewall.
- Usa
_netdeven/etc/fstabpara asegurar que los montajes NFS esperen la red al arrancar, y prueba conmount -a. - Ajusta
rsize=1048576,wsize=1048576en el cliente para transferencias de alta velocidad en LAN; agreganconnect=4en 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.