Сетевой каталог подвисает: жёсткое монтирование NFS
При жёстком монтировании NFS операции с файлами ждут сервер бесконечно. Если сервер стал недоступен, службы, работающие с каталогом, подвисают, а остановить их обычными средствами не получается.
Что это значит
Признак именно этой проблемы — процессы в состоянии непрерываемого ожидания: их не берёт даже сигнал KILL. Единственный выход — вернуть доступность сервера или перемонтировать ресурс принудительно.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Жёсткое монтирование без ограничения времени
По умолчанию NFS монтируется жёстко: клиент ждёт сервер сколько нужно. Это защищает данные, но подвешивает всё, что обращается к каталогу.
-
Служба зависит от каталога без объявленной зависимости
systemd не знает о связи и не останавливает службу вместе с недоступным ресурсом.
-
Процессы в непрерываемом ожидании
Такие процессы не реагируют ни на один сигнал. Перезапуск службы не помогает, остановка висит до таймаута.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Параметры монтирования: жёсткое или мягкое.
findmnt -t nfs4,nfs -o TARGET,SOURCE,OPTIONSПроцессы в непрерываемом ожидании.
ps -eo pid,stat,cmd | awk '$2 ~ /D/'Сообщения ядра о состоянии сервера NFS.
journalctl -k -b --no-pager | grep -i nfs | tail -10Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- По умолчанию NFS монтируется жёстко: клиент ждёт сервер сколько нужно. Это защищает данные, но подвешивает всё, что обращается к каталогу.
- Как проверить
-
Посмотрите параметры монтирования.
findmnt -t nfs4,nfs -o TARGET,SOURCE,OPTIONS
- Как исправить
-
Для каталогов, где важнее доступность, используйте мягкое монтирование с таймаутами:
soft,timeo=100,retrans=3. Для данных, потеря которых недопустима, оставляйте жёсткое, но добавьте зависимости и мониторинг.
- Почему происходит
- systemd не знает о связи и не останавливает службу вместе с недоступным ресурсом.
- Как проверить
-
Посмотрите зависимости службы.
systemctl show myapp.service -p RequiresMountsFor
- Как исправить
-
Добавьте
RequiresMountsFor=с нужным путём: тогда порядок запуска и остановки будет правильным.
- Почему происходит
- Такие процессы не реагируют ни на один сигнал. Перезапуск службы не помогает, остановка висит до таймаута.
- Как проверить
-
Посмотрите состояния процессов.
ps -eo pid,stat,cmd | awk '$2 ~ /D/' | head
- Как исправить
-
Восстановите доступность сервера или перемонтируйте принудительно. Иногда помогает только перезагрузка машины — это цена жёсткого монтирования.
sudo umount -f -l /mnt/nfs
Пример вывода
Сервер NFS недоступен, процессы подвисли. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
kernel: nfs: server nfs.example.internal not responding, still trying
myapp[1200]: (нет вывода — процесс заблокирован)
$ ps -eo pid,stat,cmd | awk '$2 ~ /D/'
1200 D /usr/local/bin/myapp
Связанные ошибки
- Mount process exited, code=exited, status=32: не найдено устройство Монтирование не проходит: устройство или UUID не найдены, неверная файловая система, недоступен сетевой ресурс. Код 32 от команды mount.
- Target is busy: точка монтирования занята Не удаётся отмонтировать: target is busy. Как найти процессы, которые держат точку монтирования, и корректно освободить её.
- Failed with result 'timeout' Состояние timeout: служба не уложилась в отведённое время при запуске, остановке или перезагрузке настроек.
- Automount: каталог монтируется не вовремя или отваливается Автомонтирование через .automount: как работает TimeoutIdleSec, почему ресурс отваливается и когда лучше обычный .mount.
- NFS: Stale file handle Обращение к файлу на сетевом каталоге отказывает: устаревший идентификатор файла после переэкспорта.
- Transport endpoint is not connected Ошибка 107: точка монтирования отвалилась или сокет закрыт. Разбор для сетевых файловых систем и монтирования через fuse.
- Монтирование ресурса SMB не проходит: учётные данные Сетевой ресурс Windows не монтируется: пароль в fstab, права на файл учётных данных, версия протокола.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
Источники
-
nfs(5)
Параметры монтирования hard, soft, timeo, retrans. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено остановкой тестового сервера NFS при жёстком монтировании.