Montando NFS con systemd

Últimamente he estado jugando con un NAS antiguo que tiene NFS y Syncthing, para aquello de montarte tu propia nube privada. Si me termino enterando de cómo funciona todo eso, quizás haga un artículo y lo publique aquí, ftr.

Sin embargo, antes de tener todo nuestro edificio construido, es necesario comenzar por los cimientos. Y estos cimientos no son otros que el acceso a los volúmenes de datos, por supuesto.

Esquema de funcionamiento deseado
Esquema de funcionamiento deseado

Mi objetivo primordial va a ser exponer mi NAS de 3Tb a la red usando un ordenador cualquiera (en este caso una máquina con Manjaro instalada, pero podría valer para una raspberry), para poder salvar el escollo de no tener un NAS de última generación que nos permita instalar en él mismo la aplicación de Syncthing.

Al tratarse de dos sistemas diferentes, la solución que utilicemos debe ser lo suficientemente resiliente como para poder recuperarse ante un corte en la red y reanudarse cuanto antes. También quiero poder iniciar mi ordenador normalmente sin tener activo el NAS (el cual no uso mucho y no quiero malgastar electricidad para usarlo realmente unas pocas horas).

Lo primero que se nos podría ocurrir sería tirar de /etc/fstab creando una entrada como ésta:

192.168.1.256:/mnt/md1 /mnt/NAS nfs rw,hard,intr,timeo=14,bg 0 

Si os habéis fijado, hemos especificado la opción bg al final. Con esto lo que queremos pedir al sistema es que lanze un demonio (que debe correr como background) para que trate de montar el volumen cada cierto tiempo.

Hasta aquí todo funciona perfecto, no? Podemos probar con el comando

mount -a

y vemos que si nuestro NAS está desconectado, tratará de montarlo varias veces, sin éxito, hasta que lo conectamos, que es cuando está disponible nuestra carpeta /mnt/NAS. Utilizando el comando journalctl -e podemos ver el log del sistema y ver que realmente ha hecho lo que queríamos.

Peeero… Si hubiera sido tan sencillo, ¿crees que realmente me hubiera molestado en hacer este pequeño tutorial? Probablemente no…

Si reiniciamos el ordenador veremos que no hemos conseguido nuestro objetivo. La unidad se monta solamente si está disponible la unidad NFS al momento de arranque del ordenador. Vemos que la opción bg es como si no estuviera. Systemd sencillamente la ignora.

Systemd y sus unidades

A riesgo de meter la pata, ya que no soy un experto con estos temas de inits, podríamos decir que Systemd se compone de múltiples unidades, o units, que pueden ser servicios (como los típicos que iniciamos y paramos, y que podría ser un servidor web), mounts, automounts, targets, sockets… y no sé qué más cosas. Bueno, la cosa es entender que no todo systemd se compone de servicios (como yo pensaba hasta ahora).

Los que nos interesan para nuestro caso son los que están en negrita.

Systemd Mounts

Cuando se diseñó Systemd, se decidió que cada entrada en /etc/fstab generaría un unit de tipo mount. Éstos son generados “al vuelo” al iniciar el sistema. Pero por supuesto podemos generar nosotros mismos el mount que necesitemos.

Este unit monta /boot/efi y está generado automáticamente desde /etc/fstab

Cuando se diseñó Systemd, se decidió que cada entrada en /etc/fstab generaría un unit de tipo mount. Éstos son generados “al vuelo” al iniciar el sistema. Pero por supuesto podemos generar nosotros mismos el mount que necesitemos.

Para ello crearemos un fichero en la carpeta /etc/systemd/system/ con el nombre de la ruta que queramos montar, pero sustituyendo las barras por guiones. Es decir, que si queremos hacer un montaje en /mnt/NAS, el fichero se llamará mnt-NAS.mount. El contenido será el siguiente:

[Unit]
Description=NFS mount
Requires=network-online.target
After=network-online.service
[Mount]
What=192.168.1.256:/mnt/mp0
Where=/mnt/NAS
Options=rw,hard,intr,timeo=14
Type=nfs
[Install]
WantedBy=multi-user.target

Importante la sección de Options, ya que difiere ligeramente de la que habíamos puesto en el fichero /etc/fstab. Si nos fijamos, no aparece la opción de bg. Esto es porque ese mismo comportamiento lo podemos conseguir con otro tipo de inits de Systemd, los automount.

Para que funcione tenemos que asegurarnos de que la carpeta /mnt/NAS existe. También tenemos que activar el mount con el comando:

systemctl daemon-reload
sudo systemctl enable mnt-NAS.mount

Systemd automounts

Los automounts de systemd se encargarán de llamar al servicio de montaje que corresponda cuando tratemos de acceder a la ruta especificada en el montaje. Al final obtendremos un comportamiento muy parecido al de bg.

[Unit]
Description=NFS Automount
Requires=network-online.target
After=network-online.service
[Automount]
Where=/mnt/NAS
TimeoutIdleSec=10
[Install]
WantedBy=multi-user.target

Sólamente tenemos que indicar la ruta, del resto se encarga systemd. Necesitamos ejecutar lo siguiente:

systemctl daemon-reload
sudo systemctl enable mnt-NAS.mount

Ahora, syncthing intentará acceder a la carpeta que le habíamos señalado, y el el kernel, indicado por systemd, montará la unidad

Salida de systemd con las llamadas del sistema para cargar automount.
Después de intentarlo unas pocas veces, ¡monta el dispositivo con éxito!

Ahora que hemos resuelto el problema del almacenamiento, sólo nos queda configurar syncthing correctamente (que no es moco de pavo, ojo).

Saludos 😉

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.