31 de Marzo, 2004

Montado NFS remoto y tolerante a fallos

Casi nada :D.

Ya comenté en 'descargar imágenes ISO desde blackshell' como montar directorios con NFS de forma remota y bajo demanda. Era el servidor quién montaba/desmontaba los directorios en el cliente según su propia disponibilidad.

La solución que expliqué funciona, pero no es perfecta. De hecho no tolera nada bien los fallos :(.

Si homeworld (el servidor NFS) cuando se apaga no desmonta correctamente los directorios en blackshell (el cliente), tenemos una historia "montada" ;) porque la próxima vez que arranque volverá a montar los directorios.

La verdad es que no sé porqué se comporta así, parece más lógico que si un disco ya está montado que rechace la nueva petición de montado. Pero bueno, algo tendrá que ver el NFS ¿?

La solución es editar el /etc/init.d/nfs-kernel-server de homeworld de la siguiente forma:

# en la zona del start) después de arrancar el NFS
printf "Calling blackshell:"
printf " WAKE UP!"
ssh -i /home/usuario/.ssh/id_rsa usuario@blackshell-lan \
"/home/usuario/bin/share.sh"
echo "."

# en la zona del stop) antes de apagar el NFS
printf "Calling blackshell:"
printf " SLEEP NOW!"
ssh -i /home/usuario/.ssh/id_rsa usuario@blackshell-lan \
"/home/usuario/bin/unshare.sh"
echo "."

Cuidado con los permisos de los dos scripts, que solo sean ejecutables por el usuario en cuestión.

Ahora los scripts implementan esa comprobación tan lógica, en share.sh:

#!/bin/sh
mount | grep /storage/ftp/pub/iso > /dev/null
[ $? != 0 ] && /usr/bin/sudo /sbin/mount /storage/ftp/pub/iso

Y en unshare.sh:

#!/bin/sh
mount | grep /storage/ftp/pub/iso > /dev/null
[ $? == 0 ] && /usr/bin/sudo /sbin/umount -f /storage/ftp/pub/iso

Fácil y eficaz.

Lamentablemente queda un pequeño punto delicado. ¿Qué pasa si homeworld no apaga bien? ¿Hay que volver a arrancar esa máquina y desmontar el directorio en blackshell?

La solución sería poner un cron que cada 15 minutos, por ejemplo, haga lo siguiente:

# esta montado?
mount | grep /storage/ftp/pub/iso > /dev/null
if [ $? != 0 ]; then
  rm -f /home/usuario/.mount_check
  exit
fi

# está homeworld ahí?
ping -c 1 homeworld > /dev/null
if [ $? != 0 ]; then
  rm -f /home/usuario/.mount_check
  exit
fi

# ha fallado ya una vez?
if [ -f /home/usuario/.mount_check ]; then
  rm -f /home/usuario/.mount_check
  /usr/bin/sudo /sbin/umount -f /storage/ftp/pub/iso
else
  touch /home/usuario/.mount_check
fi

De forma que desmonte el directorio si el servidor está 30 minutos sin responder (fallando a dos comprobaciones consecutivas).

Esta sería una solución que nos daría lo que dice el título de este post: montado NFS remoto y tolerante a fallos (de montado/desmontado) :P.

Anotación por Juan J. Martínez.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.