“Устаревшая файловая дескриптор” в некоторых директориях возникает сразу после монтирования NFS; дескрипторы файлов не открыты.

Вопрос или проблема

В течение некоторого времени я испытываю странную проблему с 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 на уровне системы.

Рекомендации

  1. Проверка настроек экспорта:
    Убедитесь, что ваши экспорта в файле /etc/exports настроены правильно. Уберите общие параметры, такие как fsid=0, и определяйте каждый экспорт отдельно.

  2. Перезагрузка NFS сервиса:
    После внесения изменений в файл экспортов необходимо перезапустить службу NFS на сервере:

    systemctl restart nfs-server
  3. Настройка прав доступа:
    Убедитесь, что на стороне сервера и клиента установлены правильные права доступа к директориям, которые вы экспортируете. Некорректные права могут вызывать конфликты при попытке доступа к контенту.

  4. Логи и диагностика:
    При повторной установке NFS монтируйте директории с активированными логами, чтобы отслеживать любые ошибки, которые могут возникнуть, и делать анализ на основе этих логов.

    mount -t nfs -o vers=4,noac,hard,intr,rw,proto=tcp 192.168.0.2:/ /nfs
  5. Проверка версий ядра:
    Возможные несовместимости между версиями ядра клиента и сервера NFS могут также вызывать проблемы. Убедитесь, что версии обновлены и соответствуют друг другу.

Заключение

Решение проблемы "Старый дескриптор файла" на уровне NFS требует внимания к конфигурации экспорта, а также проверки логов и прав доступа. Предложенные изменения помогут вам устранить текущие проблемы и восстановить нормальную работу с монтированными директориями NFS. Следуя этим рекомендациям, вы сможете более стабильно и надежно настроить вашу систему.

Оцените материал
Добавить комментарий

Капча загружается...