Делаем собственный NTP-сервер Stratum-1

На написание этой заметки меня натолкнул хабраюзер BarsMonster со своим топиком «О точном времени».
В своей статье он призывал хабраюзеров «Давать больше Stratum-1 серверов», но не сказал как (:

Выбор источника точного времени


Я проделывал эту работу примерно три года назад, когда в сети информации по этой теме было гораздо меньше. Основным источником моих познаний была документация из пакета ntp-doc (/usr/share/doc/ntp-doc/html/refclock.html), также её можно найти в сети.

Само название Stratum-1 означает, что наш NTP-сервер непосредственно подключен к источнику точного времени.
Давайте посмотрим какие у нас есть варианты этих источников:
  1. Радиостанции точного времени
    Ничего сложного, берём подходящую частоту из справочника, паяем приёмник и преобразователь в удобный для компьютера интерфейс. ^_^
    Я забросил этот вариант, т.к. напротив моей старой работы стояло здание то ли ФАПСИ, то ли ещё какой-то службы, в общем эфир был довольно зашумлён (-:
  2. Телефон GSM или CDMA
    Как-то я им не доверяю, хотя не самый плохой вариант.
  3. Приёмник GPS или ГЛОНАСС
    Этот вариант мне показался самым реальным.

Подключаем


Приёмник ГЛОНАСС тогда было сложно достать, поэтому я пошел в магазин и купил GPS-приёмник с RS232-м интерфейсом и внешней антенной. Антенну прилепил на металлический подоконник за окном, а приёмник соответственно подключил к COM-порту одного из серверов.

Первым делом нам нужно убедиться что приёмник «видит» спутники. Мой, например, в этом случае начинает весело подмигивать светодиодом.
Более универсальный способ — посмотреть что он отдаёт в COM-порт:
cat /dev/ttyS0

Тут мы должны увидеть дамп протокола NMEA.

Настраиваем


Для работы ntpd нам нужно сделать символические ссылки:
/dev/gps0 -> /dev/ttyS0

Если вы используете udev, то полезно будет создать правило /etc/udev/rules.d/10-gps.rules следующего содержания:
KERNEL==«ttyS0», NAME="%k", SYMLINK+=«gps0», MODE=«0660», GROUP=«uucp»


Модифицируем ntp.conf:
# Local Clock — если теряем спутники, то снижаем stratum до 10
server 127.127.1.0
fudge 127.127.1.0 stratum 10

# NMEA GPS driver
server 127.127.20.0 prefer

driftfile /var/lib/ntp/ntp.drift
restrict default nomodify notrust # Отдаём время всем
restrict 127.0.0.1 # Разрешаем себе всё
disable auth
logfile /var/log/ntp/messages

В строке server 127.127.20.0 число 20 — это ответ на «главный вопрос жизни, вселенной и вообще» номер соответствующего драйвера источника точного времени.

Перезапускаем NTPD и смотрим статус. Должно быть что-то подобное:
ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
LOCAL(0) LOCAL(0) 10 l 52 64 377 0.000 0.000 0.002
*GPS_NMEA(0) .GPS. 0 l 15 64 377 0.000 -0.018 0.004


Всё, сервер можно пиарить регистрировать в списке stratum-1 серверов.

Надеюсь эта статья поможет увеличить количество хороших NTP-серверов в рунете (-;

[Важный UPD]
Мне тут человек постучался в IM, у него нет аккаунта на Хабре, просил меня прояснить ситуацию с переходниками COM-USB. Цитирую:
brn:
Так вот, так как в приёмниках часто один из служебных пинов COM разъёма заведён на 1PPS сигнал, который обозначает начало очередной секунды, в случае USB этот сигнал будет потерян
А, так сигнал NMEA без PPS даёт точность порядка 50-100 миллисекунд, а для сервера точного времени это неприемлимо

Это как раз проясняет почему у меня был такой разбег с коллегой из Новосибирска — мой приёмник PPS не поддерживал.
Чтобы использовать PPS, нужно в конфиг ntp заменить NMEA на PPS:
# PPS driver
server 127.127.22.0 prefer
enable pps

Сейчас на сайте

Сейчас на сайте 0 пользователей и 1 гость.