Home » Ошибки » Dovecot и nfs, ошибка Error: fcntl(read-lock) locking failed for file dovecot.index

Dovecot и nfs, ошибка Error: fcntl(read-lock) locking failed for file dovecot.index

Я использую конфигурацию почтового сервера postfix+dovecot с хранением всей почтовой базы на nfs сервере. Мне понадобилось переустановить nfs сервер, где хранилась почтовая база. Временно перенес всю базу на другой сервер, переустановил основной и стал запускать его в работу. Столкнулся с неожиданной ошибкой, которую не смог сразу победить, пришлось повозиться.

Изначально эту связку настраивал не я, она досталась в наследство. С nfs я раньше работал, ничего сложного, каких-то проблем не видел в этом. Поэтому смело перенес почтовую базу и переустановил сервер. Вернул все обратно, смонтировал на почтовый сервер nfs каталог и запустил dovecot. Тут-то и начались проблемы.

Как оказалось, в работе dovecot по nfs есть много нюансов. Подробно о них написано в официальной вике, на страничке, специально посвященной nfs. Я все там внимательно просмотрел, принял к сведению информацию и начал пробовать менять настройки в конфиге dovecot.conf и в параметрах монтирования nfs каталога. Ничего не помогало. Постоянно была ошибка:

Feb 15 00:02:39 IMAP: Error: fcntl(read-lock) locking failed for file /data/mail/virtual/user@mailserver.ru/Maildir/dovecot.index: Input/output error

Я пробовал отключать fcntl и использовать блокировки dotlocks, как рекомендовали некоторые из гугла:

lock_method = dotlock

Работает это очень медленно и постоянно вылезали ошибки синхронизации каталога. Отказался от этого варианта. Да и к тому же я знал, что раньше все отлично работало, просто я упустил какой-то момент. Так как я перенастраивал сервер nfs, очевидно, что я что-то забыл настроить на нем, чтобы все работало нормально.

Стал разбираться с теорией по nfs. Конкретно по приведенной ошибке dovecot я не смог найти ничего полезного, что помогло бы решить проблему. Стало понятно, что не хватает какой-то общей настройки, которая непосредственно к dovecot не имеет отношения. Для того, чтобы нормально работали блокировки fcntl, необходимо, чтобы на клиенте и на сервере работал некий демон по синхронизации этих блокировок.

Когда я это понял, приблизился к решению проблемы. Заметил в логе на сервере следующие ошибки:

kernel: lockd: cannot monitor mailserver.local

И похожие на клиенте:

kernel: lockd: server 10.10.10.1 not responding, timed out

Тут я уже понял, что на сервере не хватает службы, которая бы синхронизировала блокировки со службой на клиенте. Еще немного поискал в интернете и нашел решение. Достаточно было просто запустить на сервере (CentOS 7) службы:

# systemctl start rpcbind
# systemctl start nfs-lock
# systemctl start nfs-idmap

и после этого перезапустить сам сервер nfs:

# systemctl restart nfs-server

Для надежности я заново примонтировал на клиенте каталог. Для тех, кто будет решать похожие проблемы, приведу свои конфиги рабочего варианта хранилища почты dovecot через nfs.

На сервере расшариваем каталог со стандартными параметрами. Тут ничего особенного:

# cat /etc/exports

/mnt/mail 10.10.10.2(rw,sync,no_root_squash)

На клиенте монтируем раздел со следующими параметрами:

# mount -o rsize=32768,wsize=32768,hard,fg,lock,nfsvers=3,tcp,retrans=0,actimeo=0 10.10.10.1:/mnt/mail /mail

В конфиге dovecot должны быть следующие параметры:

mmap_disable = yes
dotlock_use_excl = no
mail_nfs_index=yes
mail_nfs_storage= yes

На сервере должны работать указанные выше службы, на клиенте (в моем случае CentOS 6) достаточно службы portmap:

# yum install -y nfs-utils portmap
# chkconfig —level 2345 portmap on
# service portmap start

После проделанных действий ошибка из заголовка статьи исчезла и dovecot стал нормально работать с почтовой базой по nfs.


Помогла статья? Есть возможность отблагодарить автора

Добавить комментарий

Ваш e-mail не будет опубликован.