Вопрос или проблема
В течение некоторого времени я испытываю странную проблему с NFS, когда, казалось бы, случайный подмножество директорий (всегда одни и те же) под /
постоянно появляются со старыми файловыми дескрипторами сразу после монтирования NFS.
Мне удалось исправить проблему, явно экспортировав это случайное множество проблемных директорий, но я хотел бы выяснить, могу ли я исправить ситуацию более полностью, чтобы не пришлось время от времени добавлять случайные директории в таблицу экспорта.
Ниже я монтирую файловую систему, показываю, что нет открытых файловых дескрипторов, запускаю ls
и перезапускаю lsof
. Пустые строки добавлены между командами для ясности:
# mount -t nfs -o vers=4,noac,hard,intr 192.168.0.2:/ /nfs -vvv
mount.nfs: пытаюсь использовать текстовые параметры 'vers=4,noac,hard,intr,addr=192.168.0.2,clientaddr=192.168.0.4'
192.168.0.2:/ на /nfs типа nfs (rw,vers=4,noac,hard,intr)
# lsof | grep /nfs
# ls -lh /nfs
ls: не удается получить доступ к /nfs/usr: Старый файловый дескриптор
ls: не удается получить доступ к /nfs/root: Старый файловый дескриптор
ls: не удается получить доступ к /nfs/etc: Старый файловый дескриптор
ls: не удается получить доступ к /nfs/home: Старый файловый дескриптор
lrwxrwxrwx 1 root root 7 Mar 27 2017 bin -> usr/bin
drwxr-xr-x 6 root root 16K Jan 1 1970 boot
drwxr-xr-x 438 i336 users 36K Feb 28 12:12 data
drwxr-xr-x 2 root root 4.0K Mar 14 2016 dev
d????????? ? ? ? ? ? etc
d????????? ? ? ? ? ? home
lrwxrwxrwx 1 root root 7 Mar 27 2017 lib -> usr/lib
lrwxrwxrwx 1 root root 7 Mar 27 2017 lib64 -> usr/lib
drwxr-xr-x 15 root root 4.0K Oct 15 15:51 mnt
drwxr-xr-x 2 root root 4.0K Aug 9 2017 nfs
drwxr-xr-x 14 root root 4.0K Jan 28 17:00 opt
dr-xr-xr-x 2 root root 4.0K Mar 14 2016 proc
d????????? ? ? ? ? ? root
drwxr-xr-x 2 root root 4.0K Mar 14 2016 run
lrwxrwxrwx 1 root root 7 Mar 27 2017 sbin -> usr/bin
drwxr-xr-x 6 root root 4.0K Jun 22 2016 srv
dr-xr-xr-x 2 root root 4.0K Mar 14 2016 sys
drwxrwxrwt 2 root root 4.0K Dec 10 2016 tmp
d????????? ? ? ? ? ? usr
drwxr-xr-x 15 root root 4.0K May 24 2017 var
# lsof | grep /nfs
#
Подкаталоги, о которых идет речь, не являются точками монтирования; они выглядят совершенно нормально:
$ ls -dlh /usr /root /etc /home
drwxr-xr-x 123 root root 12K Mar 3 13:34 /etc
drwxr-xr-x 7 root root 4.0K Jul 28 2017 /home
drwxrwxrwx 32 root root 4.0K Mar 3 13:55 /root
drwxr-xr-x 15 root root 4.0K Feb 24 17:48 /usr
В syslog нет связанных ошибок по этим директориям. Единственная информация, которая появляется, относится к другому набору директорий:
... rpc.mountd[10080]: Не удается экспортировать /proc, возможно, неподдерживаемая файловая система или требуется fsid=
... rpc.mountd[10080]: Не удается экспортировать /dev, возможно, неподдерживаемая файловая система или требуется fsid=
... rpc.mountd[10080]: Не удается экспортировать /sys, возможно, неподдерживаемая файловая система или требуется fsid=
... rpc.mountd[10080]: Не удается экспортировать /tmp, возможно, неподдерживаемая файловая система или требуется fsid=
... rpc.mountd[10080]: Не удается экспортировать /run, возможно, неподдерживаемая файловая система или требуется fsid=
Вот как в настоящее время выглядит /etc/exports
:
/ *(rw,subtree_check,no_root_squash,nohide,crossmnt,fsid=0,sync)
Сервер работает на Arch Linux и в данный момент находится на ядре 4.10.3.
Клиентская сторона – Slackware 14.1 с ядром 4.1.6.
Ваш файл exports
выглядит аномально для NFS 4:
/ *(rw,subtree_check,no_root_squash,nohide,crossmnt,fsid=0,sync)
Вместо этого, я думаю, вам нужно следовать
инструкциям Arch Linux
для этой строки fsid=0
. Она объявляет специальный экспорт, «так называемый корень NFS».
Затем объявите свои собственные экспорты на следующих строках, как показано в инструкциях.
Вы можете экспортировать корневую файловую систему сервера — не путать с корнем NFS —
как показано в этом старом посте Gentoo.
Ответ или решение
Проблема "Старые дескрипторы файлов" при работе с NFS
Введение
При взаимодействии с файловыми системами NFS (Network File System) может возникнуть ошибка "Старый дескриптор файла" ("Stale file handle"). Эта проблема чаще всего происходит, если клиент пытается получить доступ к файлам или директориям, которые были изменены или которые были переэкспортированы на сервере. Ваша ситуация — наличие этой ошибки после монтирования определенных директорий на NFS — указывает на возможные проблемы с настройками экспорта или на конфликт версий.
Описание проблемы
Как вы уже отметили, ошибка возникает при выполнении команды ls
, где клиент не может получить доступ к директориям /usr
, /root
, /etc
, и /home
. Команда lsof
, которая отвечает за отображение открытых дескрипторов файлов, также показывает, что нет открытых дескрипторов для этих директорий. Это указывает на то, что проблема не связана с активным доступом к файлам, а, скорее, с настройками экспорта на сервере.
Проблема может быть обусловлена неправильной конфигурацией файла /etc/exports
, так как использование опции fsid=0
подразумевает, что вы экспортируете корневую файловую систему как специальный экспорт. Это может вызывать конфликт между ожидаемыми и фактическими путями доступа.
Настройки экспорта NFS
Ваш текущий файл /etc/exports
выглядит следующим образом:
/ *(rw,subtree_check,no_root_squash,nohide,crossmnt,fsid=0,sync)
Главная проблема заключается в том, что экспорта корневой файловой системы с использованием fsid=0
может привести к некорректному поведению. Вместо того чтобы полагаться на этот экспорт, рекомендуется индивидуально определить каждый экспорт в файле /etc/exports
. Убедитесь, что у вас есть отдельные строки для каждой директории, например:
/usr *(rw,sync,no_subtree_check)
#/home *(rw,sync,no_subtree_check)
#/etc *(rw,sync,no_subtree_check)
Это позволит четко определить доступ и более корректно интегрировать NFS на уровне системы.
Рекомендации
-
Проверка настроек экспорта:
Убедитесь, что ваши экспорта в файле/etc/exports
настроены правильно. Уберите общие параметры, такие какfsid=0
, и определяйте каждый экспорт отдельно. -
Перезагрузка NFS сервиса:
После внесения изменений в файл экспортов необходимо перезапустить службу NFS на сервере:systemctl restart nfs-server
-
Настройка прав доступа:
Убедитесь, что на стороне сервера и клиента установлены правильные права доступа к директориям, которые вы экспортируете. Некорректные права могут вызывать конфликты при попытке доступа к контенту. -
Логи и диагностика:
При повторной установке NFS монтируйте директории с активированными логами, чтобы отслеживать любые ошибки, которые могут возникнуть, и делать анализ на основе этих логов.mount -t nfs -o vers=4,noac,hard,intr,rw,proto=tcp 192.168.0.2:/ /nfs
-
Проверка версий ядра:
Возможные несовместимости между версиями ядра клиента и сервера NFS могут также вызывать проблемы. Убедитесь, что версии обновлены и соответствуют друг другу.
Заключение
Решение проблемы "Старый дескриптор файла" на уровне NFS требует внимания к конфигурации экспорта, а также проверки логов и прав доступа. Предложенные изменения помогут вам устранить текущие проблемы и восстановить нормальную работу с монтированными директориями NFS. Следуя этим рекомендациям, вы сможете более стабильно и надежно настроить вашу систему.