Почему это важно?
Уверен, не нужно объяснять насколько важно в современных устройствах поддерживать точное системное время. Это требуется для адекватной информации в логах, работе действий выполняющихся по расписанию и, конечно же, для корректной работы каталогов, будь то Open Directory или Active Directory. Вход в систему под сетевой учетной записью, получение актуальных данных из каталога становится невозможным, если локальное время отличается от времени на сервере каталога.
Network Time Protocol
Для обеспечения синхронизации локального времени с внешним (или внутренним) источником десятки лет в качестве стандарта применяется служба Network Time Protocol (NTP; RFC-5905), реализации которой включены во все сетевые ОС и устройства. Клиентская часть получает референсное значение времени сопровождаемое временной меткой (timestamp) и корректирует относительно него локальное, учитывая временную зону и настройки перехода на летнее/зимнее время.
Реализация NTP в Mavericks
К сожалению, многие из нас успели столкнуться с неисправностью клиентской части службы NTP в системе OS X 10.9 Mavericks. Этот механизм был изменен Apple. В числе нововведений, был добавлен функционал по определению отклонения времени (оно записывается в файл ntp.drift). Модуль ntpd более не корректирует локальное время, теперь этим занимается новый компонент – pacemaker. Идея была в том, чтобы увеличить время работы от батарей, уменьшив энергопотребление за счет увеличения времени простоя процессора (idle time). Частота опросов в течение времени различается в зависимости от сценария использования компьютера, подключения к источнику питания или работе от батареи. Описываемая проблема актуальна и для последних версий OS X 10.9.5.
Симптомы
Системные настройки: Дата и время имеет бедный функционал, поэтому мы продолжим в терминале.
Первым шагом проверяем включена ли синхронизация времени с сервером NTP и какой адрес сервера настроен:
$ sudo systemsetup -getnetworktimeserver && sudo systemsetup -getusingnetworktime Network Time Server: time.euro.apple.com. Network Time: On
Если в предыдущем шаге сервер не указан или синхронизация отключена, исправим это – включаем ее и настраиваем синхронизацию с интернет-сервером точного времени time.euro.apple.com :
$ sudo systemsetup -setnetworktimeserver time.euro.apple.com && sudo systemsetup -setusingnetworktime on
Спустя несколько часов, проверяем состояние службы:
$ ntpq -c pe -c as remote refid st t when poll reach delay offset jitter ============================================================================== *time.apple.com .GPSs. 3 u 889 64 1 84.967 38.992 38.525 ind assid status conf reach auth condition last_event cnt ============================================================ 1 34353 9014 yes yes none reject reachable 1
Синхронизация работает только несколько часов после запуска, после чего перестает получать время, помечая сервер как reject.
Проверяем актуальность локального времени:
$ sntp time.euro.apple.com 2015 Nov 17 17:29:53.845391 +1.1 +/- 0.046295 secs
В данном примере, локальное время “спешит” на 1.1 секунды относительно интернет-сервера. Со временем это значение будет только увеличиваться.
Решение проблемы
Есть несколько вариантов замены штатного NTP клиента в Mavericks:
-
Сборка дистрибутива NTP из исходников ntp c ntp.org. Вам понадобится установленный Xcode. Я столкнулся с конфликтом версий библиотеки libevent, необходимой для корректной работы модуля sntp и перешел ко второму варианту.
-
Установка NTP из MacPorts – быстро и удобно (автоматическая установка зависимостей, обновляемость порта NTP). Именно этот вариант мы рассмотрим далее.
После установки из MacPorts, нам останется только переназначить пути к модулям службы NTP.
Убеждаемся что родной модуль ntpd работает из /usr/ :
$ pgrep -lf ntpd 11145 /usr/local/bin/ntpd -c /private/etc/ntp-restrict.conf -n -g -p /var/run/ntpd.pid -f /var/db/ntp.drift
Вносим изменения в файл /usr/libexec/ntpd-wrapper , необходимо закомментировать две строки и добавить их аналоги, ссылающиеся на новые модули, которые теперь располагаются в /opt/local/ .
$ sudo vi /usr/libexec/ntpd-wrapper ... # if sntp -K /dev/null -s ${server} &> ${LOG}; then if /opt/local/bin/sntp -K /dev/null -s ${server} &> ${LOG}; then ... #exec /usr/sbin/ntpd -c /private/etc/ntp-restrict.conf -n -g -p /var/run/ntpd.pid -f /var/db/ntp.drift exec /opt/local/sbin/ntpd -c /private/etc/ntp-restrict.conf -n -g -p /var/run/ntpd.pid -f /var/db/ntp.drift
Перезапускаем службу NTP:
$ sudo launchctl stop org.ntp.ntpd && sudo launchctl start org.ntp.ntpd
Проверяем лог службы на наличие ошибок:
$ tail -f /var/run/sntp.log ^C
Убеждаемся что новый модуль ntpd работает из /opt/ :
$ pgrep -lf ntpd 135 /opt/local/sbin/ntpd -c /private/etc/ntp-restrict.conf -n -g -p /var/run/ntpd.pid -f /var/db/ntp.drift
Проверяем работу службы:
$ sudo ntpq -c pe -c as && sudo sntp time.apple.com remote refid st t when poll reach delay offset jitter ============================================================================== *time.apple.com .GPSs. 1 u 57 64 377 44.792 0.914 0.663 ind assid status conf reach auth condition last_event cnt =========================================================== 1 49818 968a yes yes none sys.peer sys_peer 8 sntp 4.2.8p4@1.3265-o Thu Oct 22 03:05:53 UTC 2015 (1) 2015-11-17 17:38:58.295684 (-0300) +0.001691 +/- 0.002241 time.apple.com 17.253.52.253 s1 no-leap
Видим что отклонение составляет +0.001691 секунды. Теперь, даже после месячного аптайма, сервер не будет отвергаться службой в состояние reject.
Автоматизация
Устанавливать на сотнях машин MacPorts и править конфигурационный файл не лучший способ. Следующим шагом, было сделать удобный инструмент деплоймента новой службы на клиентские компьютеры. Вы можете использовать собраный нами пакет 10.9_NTP_Fix.pkg который удобно устанавливать удаленно на группу машин используя Apple Remote Desktop, или запуская установщик вручную.
Пакет содержит:
-
Исполняемые модули службы NTP собранные из MacPorts, такие как ntp-keygen, ntpd, ntpdc, ntpsnmpd, sntp, ntp-wait, ntpdate, ntpq, ntptrace, tickadj.
-
Отредактированный файл ntpd-wrapper
-
Зависимости (библиотеки и их вспомогательные файлы)
-
Автоматизации по размещению всех этих файлов в соответствующие папки
-
Скрипт перезапускающий службу NTP
Хочу обратить внимание, что мы не останавливаем работу pacemaker – она не мешает функционированию новой службы, а у нас всегда остается возможность вернуться к исходным компонентам. Для этого будет достаточно исправить файл /usr/libexec/ntpd-wrapper заменив две закомментированные нами ранее строки и перезапустить службу командой:
$ sudo launchctl stop org.ntp.ntpd && sudo launchctl start org.ntp.ntpd
В качестве дополнения, предлагаю добавить в файл /etc/ntp.conf на вашем внутреннем NTP сервере (вы ведь используете такой внутри своей сети?), в список серверов более одного интернет-сервера точного времени:
$ sudo vi /etc/ntp.conf server time.europe.apple.com server<a href="http://0.asia.pool.ntp.org/"> 0.asia.pool.ntp.org</a> server<a href="http://1.asia.pool.ntp.org/"> 1.asia.pool.ntp.org</a> server<a href="http://2.asia.pool.ntp.org/"> 2.asia.pool.ntp.org</a> server<a href="http://3.asia.pool.ntp.org/"> 3.asia.pool.ntp.org</a> server<a href="http://0.jp.pool.ntp.org/"> 0.jp.pool.ntp.org</a>
После перезапуска службы, список серверов будет выглядеть примерно так:
$ sudo ntpq -c pe -c as remote refid st t when poll reach delay offset jitter ============================================================================== *hkhkg1-ntp-002. .GPSs. 1 u 38 64 377 377.689 2.281 0.689 -168.63.242.24 203.123.48.219 2 u 861 1024 377 291.213 36.114 3.040 -31.193.144.2.ar 129.6.15.29 2 u 623 1024 367 85.772 11.069 1.893 +linode.dev.fawo 218.186.3.36 2 u 499 1024 377 340.318 -0.194 2.364 +82.200.209.236 91.226.136.141 2 u 327 1024 377 79.090 -2.463 1.921 -einzbern.turena 103.1.106.69 2 u 26 1024 277 382.205 -38.219 4.358 +time.apple.com 192.168.10.10 3 u 762 1024 377 0.406 1.895 0.162 ind assid status conf reach auth condition last_event cnt =========================================================== 1 14053 961d yes yes none sys.peer 1 2 14054 9324 yes yes none outlyer reachable 2 3 14055 9324 yes yes none outlyer reachable 2 4 14056 9424 yes yes none candidate reachable 2 5 14057 941a yes yes none candidate sys_peer 1 6 14058 9324 yes yes none outlyer reachable 2 7 14059 9024 yes yes none candidate reachable 2
Точного вам времени, и публикуйте, пожалуйста, свои вопросы в комментариях!
Источник: http://www.atmythoughts.com/living-in-a-tech-family-blog/2014/2/28/what-time-is-it