ls se bloquea después de reiniciar el servidor NFS

ls se bloquea después de reiniciar el servidor NFS

Tengo el servidor A y el servidor B. B actúa como un servidor nfs, A se monta desde B.

Ambos se ejecutan en EC2.

A veces tengo que cerrar B e iniciar una nueva instancia (instancia idéntica). Una vez que B realiza una copia de seguridad, intentar hacer cualquier cosa dentro del directorio montado en A (ls por ejemplo) simplemente se bloquea.

Estoy intentando configurar un cron que verifique el estado del montaje y lo vuelva a montar si hay algún problema.

¿Hay alguna forma de comprobar el estado de una montura?

Respuesta1

Puede bifurcar, hacer que el niño ingrese al directorio y luego salir del niño. Haga que el padre supervise la existencia del proceso hijo con un tiempo de espera. Si tienes una montura obsoleta, el niño no podrá salir y se quedará por mucho tiempo, por lo que el tiempo de espera ocurrirá en el padre. Haga que el padre mate -9 al niño e intente desmontarlo.

Sin embargo, el problema que puede experimentar es que si algún otro proceso está utilizando un archivo que está en el soporte roto, no podrá desmontarlo sin antes eliminar esos procesos. Puede (a menudo) descubrir si algún proceso está utilizando recursos no disponibles en un montaje obsoleto con lsof o fuser.

Sin embargo, evitaría matar automáticamente procesos arbitrarios; envíate una notificación para investigar más manualmente.

Para reducir la probabilidad de que esto ocurra, es posible que desee considerar el montador automático, que no montará el volumen hasta que sea necesario/se solicite un recurso en el servidor, y lo desmontará automáticamente cuando ya no sea necesario.

-- por cierto, para que esto sea más fácil de buscar, es posible que quieras etiquetarlo con las palabras obsoleto, atascado, nfs y mount. Este fenómeno no es específico de su uso de ec2.

Respuesta2

Me di cuenta de que cuando el servidor NFS se reinicia, cambia su IP y, por lo tanto, el montaje no funciona.

Escribí este script que verifica si la IP del host NFS es la IP actualmente utilizada en el montaje; de ​​lo contrario, lo desmonta y lo vuelve a montar. Podría ayudar a alguien en el futuro.

#!/bin/bash

NFS_HOST=$(mount | grep nfs | awk '{ print $1 }' | cut -d ":" -f 1)
NFS_HOST_PATH=$(mount | grep nfs | awk '{ print $1 }' | cut -d ":" -f 2)

host $NFS_HOST

if [[ $? -ne 0 ]]; then
    echo "NFS host $NFS_HOST doesn't exist!"
    exit 2
fi

MOUNT_POINT=$(mount | grep $NFS_HOST | awk '{ print $3 }')

NFS_IP=$(host $NFS_HOST | awk '{ print $4 }')

mount | grep "$NFS_IP"

if [[ $? -ne 0 ]]; then
    umount -fl $MOUNT_POINT
    mount "$NFS_HOST:$NFS_HOST_PATH" $MOUNT_POINT
fi

información relacionada