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 querootdel cliente tenga privilegios derootsobre 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.