Диспетчер сетевой блокировки работает совместно с Сетевой файловой системой (NFS), поддерживая управляющий файл и блокировку записей сетевых баз данных, принятую в System V. Диспетчер сетевой блокировки (rpc.lockd) и монитор состояния сети (rpc.statd) - это демоны сетевых служб. Демон rpc.statd - это процесс пользовательского уровня, а демон rpc.lockd реализован как набор нитей ядра (по аналогии с сервером NFS). Оба демона необходимы для выполнения ядром основных сетевых функций.
Примечание: NFS не поддерживает обязательную или принудительную блокировку.
Диспетчер сетевой блокировки сочетает в себе свойства как сервера, так и клиента. Функции клиента выполняют обработку запросов от приложений и их передачу диспетчеру сетевой блокировки на сервере. Сервер отвечает за прием от клиентов запросов на блокировку и генерирует вызовы для блокировки. После этого сервер отвечает на запрос клиента о блокировке.
В отличие от системы NFS, не сохраняющей данные о состоянии, Диспетчер сетевой блокировки неявно хранит информацию о состоянии. Иначе говоря, Диспетчер сетевой блокировки должен запоминать, есть ли в настоящее время блокировка для клиента. В мониторе состояния сети rpc.statd применен простой протокол, позволяющий Диспетчеру сетевой блокировки отслеживать состояние остальных компьютеров сети. Обладая подробной информацией о состоянии, Диспетчер сетевой блокировки может поддерживать согласованное состояние в среде NFS, которая сама по себе таким свойством не обладает.
Когда приложению необходимо заблокировать локальный файл, оно направляет свой запрос ядру с помощью функций lockf, fcntl и flock. Затем ядро обрабатывает запрос на блокировку. В том случае, если приложение на клиенте NFS запрашивает блокировку для удаленного файла, Диспетчер сетевой блокировки генерирует вызов удаленной процедуры (RPC).
Когда клиент получает начальный запрос на удаленную блокировку, он с помощью демона rpc.statd регистрирует этот запрос на сервере. То же самое верно и для диспетчера сетевой блокировки на сервере. При получении начального запроса от клиента, сервер зарегистрирует его на клиенте с помощью монитора состояния локальной сети.
Демон rpc.statd в каждой системе уведомляет о своей работе демоны rpc.statd других систем. При получении извещения о выходе из строя или восстановлении другого компьютера, программа-демон rpc.statd уведомляет об этом свой демон rpc.lockd.
В случае выхода сервера из строя, клиенты с заблокированными файлами должны иметь возможность восстановить блокировку. В случае выхода из строя клиента, сервер должен сохранять блокировку файлов до восстановления клиента. Кроме того, в целях сохранения общей целостности системы NFS, сам процесс аварийного восстановления должен происходить без вмешательства приложений.
Процедура аварийного восстановления проста. Когда выясняется, что клиент вышел из строя, сервер снимает блокировку с файлов, заблокированных этим клиентом. (Подразумевается, что в случае необходимости приложение клиента даст новый запрос). После того, как клиенту становится известно о сбое и восстановлении сервера, он заново передает запросы на блокировку для всех ранее заблокированных файлов. Вновь переданные серверу данные необходимы для восстановления за период отсрочки его состояния блокировки. (Период отсрочки, по умолчанию длящийся 45 секунд, - это время, в течение которого сервер ожидает от клиентов повторных запросов на блокировку.)
Программа-демон rpc.statd хранит имена хостов в /etc/sm и /etc/sm.bak, позволяя отслеживать те хосты, которые нужно уведомлять во время восстановления клиента.
По умолчанию сценарий /etc/rc.nfs запускает демоны rpc.lockd и rpc.statd вместе с остальными демонами NFS. Если NFS уже запущена, проверьте, работают ли демоны rpc.lockd и rpc.statd, выполнив инструкции из раздела Получение текущего состояние демонов NFS. Оба демона должны иметь состояние активен. Если программы-демоны rpc.lockd и rpc.statd не активны и, следовательно, не запущены, выполните следующие действия:
if [ -x /usr/sbin/rpc.statd ]; then startsrc -s rpc.statd fi if [ -x /usr/sbin/rpc.lockd ]; then startsrc -s rpc.lockd fi
Примечание: Соблюдайте указанную последовательность. Первым всегда нужно запускать демон statd.
Примечание: Соблюдайте указанную последовательность. Первым всегда нужно запускать демон statd.
Если демоны rpc.statd и rpc.lockd не запускаются, обратитесь к разделу Устранение неполадок диспетчера сетевой блокировки.
Если в системе клиента получено следующее сообщение:
clnttcp_create: RPC: Ошибка удаленной системы - Соединение отклонено rpc.statd:нет связи с statd на {сервер}
локальная система пытается информировать о процессе восстановления другую систему. При перезагрузке системы или перезапуске демонов rpc.lockd и rpc.statd имена систем перемещаются из файла /etc/sm в файл /etc/sm.bak , а демон rpc.statd пытается проинформировать все системы из файла /etc/sm.bak о необходимости восстановления.
Если демон rpc.statd может установить связь с указанным компьютером, то его запись удаляется из файла /etc/sm.bak. Если демон rpc.statd не может установить связь сразу, он повторяет попытки через фиксированный интервал. В каждом случае, если компьютер не отвечает, отправляется приведенное выше сообщение. В том случае, если необходима целостность блокировки, демон будет продолжать попытки; однако это может оказать неблагоприятное воздействие на время выполнения операций блокировки. Действия будут зависеть от состояния целевого компьютера (компьютер совсем не отвечает или время от времени переходит в рабочее состояние). Для того, чтобы это сообщение больше не появлялось, выполните следующие действия:
Примечание: Соблюдайте указанную последовательность. Первым всегда нужно запускать демон statd.
Помните, что после перезапуска демонов действует период отсрочки. Во время этого периода программы-демоны lockd ожидают повторных запросов от клиентов, файлы которых ранее были блокированы сервером. Поэтому новая блокировка не сможет вступить в силу сразу же после перезагрузки программ-демонов.
Существует и другой способ исправления:
rm /etc/sm.bak/имя-целевой-системы
В результате целевому компьютеру не будут поступать команды об участии в восстановлении блокировки. Компьютер будет использоваться только в случае, если на нем не будет запущено никаких приложений, участвующих в сетевой блокировке и взаимодействующих с указанным сервером.
Если заблокировать файл для клиента не удается, выполните следующие действия:
Примечание: Соблюдайте указанную последовательность. Первым всегда нужно запускать демон statd.
Если после выполнения описанной процедуры ошибка не будет исправлена, запустите демон lockd в режиме отладки. Для этого выполните следующие действия:
/usr/sbin/rpc.lockd -d1
При включении флага -d1 демон lockd заносит в протокол системы дополнительные диагностические сообщения. Сначала вы увидите серию сообщений, относящихся к операциям периода отсрочки. Подождите, пока они не закончатся. После того как период отсрочки закончится и на сервере, и на клиентах, запустите приложение, в котором возникли ошибки блокировки, и проверьте, передается ли запрос на блокировку от клиента серверу и обратно.