company_banner

Сверхточный 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


    Итак: берем следующие компоненты для нашего микро сервера.

    1. Плата Raspberry Pi 4 Model B, 4 GiB ОЗУ (6200 руб.);
    2. Корпус, например такой (890 руб.);
    3. Micro SD карта на 32 GiB, можно и 16 GiB; (540 руб.)
    4. GPS модуль на чипе u-blox NEO-M8 (1700 руб. с антенной);
    5. GPS антенна на 15 dB;
    6. Паяльник.

    Вообще-то, 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

    Может возникнуть вопрос, для чего нужны все эти капиталовложения и какую точность обеспечивает тот, или иной способ синхронизации времени. Небольшая сводная табличка для справки.
    Источник сигнала времени Погрешность
    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 (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 сервера


    1. Если Raspberry PI включен в консольном режиме (headless), то для начала необходимо определить IP адрес устройства. С рабочей станции наберите следующую команду.

      (1:1151)$ arp -na | grep -i "dc:a6:32"

      Ели же Pi подключен к HDMI монитору и USB клавиатуре, пропустите шаги 1-2 и переходите сразу к установке пакетов.
    2. Подключитесь по ssh

      (1:1152)$ ssh ubuntu@<Raspberry Pi’s IP address>
    3. Установите необходимые пакеты.

      user@server ~$ sudo apt-get install aptitude
      user@server ~$ sudo aptitude install wpasupplicant gpsd chrony
    4. Настройте Wi-Fi соединение с помощью wpasupplicant.
    5. В 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-ов
      Название Тип Устройство Назначение
      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.
    6. В файле /etc/defaults/gpsd следует выставить.

      DEVICES="/dev/ttyAMA0 /dev/pps0"
      GPSD_OPTIONS="-n"
      USBAUTO="false"
    7. Запустите, или перезапустите gpsd.

      user@server ~$ sudo /etc/init.d/gpsd start
      user@server ~$ sudo /etc/init.d/gpsd restart
    8. Проверка работы модуля GPS.

      user@server ~$ cat /dev/ttyAMA0
      user@server ~$ cgps -s
      user@server ~$ ppstest /dev/pps0
    9. Отредактируем файл /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 источник.
    10. Перезапустите ntpd

      user@server ~$ sudo /etc/init.d/ntpd restart

    Использованные материалы



    RUVDS.com
    VDS/VPS-хостинг. Скидка 10% по коду HABR

    Комментарии 14

      +2
      «но для PPS выхода необходимо припаять pin-3 на GPS модуле к соответствующему GPIO коннектору на плате Raspberri Pi.»
      Не нашел информации в статье, к какому именно пину Raspberry PI нужно подключать PPS.
      По упомянутой ссылке намного больше информации об этом: www.satsignal.eu/ntp/Raspberry-Pi-NTP.html
        0
        По сути к любому, у меня это допустим 18 выход, в конфигурации вы потом объявляете ему что есть PPS на таком-то gpio
        +1
        : Из пушки по воробьям пшеном…
        Джеттер «NTP по сети ~±30 mSec» напрочь убивает точность и достаточно последовательного интерфейса, а «Плата Raspberry Pi 4 Model B, 4 GiB ОЗУ (6200 руб.);» только денег побольше позволит заморозить.
        Если где-то в оборудовании нужны точные часы то они делаются не по NTP.
        PPS «Accuracy of time pulse signal 99% 60 ns» а не «PPS ±5 μSec»

        Если подключать GPS модуль к плате проводами/пинами то делать их как можно короче — PPS очень сильно звенит на 30 см пинах.

        Из реальных применений PPS выхода — люди делают высокоточные генераторы и я делал приблуду для подстройки DS3231.
          +1
          В локальной сети предпочтительнее PTP.
          www.raspberrypi.org/forums/viewtopic.php?f=63&t=192646
          Впрочем лучше использовать специально предназначенные для этого сетевые карты. С поддержкой timestamp в железе
            0
            А ОпенВрт не подойдёт типа на hlk -7688?
            там цена вопроса рублей 600.
            или вообще на каком-нибудь МК, хотя там по цене не сильно дешевле, наверное будет.
              +3
              Подойдет, конечно. На всем известном китайском сайте ширпотреба покупается красненькая плата NEO6MV2 за 3 доллара.
              Обязательно нужно проверить, что на плате есть сигналы RX, TX и 1PPS. Дальше цепляется к любому одноплатнику/роутеру на linux. По UART принимаются NMEA сообщения, а для работы 1PPS нужен свободный GPIO, этот пин прописывается в devicetree как источник сигнала 1PPS, после загрузки появится /dev/pps0. На них натравливаем ntpd/gpsd/chrony и получаем свой stratum 1 сервер.
              +3
              В названии есть «Сверхточный», а доказательств в виде тестов точности в статье нет, нехорошо.
                0

                "СРНС (системы радионавигационной связи)"
                Скорее — "спутниковые радионавигационные системы".


                За обсуждение "точности по сети" — IEEE1588, оно?

                  0
                  А зачем вам такая точность?
                    0
                    Мы, например, позиционирование трилатерацией делали.
                      0
                      По NTP и на линухе?!
                        0
                        Зачем? С PPS.
                    0

                    Альтернатива: https://habr.com/ru/post/255179/

                      0
                      Думаю, такое устройство пригодится в сетях, полностью изолированных от интернета, но нуждающихся в точном времени.

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое