Как известно, dovecot (да и многие другие сервисы) весьма чувствительны к точному времени. В частности, если ntpd начинает переводить стрелки, dovecot тут же умирает с воплями 'time went backward'.Главная проблема заключается в том, что при загрузке FreeBSD система rc-скриптов задает очередность запуска демонов, но не гарантирует, что к моменту запуска последующего демона предыдущий выйдет на штатный режим. В частности, ntpd честно запускается ранее, чем dovecot, но далеко не всегда успевает выставить время. Обычно, ко времени запуска довекота, он даже не успевает со всеми серверами из пула пообщаться. Как результат - переводить стрелки ntpd начинает тогда, когда dovecot уже вовсю работает. Итог понятен.
Поскольку проблема заключена не в ntpd или dovecot, а в rc-скриптах, решение сделано средствами rc-скриптов:
-------------------8<-----------------------------
#!/bin/sh
#
# PROVIDE: ntpwait
# REQUIRE: ntpd
# BEFORE: LOGIN# Place that file into /usr/local/etc/rc.d/ntpwait.sh
# Extension '.sh' is mandatory
# Add 'ntpwait_enable="YES"' to the /etc/rc.conf
# Add 'ntpwait_flags="120"' to set delay in seconds. /etc/rc.subr
name="ntpwait"
rcvar=`set_rcvar`
command="/bin/sleep"
: ${ntpwait_flags="30"}load_rc_config $name
run_rc_command "$1"
#
-------------------8<-----------------------------Данный скрипт приостанавливает запуск прочих rc-скриптов сразу после запуска ntpd, чтобы дать ему время отчехлиться. Если дефолтных 30 сек вам покажется мало, можете флагами задать нужное время.
Еще раз обращаю внимание: файл скрипта должен иметь расширение .sh, хотя большинство скриптов, там лежащих, его не имеют. Так надо.
А если так - сначала запустить ntpdate, сделать начальную синхронизацию, а затем запускать сам ntpd? Вроде, так делается при запуске ntpd в шапке.
> А если так - сначала запустить ntpdate, сделать начальную синхронизацию, а затем
> запускать сам ntpd? Вроде, так делается при запуске ntpd в шапке.В настоящее время ntpdate считается устаревшим, и взамен него предлагается запускать ntpd с флагом -g (или ntpd_sync_on_start="YES"). В любом случае не гарантируется, что точное время будет выставлено до запуска чувствительных ко времени софтов.
Собственно, до определенного момента я успешно пользовался ntpd_sync_on_start, пока мне в работу не попала машинка, у которой из-за дефекта кварца время биоса убегает вперед на 15-20 сек в сутки. При этом даже крупношаговый перевод стрелок в стиле ntpdate занимает у ntpd заметное время. Заметно большее, чем остается до запуска довекота.
>[оверквотинг удален]
> : ${ntpwait_flags="30"}
> load_rc_config $name
> run_rc_command "$1"
> #
> -------------------8<-----------------------------
> Данный скрипт приостанавливает запуск прочих rc-скриптов сразу после запуска ntpd, чтобы
> дать ему время отчехлиться. Если дефолтных 30 сек вам покажется мало,
> можете флагами задать нужное время.
> Еще раз обращаю внимание: файл скрипта должен иметь расширение .sh, хотя большинство
> скриптов, там лежащих, его не имеют. Так надо.Спасибо. Ну это можно в рубрику "Советы" отправить.
>>Так надо.А почему так надо?
>>>Так надо.
> А почему так надо?Потому что скрипты без расширения запускаются главным шеллом в бекграунде, а с расширением - внутри основного потока главного шелла.