NFS es una de esas tecnologías que simplemente funcionan y que siguen siendo muy útiles cuando necesitamos compartir almacenamiento entre servidores Linux.

En esta guía vamos a instalar y configurar un servidor NFSv4 en Linux.

La configuración sirve para cualquier escenario: respaldos, almacenamiento compartido, archivos entre servidores o cualquier otro caso donde necesitemos acceder a un filesystem remoto.

Más adelante podemos utilizar este mismo NFS como destino para respaldos de VMware.

La idea es mantenerlo simple.

El escenario

Vamos a utilizar:

  • Servidor NFS: 192.168.10.20
  • Red autorizada: 192.168.10.0/24
  • Directorio compartido: /backup

El nombre y las direcciones son solamente ejemplos. Utiliza los valores correspondientes a tu infraestructura.

La estructura será:

Servidor NFS
    |
    +-- /backup
          |
          +-- archivos
          +-- backups
          +-- otros datos

Instalar NFS

En RHEL, Rocky Linux y AlmaLinux instalamos nfs-utils:

dnf install -y nfs-utils

El paquete contiene las herramientas necesarias para configurar y administrar NFS.

Preparar el almacenamiento

Primero necesitamos definir dónde vamos a guardar los datos.

Para este ejemplo utilizaremos:

/backup

Creamos el directorio:

mkdir -p /backup

Pero hay algo importante.

En un servidor real, /backup debería estar sobre el almacenamiento destinado a los datos que vamos a compartir. No tiene mucho sentido montar un NFS de varios terabytes sobre el mismo filesystem donde vive el sistema operativo.

Podemos comprobar dónde está:

df -h /backup

Y revisar los discos disponibles:

lsblk

Si utilizamos un disco, RAID, LVM o algún storage independiente, primero debemos preparar ese almacenamiento y montarlo en /backup.

Por ejemplo, si /backup corresponde a un filesystem independiente, debería existir una entrada en /etc/fstab para que se monte automáticamente después de reiniciar.

Una vez que el almacenamiento está listo, seguimos con NFS.

Configurar NFSv4

Editamos:

vim /etc/exports

Agregamos:

/backup 192.168.10.0/24(rw,sync,no_subtree_check,root_squash)

Con esto estamos permitiendo acceso de lectura y escritura al filesystem desde la red 192.168.10.0/24.

Las opciones utilizadas son:

  • rw: permite lectura y escritura.
  • sync: las operaciones de escritura se confirman de forma síncrona.
  • no_subtree_check: evita comprobaciones innecesarias de subdirectorios.
  • root_squash: evita que root del cliente tenga privilegios de root sobre el servidor.

La última opción es especialmente importante.

No queremos que un root de cualquier servidor cliente pueda convertirse automáticamente en root sobre nuestro servidor NFS.

Tampoco recomiendo hacer esto:

/backup *(rw,sync)

Si solamente algunos servidores necesitan acceso, limita el export a la red o, mejor todavía, a las IP específicas de los clientes.

Por ejemplo:

/backup 192.168.10.11(rw,sync,no_subtree_check,root_squash) 192.168.10.12(rw,sync,no_subtree_check,root_squash)

Aplicar la configuración

Después de modificar /etc/exports aplicamos los cambios:

exportfs -rav

Podemos revisar exactamente qué está exportando el servidor:

exportfs -v

Deberíamos ver algo similar a:

/backup
        192.168.10.0/24(rw,sync,wdelay,hide,no_subtree_check,sec=sys,root_squash,...)

Con eso ya tenemos el export configurado.

Activar NFS

Ahora habilitamos el servicio:

systemctl enable --now nfs-server

Comprobamos:

systemctl status nfs-server

Si todo está correcto, el servicio debería aparecer como active (running).

Configurar el firewall

Si utilizamos firewalld, habilitamos NFS:

firewall-cmd --permanent --add-service=nfs
firewall-cmd --reload

Comprobamos:

firewall-cmd --list-services

Deberíamos ver:

nfs

NFSv4 utiliza TCP/2049 para las comunicaciones NFS, lo que simplifica bastante la configuración respecto de versiones antiguas de NFS que dependían de varios servicios RPC.

No necesitamos abrir una colección de puertos porque estamos utilizando exclusivamente NFSv4.

Probar desde otro servidor Linux

Antes de utilizar el NFS para algo importante, probémoslo desde un cliente.

Instalamos las herramientas:

dnf install -y nfs-utils

Creamos un punto de montaje:

mkdir -p /mnt/nfs

Montamos el filesystem utilizando NFSv4:

