- PVSM.RU - https://www.pvsm.ru -
В этой статье я расскажу, как собрать Stratum 1 NTP сервер на Raspberry PI для синхронизации времени за скромную сумму и навсегда забыть о проблемах, связанных с не совпадающим временем на всех ваших устройствах. А самое главное, он будет давать результат на два порядка точнее, чем обычный сервер.
В предыдущей статье [1], посвященной синхронизации времени по радио и СРНС (системы радионавигационной связи), я не успел рассказать про выбор приёмника GPS / ГЛОНАСС с выходом PPS. Между тем от этого зависит точность приёма сигнала, величина может составить от одной миллисекунды до нескольких микросекунд и зачастую это имеет решающее значение.
Для самого точного приема сигнала времени нужен приёмник GPS / ГЛОНАСС с выходом PPS. Дело однако в том, что на российском рынке не просто раздобыть устройство с такими характеристиками по доступной цене. Много таких моделей [2] давно уже перестали выпускать, а в заброшенных интернет магазинах с версткой 1990-х остались лишь их описания с предложением подписаться на уведомление при поступлении товара.

Полный список протестированного GPS оборудования можно найти [3] на GitLab ресурсе NTPSec. Не трудно заметить, что незначительное число представленных в списке устройств имеют отметку 3-4 звезды и опцию PPS. Таким образом, в шорт-лист попадают следующие приёмники.
4* Отличная производительность: gpsd распознает приёмник быстро и надежно, а отчеты сформировано полностью и правильно.
3* Хорошая производительность: gpsd с незначительными проблемами или задержкой распознаёт устройства, но отчеты сформировано полностью и правильно.
Если вас не пугает цена этих моделей, а также нет большого желания возиться с железками, можете не читать дальше. Приемник, подключенный к серверу по USB, или RS232 интерфейсу обеспечит гораздо большую точность определения времени, чем NTP сервер, работающий по tcp/ip. Но если путь самурая вам не чужд, тогда давайте собирать свой Raspberry PI NTP сервер с GPS синхронизацией времени.
Итак: берем следующие компоненты для нашего микро сервера.
Вообще-то, u-blox NEO-M8 оснащен UART интерфейсом, но для PPS выхода необходимо припаять pin-3 на GPS модуле к соответствующему GPIO коннектору на плате Raspberri Pi. Модуль швейцарской компании завоевал популярность у специалистов и это не случайно, характеристики говорят сами за себя.
В такой конфигурации с новейшим оборудованием примерная общая цена Raspberry PI в собранном виде составит 9330 руб. Можно сэкономить, купив Raspberry PI 3, или четверку с 2 GiB ОЗУ. Можно еще сэкономить на GPS чипе, u-blox NEO-6M с антенной стоит около 650 руб. Тогда цена NTP сервера упадет до 5500 руб.

