29 декабря 2009 в 14:38

Делаем собственный 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

[UPD2]
Встречаем нового хабраколлегу brn!
Он уже успел написать топик про NMEA.

BarsMonster, спасибо за инвайт.
Илья @unicast
карма
36,2
рейтинг 0,0
Пользователь
Похожие публикации

Комментарии (35)

  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      Можно например такой RS-232 GPS GlobalSat BR-304
      webpanel.ru/GlobalSat-BR-304-GPS-Receiver-RS-232.aspx
      GPS-мышка на базе чипсета EverMore
      во влагозащищенном корпусе с интерфейсом RS-232 и внешней антенной
    • +1
      Конкретно у меня GPS Haicom HI-303CF, а так, почти все старые Garmin подойдут.
      Думаю гугл GPS + RS232 должен помочь.
    • 0
      Я использовал Garmin GPS 18x LVC. Разница LVC от PC и USB в том, что в LVC выведен PPS.
      Плюсы: Относительно дешевый. Простота подключения (честные уровни RS-232).
      Минусы: Большой jitter (~100 мс), если использовать только NMEA без PSS. Нет возможности принудительно зафиксировать координаты — это полезно в случае плохой видимости спутников — с зафиксированными координатами приемник теоретически может отдавать точное время и при видимости только одного спутника.
  • 0
    Можно например такой RS-232 GPS GlobalSat BR-304
    webpanel.ru/GlobalSat-BR-304-GPS-Receiver-RS-232.aspx
  • 0
    Забавно: GPS-приемник, который всю жизнь работает на одном месте :)
    • +4
      И таких приемников много ) На всех WiMax/CDMA базовых станциях по одному :-)
    • 0
      Есть ещё один тип приёмников, который всегда на одном месте — приёмники, накапливающие поправки. Позволяют получать координаты с сантиметровой точностью.

      Метода такая: пишите лог несколько часов, потом скачиваете со стационарного приёмника лог за это же время и обрабатываете.
      • 0
        Давно кружится идея такая, даёшь пару приёмников и вот тебе точность приёма в несколько сантиметров!
  • 0
    Сейчас COM-порта обычно уже нет в компьютерах. Как это можно сделать с другими вариантами подключения?
    • +1
      USB<>COM адаптер
      PCI<>COM адаптор
      Bluetooth<>GPS, Bluetooth — используется в GPS как COM порт на расстоянии, но в Linux не знаю как это настраивается.
      • 0
        Настраивается вполне несложно, в убунтах может быть даже через гуй.
        Кстати сейчас полно приемников которые ловят в помещении, в нескольких метрах от окон. Это практически любой приемник на чипсете MTK или SIRF 3.
      • +1
        Все это (в особенности блютус) даст большие и, самое главное, непредсказуемые задержки во времени. В обычных прогах на десятки или даже сотни милисекунд можно было бы забить, но мы же боремся за точность.
        • +1
          Чертовски согласен.
          Разве что PCI<>COM дает нормальные задержки, там обычный аппаратный контроллер распаян.
    • 0
    • 0
      Мне кажется, что современные GPS-приёмники с USB должны иметь вменяемую поддержку в Linux.
      Я тоже свой сначала взял «на попробовать», а потом купил.
  • +2
    Кстати, коллега в Новосибирске поднял аналогичный сервер и мы по внутренней сети добавили друг-друга в конфиги NTP. Был небольшой разбег, порядка 30-60ms. Выяснить почему, не успел — уволился.
  • 0
    На сайте gpsd пишут следующее:
    Note that deriving time from messages received from the GPS is not as accurate as you might expect. Messages are often delayed in the receiver and on the link by several hundred milliseconds, and this delay is not constant.
    Что в переводе примерно означает: Учтите, что время доставки сообщения от GPS не так точно, как можно ожидать. Сообщение часто задерживается в устройстве и в канале передачи на несколько сотен миллисекунд, причем это время не постоянно. (далее говорится, что существуют методы частичной коррекции для некоторых типов устройств)
    В связи с чем у меня возник вопрос: Существует ли стандарт точности определения времени для серверов Stratum 1, или достаточно оснастить сервер устройством определения времени?
    • +1
      Добавил апдейт про это.
      • 0
        Задержка в несколько сотен миллисекунд? Вы с ума сошли?
        Если у Вас с приемником такая «потрясающая» точность то не стоит заморачиваться о построении системы. РС-232 не может вносить такой задержки.
        ИМХО в gpsd просто страхуются и говорят, что мол, AS IS.
        • +1
          Такая точность будет, если не использовать PPS. Тут дело не в RS-232, а в работе NMEA.
          Берите приёмник с PPS и всё будет супер.
          • 0
            Ну ладно, а с PPS какая будет точность?
            • +2
              Наносекунды + точность интерфейса (RS-232)
              • 0
                вот это уже подходит под решение.
              • 0
                Наносекунды +\- точность интерфейса RS-232. Т.е. если мы работаем в 115200 б\с (один из самых распространенных стандартов), то мы не можем принимать сигнал с погрешностью меньшей 1\115200 = около 0.01 милисекунды. Что в 1000 раз больше наносекунды.
                • 0
                  Э нет ) Вы упускаете самую суть PPS :-)
                  Точно в момент начала новой секунды устанавливается служебный сигнал на COM-порте, и его можно прочитать мгновенно, если сможете :-)
  • –1
    Хм… Вы уверены, что при использовании GPS получается точное время? Выше пишут, что даже bluetooth вносит определенную задержку.
    Атомные часы находятся на спутнике. Сколько времени нужно радиосигналу чтобы достигнуть земли? И даже эта цифра не будет постоянной, ведь разные спутники находятся на разном удалении от приемника.
    • +1
      Ясен хрен задержки от распространения сигнала учитываются (т.к. на их основе и лежит принцип определения координат), время точное с точностью до наносекунд.

      Про BlueTooth все согласны, тут речь идет о приемнике через железный COM-порт.
    • +2
      Не знаю, как кто, но я уверен, что с использованием GPS можно узнать точное время. Прикладным доводом этого является то, что в оборудовании Oscilloquartz и Symmetricom (стратум-0, рубидий, цезий, редко водородный мазер) есть входы для подключения антен GPS. Тоесть эта дэвайсина может работать как на внутреннем источнике, так и на внешних, а еще лучше — усредняя и то и другое.
      Для решения проблем с задержкой распространения используют 2 частоты а также сам алгоритм использует очень много эфемеридных (прогнозируемых) данных, что позволяет предугадывать задержку в реальном времени.
      • 0
        Извините, но я сомневаюсь, что стоит усреднять данные внутреннего источника (уровня перечисленных) и внешнего (gps), т.к. преимущество сомнительно и велика вероятность падения точности. Дублирование (резервное) не помешает точно. В остальном целиком согласен с вами.
    • 0
      Именно для этого существуют специализированные приёмники, например от кампании Trimble, поглядеть можно здесь www.trimble.com/timing/ (как раз они и стоят на CDMA станциях), а не те, что в виде мышей и т.п. продают. Ещё вроде эти приёмники (но может и не все) отличаются от обычных поддержкой 2х частот GPS (обычные поддерживают одну).
  • 0
    unicast, а можно адрес твоего сервера?
    хочу посмотреть ntpq -p

    • 0
      Мой сервер во внутренней сети одного государственного предприятия, именно за отсутствием интернетов возникла необходимость в собственном stratum-1.
      И я там не работаю уже.
  • 0
    а ком-порт не будет узким местом в системе?
    для передачи одного байта на скорости 115200 потребуется время порядка 0.1мс, в конечном счёте это выльется в какую-то разницу между точным временем и временем сервера. не ясно, может ли такой сервер считаться stratum-1…
    • 0
      Уже тут обсуждаем.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.