Cómo instalar un servidor y cliente NFS en Ubuntu Server
En este artículo te voy a mostrar como implementar un Network File System en Ubuntu Server. Veremos la instalación del NFS Server y la configuración, así como también la configuración de un cliente.
NFS es un excelente opción para compartir datos a través de la red y cuando me refiero a datos, no hablo de archivos comunes, sino que pueden ser datos de aplicaciones también.
Uno de los escenarios en los que más me gusta usar NFS es cuando tengo varios contenedores corriendo a través de multiple hosts por cuestiones de balanceo de carga y tengo que asegurarme que los datos sean los mismos para todos esos contenedores.
¿Arrancamos?
Lo que vamos a armar es algo muy sencillo, vamos a agarrar un Ubuntu Server y le vamos a instalar los componentes para que sea un NFS Server, vamos a crear la carpeta compartida y configurar todo para que a esa carpeta solo accedan desde algunos hosts.
Se acuerdan del artículo anterior donde hablé de Docker Swarm y armamos un cluster de tres nodos, bueno, esos, van a hacer los clientes de nuestro NFS Server.
Lo que vamos a hacer primero es actualizar nuestros servidores:
$ sudo apt update && apt dist-upgrade
Una vez que esta actualizado y reiniciamos, vamos a instalar NFS.
$ sudo apt install -y nfs-kernel-server
El siguiente paso es crear la carpeta compartida, en mi caso, quedaría así.
$ sudo mkdir -p /mnt/data
Vamos a especificar algunos permisos para que "todos" los clientes puedan escribir en ese directorio.
$ sudo chown nobody:nogroup /mnt/data
$ sudo chmod 777 /mnt/data
Lo siguiente que vamos a hacer es configurar a NFS para que solo acepte conexiones desde nuestros clientes. Si esto no se hace, cuando queramos conectarnos desde un cliente, NFS nos dará un acceso denegado.
Para hacer esto, vamos a editar el archivo "export"
$ sudo vim /etc/exports
Lo siguiente es agregar la carpeta que queremos compartir y especificamos cuales serán las direcciones IP que podrán escribir en esa carpeta, para mi ejemplo quedaría así:
/mnt/data 192.168.1.80(rw,sync,no_subtree_check)
/mnt/data 192.168.1.81(rw,sync,no_subtree_check)
/mnt/data 192.168.1.82(rw,sync,no_subtree_check)
Y así quedaría el archivo completo:
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#
/mnt/data 192.168.1.80(rw,sync,no_subtree_check)
/mnt/data 192.168.1.81(rw,sync,no_subtree_check)
/mnt/data 192.168.1.82(rw,sync,no_subtree_check)
Básicamente, lo que hago con esto es dejar que mi cluster de Docker Swarm pueda acceder a esa carpeta compartida y escribir sobre ella.
Una vez que tenemos esto listo, vamos a "publicar" estos exports:
$ sudo exportfs -a
Lo siguiente es reiniciar el servidor NFS de esta manera para que tome esos cambios:
$ sudo systemctl restart nfs-kernel-server
Como paso opcional, si hay un firewall activado en los servidores, recuerden hacer las excepciones para que el tráfico entre clientes y servidor fluya.
Vamos a configurar los clientes
Los clientes en este caso y como comenté más arriba son los nodos de un cluster de Docker Swarm, así que vamos a configurar montar ese NFS en cada uno de los esos servidores.
Algo que no mencione, es que la dirección IP que le asigne a mi servidor NFS es la IP 192.168.1.83, dicho esto, vamos a instalar el cliente de NFS en nuestros nodos.
$ sudo apt update & apt install nfs-common
Una vez que está instalado, vamos a crear una carpeta local, para montar la carpeta remota. En este caso, para no confundir, le voy a llamar "cliente1" pero me gusta que tengan el mismo nombre así puedo estandarizar configuraciones.
$ sudo mkdir -p /mnt/cliente1
Una vez que tenemos la carpeta, vamos a montar el directorio remoto en este que acabamos de crear, quedaría de la siguiente manera:
$ sudo mount 192.168.1.83:/mnt/data /mnt/cliente1
A partir de ese momento, cuando naveguen por "/mnt/cliente1" verán el contenido del "/mnt/data" del servidor NFS.
Por último, seguramente viene la pregunta, ¿Cómo hago para que esto cambio sea persistente y se mantenga a través de reinicios? y yo te respondo, que buena pregunta.
Para que el montaje se haga de manera automática al bootear, tenemos que tocar el /etc/fstab:
$ sudo vim /etc/fstab
En este archivo veremos el o los discos que tengamos y vamos agregar una línea que sea nuestro NFS. La línea debería ser algo así:
192.168.1.83:/mnt/data /mnt/data nfs defaults 0 1
Y el archivo queda, en mi caso, así:
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/726855df-27f8-4d31-9382-e71914e3bafb / ext4 defaults 0 0
/swap.img none swap sw 0 0
192.168.1.83:/mnt/data /mnt/data nfs defaults 0 1
Guardamos, cerramos y reiniciamos. Cuando iniciemos sesión, vamos a /mnt/cliente1 y deberíamos ver montada la carpeta remota.
Para ir cerrando
Como ves, no es difícil y creo que este es un buen ejemplo para arrancar a jugar con sistemas de archivos de red. En otro momento, les voy a mostrar como hacer de NFS algo más robusto con encriptación en el transporte de datos y una arquitectura de alta disponibilidad.
También seguramente veremos sistemas y soluciones que son más dedicadas y que tienen más funcionalidades.
Espero que este artículo les haya servido y cualquier duda o consulta, como siempre, pueden dejarla en los comentarios.
PD: Hoy hago el primer stream en Twitch, les voy a mostrar como desplegar Traefik y Nextcloud en Docker a las 19 horas de Uruguay: