«Устаревший дескриптор файла NFS» после перезагрузки


16

На узле сервера можно получить доступ к экспортированной папке. Однако после перезагрузки (как сервера, так и клиента) папка перестает быть доступной для клиентов.

На сервере

# ls /data
Folder1
Forlder2

и файл / etc / exports содержит

/data 192.168.1.0/24(rw,no_subtree_check,async,no_root_squash)

На клиенте

# ls /data
ls: cannot access /data: Stale NFS file handle

Я должен сказать, что не было никаких проблем с общей папкой со стороны клиента, однако после перезагрузок (сервер и клиент) я вижу это сообщение.

Есть ли способ это исправить?

Ответы:


22

Порядок перезагрузок важен. Перезагрузка сервера после клиентов может привести к этой ситуации. Устаревший дескриптор NFS указывает, что у клиента открыт файл, но сервер больше не распознает дескриптор файла. В некоторых случаях NFS очищает свои структуры данных по истечении времени ожидания. В других случаях вам нужно будет самостоятельно очистить структуры данных NFS и перезапустить NFS. Расположение этих структур в некоторой степени зависит от O / S.

Попробуйте перезапустить NFS сначала на сервере, а затем на клиентах. Это может очистить дескрипторы файла.

Перезагрузка серверов NFS с файлами, открытыми с других серверов, не рекомендуется. Это особенно проблематично, если открытый файл был удален на сервере. Сервер может держать файл открытым, пока он не будет перезагружен, но перезагрузка удалит дескриптор файла в памяти на стороне сервера. Тогда клиент больше не сможет открыть файл.

Определить, какие крепления были использованы с сервера, сложно и ненадежно. showmount -aОпция может показать некоторые активные крепления, но не может сообщать обо всех из них. Заблокированные файлы легче идентифицировать, но для них требуется активация блокировки, и для блокировки файлов используется клиентское программное обеспечение.

Вы можете использовать lsofна клиентах, чтобы идентифицировать процессы, у которых есть файлы, открытые на монтировках.

Я использую параметры монтирования hardи intrмонтирования на моих монтируемых NFS. hardОпция заставляет IO быть повторен на неопределенный срок. intrОпция позволяет процессам быть убиты , если они ожидают от NFS IO для завершения.


Использование hard, intrэто хороший совет. Однако обратите внимание, что NFS удваивает время ожидания с каждой попыткой. Таким образом, вы лучше всего timeo=1и retrans=5так и так. Обратите внимание, что это приведет к чрезмерной нагрузке на ваш сервер NFS после перезапуска NFS. Старайтесь не перезапускать службу NFS так часто;)
bjanssen

Ваш ответ правильный. Я также нашел другое простое решение. На узле с устаревшим обработчиком NFS просто размонтируйте и перемонтируйте папку снова.
Махмуд

4

Попробуйте этот скрипт, который я написал:

#!/bin/bash
# Purpose:
# Detect Stale File handle and remove it
# Script created: July 29, 2015 by Birgit Ducarroz
# Last modification: --
#

# Detect Stale file handle and write output into a variable and then into a file
mounts=`df 2>&1 | grep 'Stale file handle' |awk '{print ""$2"" }' > NFS_stales.txt`
# Remove : ‘ and ’ characters from the output
sed -r -i 's/://' NFS_stales.txt && sed -r -i 's/‘//' NFS_stales.txt && sed -r -i 's/’//' NFS_stales.txt

# Not used: replace space by a new line
# stales=`cat NFS_stales.txt && sed -r -i ':a;N;$!ba;s/ /\n /g' NFS_stales.txt`

# read NFS_stales.txt output file line by line then unmount stale by stale.
#    IFS='' (or IFS=) prevents leading/trailing whitespace from being trimmed.
#    -r prevents backslash escapes from being interpreted.
#    || [[ -n $line ]] prevents the last line from being ignored if it doesn't end with a \n (since read returns a non-zero exit code when it encounters EOF).

while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "Unmounting due to NFS Stale file handle: $line"
    umount -fl $line
done < "NFS_stales.txt"
#EOF

2

На NFS-сервере UN-export и реэкспорт файловой системы:

exportfs -u nfs-сервер: / file_system exportfs nfs-сервер: / file_system

На клиенте смонтировать файловую систему

mount -t nfs nfs-server: / filesystem / mount_point


0

проверьте lsof определенного пути и убейте соответствующий pid. Затем размонтируйте раздел и установите его обратно.


это больше похоже на обходной путь, чем на решение проблемы, указанной в вопросе.
asdmin
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.