Cómo instalar un servidor y cliente NFS en Ubuntu Server

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.

Llevando a Docker más allá con Docker Swarm
En este artículo, te voy a mostrar cómo crear un cluster de Docker Swarm. Fácil, rápido y efectivo.

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:

https://www.twitch.tv/ignaciovandroogenbroeck