Гайд: Траблшутинг размонтирования и зависания томов NFS: параметры монтирования soft/hard, intr, noresvport
Архитектура протокола Network File System (NFS) и причины блокировок
Сетевая файловая система NFS (Network File System v3/v4) транслирует системные вызовы VFS (open, read, write, stat) через сетевой RPC-протокол (Remote Procedure Call). Если удаленный NFS-сервер (NAS/SAN) перестает отвечать, сетевой коммутатор теряет пакеты или NAT-шлюз сбрасывает TCP-сессию, клиентская операционная система Linux сталкивается с глухими зависаниями потоков:
- Процессы зависают в D-state (Uninterruptible Sleep): Системные команды
df -h,ls /mnt/nfsили скрипты мониторинга блокируются намертво и не могут быть завершены даже черезkill -9; - Load Average сервера взлетает до сотен: Каждый процесс, попытавшийся обратиться к зависшему NFS-каталогу, увеличивает счетчик нагрузки системы;
- Ошибки в dmesg:
nfs: server nfs-storage not responding, still tryingилиnfs: server nfs-storage OK.
Бизнес-риски
Полная парализация работы веб-кластеров, использующих общий NFS-каталог для аплоадов/медиафайлов, зависание резервного копирования.
Сравнение режимов монтирования NFS: Hard vs Soft
| Параметр монтирования | Поведение при обрыве сети к NFS-серверу | Рекомендация по применению |
|---|---|---|
hard (дефолт) | Клиент отправляет RPC-запросы бесконечно, полностью замораживая процесс до восстановления связи. Исключает потерю данных. | Рекомендуется для критических данных (БД, транзакционные хранилища). |
soft | После retrans неудачных попыток (таймаут timeo) запрос завершается с ошибкой ввода-вывода (EIO). | Для некритичных данных (кэши статики, логи). Опасно повреждением файлов при записи! |
Регламент аварийного восстановления и надежной настройки NFS
Сценарий 1: Аварийное принудительное «ленивое» размонтирование зависшей точки (Lazy Unmount)
Если процесс висит наглухо и обычный umount /mnt/nfs выдает «target is busy» или зависает:
# 1. Принудительное и ленивое размонтирование (Lazy Unmount):
sudo umount -f -l /mnt/nfs
# Флаг -f (force) принудительно прерывает активные RPC-запросы.
# Флаг -l (lazy) немедленно отсоединяет файловую систему от дерева VFS, очищая оставшиеся дескрипторы в фоне.Сценарий 2: Завершение процессов, удерживающих зависший NFS-моунт
# 1. Поиск зависших процессов утилитой fuser:
sudo fuser -vm /mnt/nfs
# 2. Принудительное завершение всех процессов в точке монтирования:
sudo fuser -km /mnt/nfsСценарий 3: Настройка эталонных параметров монтирования в /etc/fstab
Сконфигурируйте надежные параметры монтирования для предотвращения зависаний:
# Рекомендуемая строка монтирования NFSv4 в /etc/fstab:
nfs-server.example.com:/exports/data /mnt/nfs nfs4 rw,hard,intr,noresvport,timeo=600,retrans=2,rsize=1048576,wsize=1048576,nofail,x-systemd.automount,_netdev 0 0Разбор ключевых параметров:
noresvport: Указывает использовать непривилегированные TCP-порты при переподключении. Критически важно при перезапуске NFS-сервера через NAT или файрвол;intr: Разрешает прерывать зависшие RPC-запросы сигналами от пользователя (Ctrl+C / SIGINT);rsize=1048576,wsize=1048576: Размер блоков передачи 1 МБ для максимальной скорости на 10G/40G сетях;x-systemd.automount: Монтирует каталог только при реальном первом обращении к нему, исключая зависание системы при старте;_netdev: Гарантирует ожидание поднятия сети перед монтированием.
Типовые ошибки администраторов
- Монтирование с параметром soft для операций записи: При кратковременном сетевом лаге клиент NFS с опцией
softпрерывает запись на середине файла, вызывая скрытое необратимое повреждение документов и архивов. - Использование NFS v3 без блокировки портов rpcbind: В NFSv3 службы
lockd,mountdиstatdиспользуют случайные динамические порты, которые регулярно блокируются межсетевыми экранами (iptables/UFW). Используйте протокол NFSv4 (работает строго по одному TCP-порту 2049).
Эксперты ITSTM переведут сетевое хранилище на NFSv4.2 / CephFS, настроят отказоустойчивые multipath-маршруты и оптимизируют параметры RPC-буферов.
Частые вопросы (FAQ)
Почему df -h зависает намертво при недоступности хотя бы одного NFS шара?
Команда df выполняет системный вызов statfs() на абсолютно всех смонтированных файловых системах по очереди. Если один NFS-сервер недоступен, statfs() зависает в очереди ядра. Используйте df -l (только локальные диски).
Как проверить версию протокола NFS на клиенте?
Выполните команду nfsstat -m или cat /proc/mounts | grep nfs.
Что означает ошибка 'NFS: server requires secure port'?
NFS-сервер требует исходящих запросов только с привилегированных портов (<1024). На сервере добавьте опцию insecure в /etc/exports или уберите noresvport на клиенте.
Как принудительно сбросить кэш атрибутов NFS на клиенте?
Используйте параметры монтирования actimeo=0 или noac (отключает локальный кэш метаданных, заставляя клиент каждый раз запрашивать актуальный размер файла с сервера).