GPS/Глонасс модуль UBLOX NEO 8M
Может возникнуть вопрос, для чего нужны все эти капиталовложения и какую точность обеспечивает тот, или иной способ синхронизации времени. Небольшая сводная табличка для справки.
| Источник сигнала времени | Погрешность |
| GPS с атомными часами | ±50 nSec |
| KPPS | ±1 μSec |
| PPS | ±5 μSec |
| Интерфейс USB 1.1 | ±1 mSec |
| Интерфейс USB 2.0 | ±100 μSec (100000 nSec) |
| NTP по сети | ~±30 mSec |
Kernel PPS [5] (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
Таких плат мало [6], и стоят они дорого. Разницу в цене вполне окупит приобретение паяльника и трудозатраты.
Существует Raspberry PI OS, а. k. a. Raspbian, можно просто пойти по ссылке [7], скачать свежую версию и установить её. Многие так и делают, но давайте вспомним, что Raspberry PI 4 поддерживает 64-битную операционную систему, в то время как Raspberry PI OS пока имеет лишь 32-битные модификации Debian Linux для архитектуры Arm.
Существует такая точка зрения, что на 64-битная ОС неоправдана на Raspberry PI 4, так как нет возможности обеспечить прирост производительности из-за особенностей архитектуры и сборки. Мне эта точка зрения представляется сомнительной, об этом уже писали [8] на Хабре — 64-битная ОС быстрее.
Существует порт Debian Linux [9] для архитектуры arm64, однако дистрибутив [10] Убунту для Raspberry PI имеет внятную страницу и инструкцию. На странице находим дополнительное подтверждение тому, что лучше выбрать 64-битную ОС.

Инвентарь для установки:
Следующий этап — запись установочного образа на 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.
(1:1151)$ arp -na | grep -i "dc:a6:32"
Ели же Pi подключен к HDMI монитору и USB клавиатуре, пропустите шаги 1-2 и переходите сразу к установке пакетов.
(1:1152)$ ssh ubuntu@<Raspberry Pi’s IP address>
user@server ~$ sudo apt-get install aptitude
user@server ~$ sudo aptitude install wpasupplicant gpsd chrony
Raspberry Pi 4 имеет 6 UART-ов
| Название | Тип | Устройство | Назначение |
| UART0 | PLO11 | /dev/ttyAMA0 | вторичный (Bluetooth) |
| UART1 | mini UART | /dev/ttyS0 | основной |
| UART2 | PLO11 | ||
| UART3 | PLO11 | ||
| UART4 | PLO11 | ||
| UART4 | PLO11 |
По умолчанию UART2-5 выключены.
Как видно из названия, UART0 — полноценный серийный порт и он имеет более высокую производительность, чем обрезанный UART1, он же mini UART. Поэтому будет не лишним перевести Bluetooth на UART1 с тем, чтобы основной поток данных шел через UART0. Для этого в /etc/default/grub, или /boot/config.txt ставим enable_uart=1.
DEVICES="/dev/ttyAMA0 /dev/pps0"
GPSD_OPTIONS="-n"
USBAUTO="false"
user@server ~$ sudo /etc/init.d/gpsd start
user@server ~$ sudo /etc/init.d/gpsd restart
user@server ~$ cat /dev/ttyAMA0
user@server ~$ cgps -s
user@server ~$ ppstest /dev/pps0
Все строки, содержащие сетевые публичные 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 источник.
user@server ~$ sudo /etc/init.d/ntpd restart
Автор: oldadmin
Источник [18]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/diy/354755
Ссылки в тексте:
[1] предыдущей статье: https://habr.com/en/company/ruvds/blog/507860/
[2] моделей: https://www.sparkfun.com/datasheets/GPS/Lassen%20iQ_Reference%20Manual.pdf
[3] найти: https://gpsd.gitlab.io/gpsd/hardware.html
[4] такой: https://bit.ly/2ZfTfPj
[5] Kernel PPS: https://gpsd.gitlab.io/gpsd/gpsd-time-service-howto.html#RFC-2783
[6] мало: https://bit.ly/2VsDMdy
[7] по ссылке: https://www.raspberrypi.org/downloads/raspberry-pi-os/
[8] писали: https://habr.com/en/post/488120/
[9] порт Debian Linux: https://www.debian.org/ports/arm/
[10] дистрибутив: https://ubuntu.com/download/raspberry-pi
[11] Настройте: https://habr.com/en/post/315960/
[12] GPSD Time Service HOWTO: https://gpsd.gitlab.io/gpsd/gpsd-time-service-howto.html
[13] The Raspberry Pi as a Stratum-1 NTP Server: https://www.satsignal.eu/ntp/Raspberry-Pi-NTP.html
[14] How to Setup a GPS PPS NTP Time server on Raspberry Pi: https://www.slsmk.com/how-to-setup-a-gps-pps-ntp-time-server-on-raspberry-pi/
[15] Основы GPS навигации на Raspberry Pi: https://raspberrypi.ru/515-osnovy-gps-navigatsii-na-raspberry-pi
[16] UART configuration: https://www.raspberrypi.org/documentation/configuration/uart.md
[17] Image: http://ruvds.com/ru-rub?utm_source=habr&utm_medium=article&utm_campaign=mika&utm_content=raspberrypistratum#order
[18] Источник: https://habr.com/ru/post/509890/?utm_source=habrahabr&utm_medium=rss&utm_campaign=509890
Нажмите здесь для печати.