it-консалтинг и аутсорсинг
что мы делаем контакты блог

Который час? 24.11.2015 Максим Рязанов

20091229_1225028

(Статья основана на материале Scott с сайта www.atmythoughts.com; иллюстрация с сайта blog.nobon.boo.jp)

Почему это важно?

Уверен, не нужно объяснять насколько важно в современных устройствах поддерживать точное системное время. Это требуется для адекватной информации в логах, работе действий выполняющихся по расписанию и, конечно же, для корректной работы каталогов, будь то 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
  • exodus

    А что делать с 10.11? Там есть такая проблема?

  • mockingrbird .

    Нет, наши исследования показали что NTP в них работает исправно. Правда периодически сервера на непродолжительные промежутки времени помечаются как rejected, но на синхронизацию и актуальность системного времени в Yosemite, и El Capitan это не влияет.