переустановить клиент NFS без перезагрузки

10

Я работаю на своем сервере, с которого я экспортирую один каталог, используя NFS. Конечно, в течение недели или около того перезагрузок сервера я несколько раз забывал umountэкспортировать файловую систему на моей рабочей станции (которая монтируется /etc/fstabпри загрузке). В промежутке я смог umountпосле факта и перемонтировать ( не пользуюсь autofs):

umount -fl /data0
mount /data0

Но это больше не работает.

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

То , что я пытался это удаление ( rmmod) с nfsи nfsv3модуль (который не будет работать: Resource temporarily unavailable). lsofвиснет. mountне показывает ничего подключенного через nfs. Вероятно, это все результат использования umount -l несколько раз, но первые два раза это работало без проблем.

Я перезапустил сервер в это время, после того, как я не смог смонтировать его без какой-либо разницы. Я тоже использовал service nfs-kernel-server restart. Я подозреваю, что все вернется в нормальное состояние, если я перезапущу клиентскую рабочую станцию.

Есть ли способ восстановиться после этого и повторно инициализировать клиентскую часть nfs на моей рабочей станции без перезагрузки?
Если я не смогу это исправить без перезагрузки, не произойдет ли это снова, если я начну использовать autofs?

lsof -b висит как последние строки:

lsof: avoiding readlink(/run/user/1001/gvfs): -b was specified.
lsof: avoiding stat(/run/user/1001/gvfs): -b was specified.
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1001/gvfs
      Output information may be incomplete.

в линиях, предшествующих этому, нет /data0.

Запись в /etc/fstab:

192.168.0.2:/data0 /data0  nfs  defaults,auto,nolock,user 0 2
Энтон
источник
«Но первые два раза это работало без проблем» ... напоминает мне русскую рулетку. Имеет ли lsof -bвешать?
Муру
@muru Да, это зависает, я обновил Q с выходом. Кстати, я никогда не слышал, чтобы кто-то жаловался на проигрыш в русской рулетке, так что это должна быть беспроигрышная игра. Я обычно ожидаю, что вещи никогда не сработают, ни разу, ни всегда, а не несколько раз Х, но, возможно, обстоятельства были другими.
Антон
Какой дистрибутив вы используете? Процесс сильно варьируется.
Грэм
@Graeme Это Linix Mint 17.1 (Ребекка)
Anthon
Не уверен, как это работает в Ubuntu upstartи все. Вы, вероятно, хотите перезапустить все службы в nfs-commonпакете, похоже, их несколько. Скорее всего, порядок также имеет значение, поэтому попробуйте прекратить, затем начните в порядке зависимости. Вы, вероятно, также хотите сделать в rpcbindкачестве вашей последней остановки / первого запуска. Я делал это раньше на Debian, но у него есть только один хороший nfs-commonсервис.
Грэм

Ответы:

5

Как подсказывает @PaperMonkey в комментариях, вы можете быть испорчены, потому что вы использовали параметры монтирования по умолчанию, которые включают повторные попытки навсегда.

intrРаньше это был способ облегчить прерывание вещей, которые застряли при вводе / выводе, на сломанное монтирование NFS, но теперь это неоперация. SIGKILLвсе еще может прерывать процессы, застрявшие в NFS, по крайней мере, так nfs(5)утверждает. Смотрите эту страницу руководства для вариантов монтирования.

Используйте softвместо значения по умолчанию, hardесли вы хотите, чтобы NFS не повторялась вечно.

Я также рекомендую использовать автомонтер. Сделайте символические ссылки на / net / host / foo / bar где-нибудь, если хотите.

Часто проще просто перезагрузиться, но я думаю, что теоретически вы должны быть в состоянии kill -9(то есть kill -KILL) любые процессы, которые застряли в NFS. ТОГДА может работать. Только будьте осторожны, чтобы не допустить, чтобы при завершении NFS больше процессов застревало.

Питер Кордес
источник
Теоретически, но эти процессы трудно найти, когда lsof зависает.
kmarsh
@kmarsh: любой процесс в состоянии D(Disk-sleep) в ps / top, вероятно, застрял в NFS.
Питер Кордес
1
Обратите внимание, что при использовании «soft» вместо «hard» существует вероятность потери данных каждый раз, когда NFS-сервер временно недоступен.
Marki555
4

Ниже приведен список команд, которые необходимо выполнить для устранения этой проблемы в дистрибутиве на основе RPM.

service rpcbind stop
service nfslock stop
rm -rf /var/lib/nfs/statd/sm/*
rm -rf /var/lib/nfs/statd/sm.bak/*

После этого:

umount -f /share
zombi_man
источник
1

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

Чтобы решить проблему без перезапуска, вы можете обойтись umount -a(размонтировать все, что указано в / etc / fstab) mount -a(смонтировать все в / etc / fstab), но я не могу, если потерянный каталог содержит домашний каталог, который вы ' Лучше всего сохранить работу в другом месте и просто перезагрузиться.

Centimane
источник
0

Используйте результаты команды lsof, чтобы найти процессы на клиенте, содержащие ссылки на устаревшую файловую систему, и уничтожить эти процессы.

umount -f / data0

убедитесь, что вы можете пропинговать сервер, а затем перемонтировать диск. Перезапустите все нужные процессы.

Кластеры

Обратите внимание: если вы запустите настройку кластерного сервера, вы будете получать устаревший дескриптор файла nfs каждый раз, когда сервер должен переключаться при сбое. Чтобы избежать этого, вы должны экспортировать свои файловые системы, используя опцию fsid. Номер для fsid должен быть одинаковым для каждой соответствующей файловой системы на двух серверах. Это зависит от вас, чтобы обеспечить репликацию файлов. Смотрите фрагмент из справочной страницы ниже:

fsid = num | root | uuid NFS должна иметь возможность идентифицировать каждую экспортируемую файловую систему. Обычно он использует UUID для файловой системы (если в файловой системе есть такая вещь) или номер устройства, на котором хранится файловая система (если файловая система хранится на устройстве). Поскольку не все файловые системы хранятся на устройствах, и не все файловые системы имеют UUID, иногда необходимо явно указать NFS, как идентифицировать файловую систему. Это делается с помощью опции fsid =.

Для NFSv4 существует выделенная файловая система, которая является корнем всей экспортируемой файловой системы. Это указывается с помощью fsid = root или fsid = 0, которые означают одно и то же.

Другие файловые системы могут быть обозначены маленьким целым числом или UUID, который должен содержать 32 шестнадцатеричных цифры и произвольную пунктуацию.

Ядра Linux версии 2.6.20 и более ранние не понимают настройки UUID, поэтому необходимо использовать маленькое целое число, если для таких ядер необходимо установить параметр fsid. Поддерживается установка как небольшого числа, так и UUID, поэтому можно настроить одинаковую конфигурацию для работы как со старым, так и с новым ядром.

UDude
источник
Он уже сказал, что Lsof висит.
kmarsh