Размонтировать привязку устаревшей NFS
У меня проблема с удалением монтировок, созданных с mount -o bind
из локально смонтированной папки NFS. Предположим следующую структуру монтирования:
NFS смонтированный каталог:
$ mount -o rw,soft,tcp,intr,timeo=10,retrans=2,retry=1 \
10.20.0.1:/srv/source /srv/nfs-source
Связанный каталог:
$ mount -o bind /srv/nfs-source/sub1 /srv/bind-target/sub1
Что приводит к этой карте горы
$ mount
/dev/sda1 on / type ext3 (rw,errors=remount-ro)
# ...
10.20.0.1:/srv/source on /srv/nfs-source type nfs (rw,soft,tcp,intr,timeo=10,retrans=2,retry=1,addr=10.20.0.100)
/srv/nfs-source/sub1 on /srv/bind-target/sub1 type none (rw,bind)
Если сервер (10.20.0.1
) понижается (например, ifdown eth0
), ручки становятся несвежими, что ожидается.
Теперь я могу отменить монтирование NFS с силой
$ umount -f /srv/nfs-source
Это занимает несколько секунд, но работает без проблем. Тем не менее, я не могу размонтировать связанный каталог в /srv/bind-target/sub1
, Вынужденный umount
результаты в:
$ umount -f /srv/bind-target/sub1
umount2: Stale NFS file handle
umount: /srv/bind-target/sub1: Stale NFS file handle
umount2: Stale NFS file handle
Вот след http://pastebin.com/ipvvrVmB
Я пробовал предварительно размонтировать подкаталоги, найти любые процессы, имеющие доступ к чему-либо внутри NFS или bind mounts (их нет).
lsof
также жалуется:
$ lsof -n
lsof: WARNING: can't stat() nfs file system /srv/nfs-source
Output information may be incomplete.
lsof: WARNING: can't stat() nfs file system /srv/bind-target/sub1 (deleted)
Output information may be incomplete.
lsof: WARNING: can't stat() nfs file system /srv/bind-target/
Output information may be incomplete.
Я пытался с последними стабильными ядрами Linux 3.2.17, 3.2.19 и 3.3.8 (не могу использовать 3.4.x, потому что нужен патч grsecurity, который пока не поддерживается - grsecurity не исправлен в тестах выше!).
У меня nfs-utils версии 1.2.2 (стабильная версия Debian).
Кто-нибудь есть идеи, как я могу либо:
- заставить демонтировать другой путь? (любая грязная уловка приветствуется, потеря данных или повреждение незначительны в этот момент)
- использовать что-то другое вместо
mount -o bind
? (нельзя использовать программные ссылки, потому что смонтированные каталоги будут использоваться в chroot;bindfs
через FUSE далеко до медленного будет вариант)
Спасибо пол
Обновление 1
- С 2.6.32.59 размонтирование (устаревших) подмонтирований работает просто отлично. Кажется, это ошибка регрессии ядра.
- Выше тесты, где с NFSv3. Дополнительные тесты с NFSv4 не показали изменений.
Обновление 2
- Мы протестировали несколько ядер 2.6 и 3.x и теперь уверены, что это было введено в 3.0.x. Мы заполним отчет об ошибке, надеюсь, они это выяснят.
3 ответа
Что-то, что работало для меня в моей конкретной установке, чтобы заставить работать клинтов, было так:
У меня было дерево autofs с смонтированным nfs fs в / fs / doom и другим, смонтированным в /fs/doom/localvol5. После перезагрузки сервера было возможно получить доступ к / fs / doom и /fs/doom/localvol5/sub, но / fs / doom / localvol5 сам дал ESTALE для всего, включая umount -f, -l, -fl.
Чтобы клиент работал без перезагрузки, я переместил всю иерархию / fs / doom в другое дерево:
mkdir /dev/shm/garbage-mount
mount --move /fs/doom /dev/shm/garbage-mount
Это переместило все дерево, и, очевидно, работает только потому, что / fs / doom был доступен и точка монтирования. Я не могу размонтировать ни одну из этих файловых систем, но я смог перезапустить autofs и получить новое и работающее дерево.
Это должно работать с любым деревом autofs, имеющим неправильно работающие подкаталоги nfs.
Надеюсь, это поможет.
Вы можете просто смонтировать удаленную файловую систему в /srv/bind-target/sub1.
Если вы ожидаете такой уровень недоступности, вам также следует указать опцию синхронизации (хотя, возможно, по умолчанию) для NFS, чтобы снизить вероятность неписанных изменений на вашем клиенте.
$ umount -l
Работал на меня, прежде чем никто из них не работал
$ mount -f ...