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

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

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Изначально эту связку настраивал не я, она досталась в наследство. С 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.

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar