Показаны сообщения с ярлыком gps. Показать все сообщения
Показаны сообщения с ярлыком gps. Показать все сообщения

Использование 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":

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

GPS как источник точного времени в NTP

Драйвер приемника, передающего данные по стандарту NMEA, живет по адресу 127.127.20.x (в этом случае читать его ntpd будет из /dev/gpsx). Нужно позаботиться о наличии символической ссылки на соответствующее устройство: /dev/ttySx (для работы через последовательный порт), /dev/ttyUSBx (для подключения через USB), или /dev/rfcommx (для работы через rfcomm).

Далее надо сделать доступным для ntpd это устройство: проследить, что оно создается в chroot, если ntpd запускается там, установлены ли правильные права доступа, нет ли ограничений на доступ для процесса ntpd в профилях AppArmor или SELinux.

После этого, нужно добавить в конфигурационный файл server 127.127.20.0. Это некоторая форма записи желания работать с драйвером Generic NMEA GPS. Полный список доступных драйверов находится здесь. Они все настраиваются аналогичным образом.

При удачном старте ntpd сообщит в логах примерно следующее:
22 Jun 14:13:15 ntpd[2165]: GPS_NMEA(0) serial /dev/gps0 open at 4800 bps

При этом ntp -np сообщит что-то вроде этого:
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*127.127.20.0    .GPS.            0 l   11   64   77    0.000  -99.226  59.612
 127.127.1.0     .LOCL.          10 l    -   64    0    0.000    0.000   0.000