Сверхточный Raspberry PI Stratum 1 NTP сервер
В этой статье я расскажу, как собрать Stratum 1 NTP сервер на Raspberry PI для синхронизации времени за скромную сумму и навсегда забыть о проблемах, связанных с не совпадающим временем на всех ваших устройствах. А самое главное, он будет давать результат на два порядка точнее, чем обычный сервер.
В предыдущей статье, посвященной синхронизации времени по радио и СРНС (системы радионавигационной связи), я не успел рассказать про выбор приёмника GPS / ГЛОНАСС с выходом PPS. Между тем от этого зависит точность приёма сигнала, величина может составить от одной миллисекунды до нескольких микросекунд и зачастую это имеет решающее значение.
Для самого точного приема сигнала времени нужен приёмник GPS / ГЛОНАСС с выходом PPS. Дело однако в том, что на российском рынке не просто раздобыть устройство с такими характеристиками по доступной цене. Много таких моделей давно уже перестали выпускать, а в заброшенных интернет магазинах с версткой 1990-х остались лишь их описания с предложением подписаться на уведомление при поступлении товара.
Полный список протестированного GPS оборудования можно найти на GitLab ресурсе NTPSec. Не трудно заметить, что незначительное число представленных в списке устройств имеют отметку 3–4 звезды и опцию PPS. Таким образом, в шорт-лист попадают следующие приёмники.
- Garmin GPS-18, не USB *** (приблизительная цена 10 тыс. р.)
- GlobalSat MR-350P ****
- Jackson Labs FireFly-II ***
- Magellan Thales AC12 ***
- Motorola Oncore GT+ ***
- Navisys GR601-W ****
- SkyTraq SKG16B ****
- Trimble Lassen IQ ***
- u-blox ANTARIS LEA-4T ***
- u-blox EVK 6H ****
- u-blox LEA SQ ****
4* Отличная производительность: gpsd распознает приёмник быстро и надежно, а отчеты сформировано полностью и правильно.
3* Хорошая производительность: gpsd с незначительными проблемами или задержкой распознаёт устройства, но отчеты сформировано полностью и правильно.
Если вас не пугает цена этих моделей, а также нет большого желания возиться с железками, можете не читать дальше. Приемник, подключенный к серверу по USB, или RS232 интерфейсу обеспечит гораздо большую точность определения времени, чем NTP сервер, работающий по tcp/ip. Но если путь самурая вам не чужд, тогда давайте собирать свой Raspberry PI NTP сервер с GPS синхронизацией времени.
Собираем Raspberry PI
Итак: берем следующие компоненты для нашего микро сервера.
- Плата Raspberry Pi 4 Model B, 4 GiB ОЗУ (6200 руб.);
- Корпус, например такой (890 руб.);
- Micro SD карта на 32 GiB, можно и 16 GiB; (540 руб.)
- GPS модуль на чипе u-blox NEO-M8 (1700 руб. с антенной);
- GPS антенна на 15 dB;
- Паяльник.
Вообще-то, u-blox NEO-M8 оснащен UART интерфейсом, но для PPS выхода необходимо припаять pin-3 на GPS модуле к соответствующему GPIO коннектору на плате Raspberri Pi. Модуль швейцарской компании завоевал популярность у специалистов и это не случайно, характеристики говорят сами за себя.
- Поддерживаемые СРНС: BeiDou, Galileo, GNSS; GPS/QZSS, GLONASS;
- Напряжение питания: 2.7…3.6 В;
- Интерфейсы: UART, USB, SPI, DDC, I2C;
- Поддерживаемые протоколы: NMEA 0.183 version 4.0, UBX (binary), RTCM 2.3;
- Чувствительность при обнаружении: -167 дБм;
- Чувствительность при слежении: -160 дБм;
- Время холодного старта: 26 с;
- Время горячего старта: 1.5 с;
- Потребляемая мощность: 35 мВт;
- Рабочая температура: -40…+85 °С;
- Размеры: 16×12.2×2.4 мм
В такой конфигурации с новейшим оборудованием примерная общая цена Raspberry PI в собранном виде составит 9330 руб. Можно сэкономить, купив Raspberry PI 3, или четверку с 2 GiB ОЗУ. Можно еще сэкономить на GPS чипе, u-blox NEO-6M с антенной стоит около 650 руб. Тогда цена NTP сервера упадет до 5500 руб.
GPS/Глонасс модуль UBLOX NEO 8M
Может возникнуть вопрос, для чего нужны все эти капиталовложения и какую точность обеспечивает тот, или иной способ синхронизации времени. Небольшая сводная табличка для справки.
Kernel PPS (KPPS) отличается от PPS тем, что использует функцию ядра Linux / Unix для точной временной отметки изменения состояния в строке PPS. Обычный же PPS реализован в user-space. Если ядро Linux поддерживает KPPS через API RFC 2783, gpsd воспользуется им для увеличения точности.
Во многих дистрибутивах Linux имеется пакет pps-tools, который обеспечивает поддержку KPPS и устанавливает timepps.h заголовочный файл. Обязательно установите этот пакет.
(1:1146)$ sudo emerge -av pps-tools
Local copy of remote index is up-to-date and will be used.
These are the packages that would be merged, in order:
Calculating dependencies... done!
[binary R ] net-misc/pps-tools-0.0.20120407::gentoo 0 KiB
Total: 1 package (1 reinstall, 1 binary), Size of downloads: 0 KiB
Would you like to merge these packages? [Yes/No]
Таким образом, подключив GPS приёмник с PPS выходом по USB мы получаем 300-кратное повышение точности синхронизации времени. Чтение с чипа GPS на плате в режиме KPPS даёт прирост точности еще на два порядка.
Будем откровенны — не все из нас умеют пользоваться паяльником, далеко не каждый пользуется этим инструментом регулярно. В таком случае имеет смысл поискать модуль GPS, не требующий пайки контактов.
Raspberry Pi GPS/RTC Expansion Board
Таких плат мало, и стоят они дорого. Разницу в цене вполне окупит приобретение паяльника и трудозатраты.
Установка ОС
Существует Raspberry PI OS, а. k. a. Raspbian, можно просто пойти по ссылке, скачать свежую версию и установить её. Многие так и делают, но давайте вспомним, что Raspberry PI 4 поддерживает 64-битную операционную систему, в то время как Raspberry PI OS пока имеет лишь 32-битные модификации Debian Linux для архитектуры Arm.
Существует такая точка зрения, что на 64-битная ОС неоправдана на Raspberry PI 4, так как нет возможности обеспечить прирост производительности из-за особенностей архитектуры и сборки. Мне эта точка зрения представляется сомнительной, об этом уже писали на Хабре — 64-битная ОС быстрее.
Существует порт Debian Linux для архитектуры arm64, однако дистрибутив Убунту для Raspberry PI имеет внятную страницу и инструкцию. На странице находим дополнительное подтверждение тому, что лучше выбрать 64-битную ОС.
Инвентарь для установки:
- Raspberry Pi 4;
- USB-C кабель питания для Pi 4;
- Micro SD карта с установочным образом Убунту;
- Монитор с выходом HDMI;
- Кабель MicroHDMI;
- USB клавиатура.
Следующий этап — запись установочного образа на Micro SD карту. Если у вас под рукой нет специализированной утилиты и программы под эти цели, в простейшем случае достаточно.
sudo dd if=/path/to/ubuntu-core-arm64.iso of=/dev/mmcblk0 status=progress
Точное название устройства видно в выводе dmesg при обнаружении нового устройства.
PM: Adding info for No Bus:179:0
device: 'mmcblk0': device_add
PM: Adding info for No Bus:mmcblk0
Вставив Micro SD карту, подключив HDMI-монитор, USB-клавиатуру, и кабель питания загружаетесь в Ubuntu Server на Raspberry Pi. Имя пользователя и пароль по умолчанию ubuntu.
Настройка NTP сервера
- Если Raspberry PI включен в консольном режиме (headless), то для начала необходимо определить IP адрес устройства. С рабочей станции наберите следующую команду.
(1:1151)$ arp -na | grep -i "dc:a6:32"
Ели же Pi подключен к HDMI монитору и USB клавиатуре, пропустите шаги 1–2 и переходите сразу к установке пакетов. - Подключитесь по ssh
(1:1152)$ ssh ubuntu@
- Установите необходимые пакеты.
user@server ~$ sudo apt-get install aptitude user@server ~$ sudo aptitude install wpasupplicant gpsd chrony
- Настройте Wi-Fi соединение с помощью wpasupplicant.
- В Linux UART0 интерфейс Pi представлен файлом устройства /dev/ttyAMA0. Для того чтобы освободить UART0 интерфейс для GPS приёмника нужно поменять параметры загрузки ядра Linux. Необходимо отключить console=ttyAMA0,115200, заменив на console=tty1. Для этого в файле /etc/default/grub надо поменять GRUB_CMDLINE_LINUX_DEFAULT. Если существует файл, /boot/config.txt, в нем также можно задать те же опции.
Raspberry Pi 4 имеет 6 UART-ов
По умолчанию UART2–5 выключены.Как видно из названия, UART0 — полноценный серийный порт и он имеет более высокую производительность, чем обрезанный UART1, он же mini UART. Поэтому будет не лишним перевести Bluetooth на UART1 с тем, чтобы основной поток данных шел через UART0. Для этого в /etc/default/grub, или /boot/config.txt ставим enable_uart=1.
- В файле /etc/defaults/gpsd следует выставить.
DEVICES="/dev/ttyAMA0 /dev/pps0" GPSD_OPTIONS="-n" USBAUTO="false"
- Запустите, или перезапустите gpsd.
user@server ~$ sudo /etc/init.d/gpsd start user@server ~$ sudo /etc/init.d/gpsd restart
- Проверка работы модуля GPS.
user@server ~$ cat /dev/ttyAMA0 user@server ~$ cgps -s user@server ~$ ppstest /dev/pps0
- Отредактируем файл /etc/ntp.conf.
Все строки, содержащие сетевые публичные Stratum 1, 2 NTP сервера (такие, как pool [0–9].subdomain.pool.ntp.org) следует закомментировать, чтобы использовать лишь GPS/PPS источники данных.
# GPS Serial data reference (NTP0) server 127.127.28.0 minpoll 4 fudge 127.127.28.0 flag1 1 time1 0.9999 refid GPS #flag1 - PPS on
# GPS PPS reference (NTP1) server 127.127.22.0 minpoll 4 fudge 127.127.22.0 flag3 1 refid PPS #flag3 - enable KPPS API
Верхняя запись NTP0 указывает на универсальный источник времени, доступный почти на всех устройствах GPS. Нижняя запись NTP1 определяет гораздо более точный PPS источник. - Перезапустите ntpd
user@server ~$ sudo /etc/init.d/ntpd restart