Назад | Перейти на главную страницу

ls зависает после перезагрузки NFS-сервера

У меня есть сервер A и сервер B. B действует как сервер nfs, A монтируется из B.

Оба работают на EC2.

Иногда мне приходится выключать B и запускать новый экземпляр (идентичный экземпляр). После резервного копирования B попытка сделать что-либо внутри смонтированного каталога на A (например, ls) просто зависает.

Я пытаюсь настроить cron, который проверяет статус монтирования и перемонтирует, если что-то не так.

Есть ли способ проверить состояние маунта?

Я понял, что когда сервер NFS перезагружается, он меняет свой ip, поэтому монтирование не работает.

Написал этот сценарий, который проверяет, является ли IP-адрес хоста NFS тем IP, который в настоящее время используется при монтировании, если нет, он размонтируется и повторно монтируется. Может помочь кому-нибудь в будущем.

#!/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

Вы можете выполнить fork, чтобы дочерний элемент вошел в каталог, а затем вышел из дочернего. Попросите родителя отслеживать существование дочернего процесса с тайм-аутом. Если у вас устаревшее монтирование, дочерний элемент не сможет выйти и будет оставаться там в течение долгого времени, поэтому таймаут произойдет в родительском. Попросите родителя убить -9 ребенка и попробуйте размонтировать.

Однако проблема, с которой вы можете столкнуться, заключается в том, что если какой-либо другой процесс использует файл, который находится на сломанном монтировании, вы не сможете размонтировать его, не завершив сначала эти процессы. Вы можете (часто) определить, используют ли какие-либо процессы недоступные ресурсы на устаревшем монтировании с помощью lsof или fuser.

Однако я бы избегал автоматического уничтожения произвольных процессов с помощью магии; отправьте себе уведомление для дальнейшего расследования вручную.

Чтобы снизить вероятность этого, вам может потребоваться автоматическое монтирование, которое не будет монтировать том, пока он не понадобится / не будет запрошен ресурс на сервере, и автоматически отключит его, когда он больше не нужен.

- кстати, чтобы сделать его более доступным для поиска, вы можете пометить его словами stale, stuck, nfs и mount. Это явление не связано с использованием ec2.