mount -t nfs4 192.168.10.20:/backup /mnt/nfs

Comprobamos:

mount | grep /mnt/nfs

Deberíamos ver algo parecido a:

192.168.10.20:/backup on /mnt/nfs type nfs4 (...)

Ahora probamos escritura:

touch /mnt/nfs/prueba-nfs

ls -l /mnt/nfs/

Si podemos crear el archivo, NFS está funcionando.

Lo eliminamos:

rm -f /mnt/nfs/prueba-nfs

Montaje permanente

Si queremos que el cliente monte automáticamente el NFS después de reiniciar, agregamos una entrada en /etc/fstab.

Por ejemplo:

192.168.10.20:/backup /mnt/nfs nfs4 defaults,_netdev 0 0

Antes de reiniciar, siempre conviene probar:

umount /mnt/nfs
mount -a

Y comprobar:

mount | grep /mnt/nfs

Si funciona, el montaje permanente está listo.

La opción _netdev le indica al sistema que se trata de un filesystem que depende de la red.

Permisos

NFS no reemplaza el sistema de permisos de Linux.

Los permisos que existen en /backup siguen siendo los permisos que se aplican cuando un cliente accede al filesystem.

Por ejemplo:

ls -ld /backup

Podemos tener:

drwxr-xr-x. 2 root root 4096 Aug 28 12:00 /backup

Si una aplicación necesita escribir en ese directorio, debemos asegurarnos de que el usuario correspondiente tenga los permisos necesarios.

Por el amor de dios!! no solucionemos esto haciendo:

chmod 777 /backup

Sí, funciona, pero es la solución más ordinaria y peligrosa que existe.

Es mejor utilizar propietarios, grupos y permisos correctamente.

SELinux

Si SELinux está habilitado, no lo desactives para hacer funcionar NFS.

Primero revisamos el estado:

getenforce

Si devuelve:

Enforcing

SELinux está activo.

Para un servidor NFS, debemos utilizar los contextos SELinux correspondientes al tipo de almacenamiento que estamos compartiendo.

Podemos revisar el contexto:

ls -Zd /backup

Si el directorio corresponde a un filesystem destinado específicamente a ser exportado mediante NFS, debemos asegurarnos de utilizar el contexto adecuado para ese escenario.

La configuración exacta dependerá de si el directorio solamente se exporta, si además se utiliza para otros servicios y de quién necesita acceder a él.

La regla general es simple:

No desactives SELinux para solucionar un problema de permisos.

Primero revisa los contextos y los logs de SELinux.

Revisar el almacenamiento

Un NFS puede estar perfectamente configurado y aun así ser lento.

Por eso conviene revisar el almacenamiento antes de culpar a NFS.

Para revisar espacio:

df -h /backup

Para revisar el tipo de filesystem:

df -Th /backup

Y para revisar el almacenamiento y la actividad de disco podemos utilizar:

iostat -xz 1

Si tenemos una red de 10 GbE pero el storage solamente puede escribir a 150 MB/s, NFS no va a convertir mágicamente ese storage en uno de 10 GbE.

El rendimiento final siempre va a estar limitado por el componente más lento.

Verificar que estamos utilizando NFSv4

Desde el cliente podemos comprobar la versión:

nfsstat -m

También:

mount | grep nfs

Deberíamos encontrar:

type nfs4

Si estamos preparando un entorno nuevo, tiene sentido utilizar NFSv4 directamente y mantener una configuración simple.

Algunas recomendaciones

Para un servidor NFS que va a manejar información importante:

  • Utiliza almacenamiento independiente para los datos.
  • Limita los clientes autorizados.
  • Utiliza root_squash.
  • Mantén SELinux habilitado.
  • No exportes * si no es necesario.
  • Monitorea espacio disponible.
  • Monitorea I/O.
  • Utiliza NFSv4.
  • Prueba la lectura y escritura desde los clientes.
  • Documenta qué servidores tienen acceso.
  • No mezcles cargas de trabajo incompatibles en el mismo storage sin revisar primero el impacto.

Y, por supuesto, monitorea el filesystem.

Un NFS lleno deja de ser un NFS útil bastante rápido.

Listo

Con esto tenemos un servidor Linux funcionando como servidor NFSv4.

El flujo es simple:

Cliente Linux
     |
     | NFSv4
     |
     v
Servidor NFS
     |
     +-- /backup

A partir de aquí podemos utilizar este almacenamiento para lo que necesitemos.

En la siguiente guía vamos a utilizar este NFS como destino para respaldos de máquinas virtuales VMware ESXi con ghettoVCB.