На серверном узле можно получить доступ к экспортированной папке. Однако после перезагрузки (как сервера, так и клиента) папка больше не доступна для клиентов.
На сервере
# 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
Я должен сказать, что на стороне клиента не было проблем с общей папкой, однако после перезагрузки (сервер и клиент) я вижу это сообщение.
Как это исправить?
Порядок перезагрузок важен. Перезагрузка сервера после клиентов может привести к этой ситуации. Устаревший дескриптор NFS указывает, что у клиента открыт файл, но сервер больше не распознает дескриптор файла. В некоторых случаях NFS очищает свои структуры данных после тайм-аута. В других случаях вам нужно будет самостоятельно очистить структуры данных NFS и после этого перезапустить NFS. Расположение этих структур в некоторой степени зависит от O / S.
Попробуйте перезапустить NFS сначала на сервере, а затем на клиентах. Это может очистить дескрипторы файлов.
Перезагрузка серверов NFS с файлами, открытыми с других серверов, не рекомендуется. Это особенно проблематично, если открытый файл был удален на сервере. Сервер может держать файл открытым до перезагрузки, но перезагрузка удалит дескриптор файла в памяти на стороне сервера. Тогда клиент больше не сможет открыть файл.
Определить, какие крепления были использованы с сервера, сложно и ненадежно. В showmount -a
опция может отображать некоторые активные средства передвижения, но не может сообщать обо всех из них. Заблокированные файлы легче идентифицировать, но для этого требуется, чтобы была включена блокировка, и для блокировки файлов используется клиентское программное обеспечение.
Ты можешь использовать lsof
на клиентах, чтобы определить процессы, у которых файлы открыты на монтировках.
Я использую hard
и intr
параметры монтирования на моих монтировках NFS. В hard
опция заставляет IO повторяться бесконечно. В intr
опция позволяет убивать процессы, если они ожидают завершения ввода-вывода NFS.
Попробуйте этот сценарий, который я написал:
#!/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
На сервере NFS UN-экспорт и реэкспорт файловой системы:
exportfs -u nfs-сервер: / файловая_система exportfs nfs-сервер: / файловая_система
На клиенте смонтируйте файловую систему
монтировать -t nfs nfs-сервер: / файловая система / точка_монтирования
проверьте lsof определенного пути и убейте соответствующий pid. Затем размонтируйте раздел и смонтируйте его обратно.