Использование chrony для синхронизации времени с GPS

Возможность использования систем спутниковой навигации в качестве источника точного времени востребована в настоящее время, во многом благодаря обилию доступных по цене приёмников. Сервер точного времени chrony, развиваемый как легковесная замена ntpd, выбран во многих дистрибутивах в качестве сервера времени по умолчанию, и, конечно, поддерживает такую возможность.

Де-факто стандартом приёмников является, пришедший с водного транспорта, протокол NMEA 0183, зачастую используемый поверх RS232. Для целей синхронизации времени как правило используется отдельная линия с TTL сигналом с частотой 1 Гц. При использовании линий RS232 для передачи TTL сигнала используется DCD (первый пин разъема DB9). На популярных в последнее время одноплатных компьютерах для приема сигнала 1 Гц используется интерфейс GPIO.

На стороне ядра Linux сигнал обрабатывается подсистемой PPS: модулем pps-ldisc в случае DCD, или модулем pps-gpio для GPIO. Пользовательские приложения получают доступ к таблице событий через символьные устройства /dev/ppsX.

Данные, передаваемые по протоколу NMEA, доступны для чтения через соответсвующее устройство: /dev/ttyY. В отличии от ntpd, chrony не содержит код для разбора протокола NMEA, поэтому полагается на gpsd, который, в свою очередь, передает chrony данные о точном времени через unix сокет.

gpsd обладает скудными возможностями конфигурации, а собственные способности автоконфигурации его зачасную подводят. При запуске gpsd необходимо использовать следующие аргументы командной строки:

  • -n начать приём данных сразу после запуска; по умолчанию, gpsd ждет клиентских подключений для начала работы;
  • -s 9600 указывается скорость обмена для приёмника;
  • /dev/ttyY устройсто с NMEA.

При использовании устройств с именами вида /dev/ttyY gpsd пытается активировать на них линейную дисциплину PPS для получения сигнала с линии DCD. Сигнала, да и самой линии, может не быть, особенно в случаях с одноплатными компьютерами, а сообщить gpsd об этом явно возможности не предусмотрено. Однако, если устройство имеет имя /dev/gpsd0, то gpsd пытается открыть уже готовое устройство /dev/pps0, которое очень удачно может обслуживаться модулем pps-gpio. В последнем случае, придётся пойти на поклон к udev и попросить его делать символическую ссылку для нужного нам tty устройства. Примерное содержимое /etc/udev/rules.d/98-gpsd.rules:

ACTION=="remove", GOTO="gpsd_end"

KERNEL=="ttyS2", SYMLINK+="gpsd0", MODE="0600", OWNER="root", GROUP="root"

LABEL="gpsd_end"

Для chrony следует указать источник точного времени в виде сокета следующим образом. Примерное содержимое /etc/chrony.d/gps.conf:

refclock SOCK /run/chrony.gpsd0.sock refid GPS

Имя сокета для подключения не может быть задано произвольно. Дело в том, что gpsd нельзя указать, куда он должен передавать информацию о времени, вместо этого он самостоятельно начинает запись в сокет с именем /run/chrony.gpsd0.sock если его обнаружит. Следует убедиться, что gpsd запускается после chronyd. Текст gpsd0 после первой точки в имени файла соответсвует имени устройства используемого gpsd для чтения NMEA.

С помощью утилиты chronyc можно проверить, что всё работает корректно.

chronyc> sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
#* GPS                           0   4   377    21   -721ns[-2140ns] +/- 1333ns
^- 2a00:ab00:203:9::1000:1       2   6   337     2  +9783us[+9783us] +/-   65ms
^- ftpshare1.corbina.net         2   6   377     2  -4050us[-4050us] +/-   39ms
^- tms04.deltatelesystems.ru     2   6   377    63    +11ms[  +11ms] +/-  104ms
^- 2a00:ab00:203:9::1000:6       2   6   177     1    +12ms[  +12ms] +/-   63ms

Возможные значения колнки "S":

  • * — используется в качестве основного источника,
  • + — используется,
  • - — не используется,
  • ? — не используется, идёт сбор информации о стабильности источника.

Комментариев нет: