Вопрос или проблема
Я хочу, чтобы небольшой NTP сервер (Chrony) предоставлял время различным компьютерам, расположенным на одном учебном подводном аппарате, подключенном с помощью Ethernet-кабелей. Для нас в первую очередь важно, чтобы различные части аппарата синхронизировались друг с другом с отклонением менее 10 мс на протяжении нескольких дней.
Некоторые электронные устройства синхронизируются напрямую с помощью источника 1PPS, поэтому важно, чтобы NTP сервер и источник 1PPS были синхронизированы.
Синхронизация “системного времени” с реальным временем не обязательна, но было бы хорошо, если бы она была бесплатной.
В настоящее время у нас есть:
- Источника частоты 1PPS
- Встроенный компьютер с RTC, который считывается при запуске
- GPS-приемник, но на него в идеале нельзя полагаться, так как GPS не работает под водой.
В настоящее время мы подаем сигнал 1PPS и GPS-строку в USB-Serial преобразователь (FTDI), затем это считывается gpsd, который правильно берет сигнал 1PPS и GPS-строку для Chrony. Это работает и дает нам около 2 мкс синхронизации с 1PPS и GPS.
Существующая конфигурация имеет ограничения для нашего применения:
-
gpsd требует действительную GPS-временную строку для инициализации времени, это не всегда доступно, так как у нас плохой прием GPS на воде и совершенно отсутствует под водой.
-
gpsd также требует непрерывные действительные строки для обработки прерывания 1PPS. Это в основном проблема, если мы хотим отключить GPS-приемник под водой, чтобы сэкономить энергию, но при этом хотим продолжать синхронизацию с 1PPS.
-
Как только GPS теряется или GPS-устройство выключается, системное время начинает отклоняться от источника 1PPS.
Я понимаю, что “gpsd” сильно зависит от GPS, поэтому я использую неправильный инструмент.
Вопросы:
-
Возможно ли подать 1PPS напрямую в Chrony?
1.1 Может ли Chrony использовать этот 1PPS и только системное время, не получая реальный источник времени, кроме RTC?
-
Существуют ли примеры того, как добавить источник /dev/pps, используя RI или DCD пин преобразителей USB-to-Serial FTDI? Например, что делает gpsd под капотом, но без его использования.
Частично отвечая на свои собственные вопросы на основе нашего опыта и ошибок.
Вопросы: 1. Возможно ли подать 1PPS напрямую в Chrony?
Ответ: 1 Конфигурация Chrony использует 2 метода для получения PPS:
- Получить его из SHM1 (разделяемой памяти), куда его помещает gpsd
- Получить его напрямую из устройства /dev/pps
Пример конфигурационных строк:
refclock SHM 1 refid PPS precision 1e-9
refclock PPS /dev/pps1 refid PPS2 precision 1e-9
Некоторые потенциальные подводные камни, касающиеся задержек, также описываются в Часто задаваемых вопросах.
Вопросы: 1.1 Может ли Chrony использовать этот 1PPS и только системное время, не получая реальный источник времени, кроме RTC?
Ответ: 1.1 Да, если вы добавите эту строку:
local stratum 10
Тогда Chrony вернется к локальным часам, если потеряет все свои источники. Это также кажется необходимой строкой для того, чтобы сервер времени продолжал быть работоспособным, если у него есть только источник /dev/pps и нет данных от GPS.
Вопросы: 2. Существуют ли примеры того, как добавить источник /dev/pps, используя RI или DCD пин преобразителей USB-to-Serial FTDI? Например, что делает gpsd под капотом, но без его использования.
Частичный ответ (обходной путь) 2: gpsd будет принимать pps как от RI, так и от DCD и передавать временные данные в SHM1. gpsd также автоматически создает виртуальное устройство /dev/pps1 и связывает его с последовательным портом, это не тот же самый 1PPS, который используется внутри gpsd!
При использовании ppstest на /dev/pps1 вы можете видеть переходы PPS для DCD, но нет перехода для RI. Использование ppscheck на последовательном порте показывает переходы pps как для RI, так и для DCD.
Мы полагаем, что gpsd разрабатывает собственную новую схему обнаружения 1PPS, но виртуальный порт /dev/pps1 использует устаревший ldattach (линейная дисциплина), который жестко закодирован только для DCD. смотрите этот пост.
Ответ или решение
Создание изолированного NTP-сервера с использованием сигналов 1PPS и без внешних источников времени (без GPS)
Ваша задача по созданию изолированного NTP-сервера с использованием сигнала 1PPS, без зависимости от GPS, действительно осуществима. Рассмотрим основные аспекты этого проекта и как его можно реализовать с использованием Chrony.
1. Основные требования
Ваш проект включает следующие элементы:
- Использование сигнала 1PPS для синхронизации различных компонентов подводного аппарата.
- Организация NTP-сервера, который будет обеспечивать синхронизацию до 10 мс между компьютерами, связанными через Ethernet.
- Возможность работать без надежного источника времени, такого как GPS, когда аппарат находится под водой.
2. Взаимодействие Chrony и 1PPS
Chrony предлагает два метода для работы с PPS:
- Использование SHM (Shared Memory), который, как вы уже заметили, применяется gpsd для передачи данных о 1PPS.
- Непосредственное использование устройства /dev/pps.
Для вашего сценария рекомендуется использовать прямое подключение к устройству /dev/pps, что позволяет избежать зависимости от gpsd и обеспечивает надежную синхронизацию.
Пример настройки Chrony
В конфигурационном файле Chrony (/etc/chrony/chrony.conf) вы можете добавить следующие строки:
refclock PPS /dev/pps1 refid PPS precision 1e-9
local stratum 10
- refclock PPS – указывает на использование /dev/pps1 как источника PPS.
- local stratum 10 – гарантирует, что Chrony будет продолжать работу, даже если все источники времени потеряны, используя локальные часы (RTC).
3. Подключение сигнала 1PPS к Chrony
Чтобы использовать сигнал 1PPS от FTDI USB-to-Serial конвертера, вам нужно использовать один из выводов, таких как DCD или RI. Вы можете настроить систему для считывания PPS через эти линии, но необходимо убедиться, что они правильно конфигурированы в вашем ядре Linux.
Настройка устройства /dev/pps
Для создания виртуального устройства /dev/pps, вам может потребоваться использовать модуль линейной дисциплины (ppsl) в Linux. Это можно сделать командой:
sudo modprobe pps_ldisc
Далее, добавьте строку в файл /etc/modules
для автозагрузки:
pps_ldisc
Для того, чтобы перенаправить DCD или RI на /dev/pps, вы можете использовать setserial
для настройки вашего последовательного порта и перевод линии с PPS в нужный режим.
4. Примечания к реализации
- Убедитесь, что все устройства и драйверы, используемые в системах, поддерживают работу с PPS.
- Отключение устройства GPS для экономии энергии возможно, так как Chrony будет работать на основе только 1PPS и RTC.
- Механизмы проверки времени (например,
ppstest
) могут помочь вам проверить правильность работы вашего подключения 1PPS.
Заключение
Создание изолированного NTP-сервера с использованием сигнала 1PPS без GPS возможно и может стать надежным решением для синхронизации ваших подводных систем. Приложив усилия для грамотной настройки Chrony и устройства /dev/pps, вы сможете достичь высокоточной синхронизации даже в условиях, когда доступ к GPS отсутствует.
Если у вас возникнут дополнительные вопросы или потребуется помощь в процессе реализации, не стесняйтесь обращаться за поддержкой.