NTP GPS: различия между версиями

Материал из Wiren Board
 
(не показано 5 промежуточных версий 1 участника)
Строка 1: Строка 1:
'''Статья носит рекомендательный характер и не предназначена для конечных пользователей.'''
{{DISPLAYTITLE: Синхронизация времени от GPS модуля}}
Модуль GPS можно использовать в качестве источника точного времени.  


Рабочий вариант от freemanon https://support.wirenboard.com/t/nastrojka-modulya-gps/5353/9
Работает это так: локальный демон '''gpsd''' получает время с GPS-устройства и отдаёт его демону '''ntpd''', который дальше работает с временем стандартным способом.


Варианты с NMEA Reference Clock Driver (с драйвером 20 - 127.127.20.0) так и не заработали, работающее решение нашлось здесь https://blog.rapid7.com/2015/07/27/adding-a-gps-time-source-to-ntpd/. Используется SHM Reference Clock (с драйвером 28 - 127.127.28.0)
Настройка синхронизации времени контроллера с GPS:
#Установите необходимые пакеты
#:<syntaxhighlight lang="bash">
apt install ntp gpsd gpsd-clients
</syntaxhighlight>
#В конфигурационном файле gspd укажите порт к которому подключено устройство. А также установите параметр <code>GPSD_OPTIONS="-n"</code>, это нужно чтобы синхронизация со спутниками начинала выполняться сразу после запуска.
#:<syntaxhighlight lang="bash">
nano /etc/default/gpsd
</syntaxhighlight>
#:<syntaxhighlight lang="bash">
DEVICES="/dev/ttyMOD4"
GPSD_OPTIONS="-n"
</syntaxhighlight>
#Настройте ntpd. Для этого откройте конфигурационный файл:
#:<syntaxhighlight lang="bash">
nano /etc/ntp.conf
</syntaxhighlight>
#:И дополните его следующим образом:
#:<syntaxhighlight lang="bash">
driftfile /var/lib/ntp/ntp.drift
restrict default nomodify notrust
disable auth


У меня получилось следующее:
# local
server 127.127.1.0
fudge 127.127.1.0 stratum 10


1. ставим пакеты
# GPS
server 127.127.28.0 minpoll 4 maxpoll 4
fudge 127.127.28.0 flag1 1 time1 0.35 refid GPS stratum 2
tinker panic 0 stepout 1
# PPS
server 127.127.28.2 minpoll 4 maxpoll 4 prefer
fudge 127.127.28.2 refid PPS stratum 1


apt install ntp gpsd gpsd-clients
# Local users may interrogate the ntp server more closely.
 
restrict 127.0.0.1
2. настраиваем gpsd
restrict 127.127.1.0
 
restrict 127.127.20.0
/etc/default/gpsd:
restrict 127.127.22.0
 
restrict 127.127.22.2
DEVICES="/dev/ttyMOD3"
restrict 127.127.28.0
GPSD_OPTIONS="-n"
restrict 127.127.28.1
 
restrict 127.127.28.2
3. настраиваем ntpd
</syntaxhighlight>
на всякий случай оставил локальный сервер со stratum 10
#Установите запуск '''gpsd''' после '''wb-hwconf-manager.service'''. Это нужно, чтобы '''gpsd''' запускался после перезагрузки контроллера автоматически.
 
#:Откройте  файл <code>/lib/systemd/system/gpsd.service</code> в текстовом редакторе:
/etc/ntp.conf:
#:<syntaxhighlight lang="bash">
 
nano  /lib/systemd/system/gpsd.service
# local
</syntaxhighlight>
server 127.127.1.0
#:И приведите его к следующему виду:
fudge 127.127.1.0 stratum 10
#:<syntaxhighlight lang="bash">
# GPS
server 127.127.28.0 minpoll 4 maxpoll 4 prefer
fudge 127.127.28.0 time1 0.0 refid GPS
 
driftfile /var/lib/ntp/ntp.drift
restrict default nomodify notrust
disable auth
 
4. проверяем работу
 
root@wirenboard-AP2OY26Z:~# ntpq -p
      remote          refid      st t when poll reach  delay  offset  jitter
==============================================================================
  LOCAL(0)        .LOCL.         10 l  388  64  100    0.000    0.000  0.002
*SHM(0)          .GPS.           0 l    7  16  377    0.000    9.404  20.126
 
 
'''Исправление запуска gpsd'''
После перезагрузки gpsd автоматически не стартует и соответственно ntp не синхронизируется от спутника. Но если запустить клиента gpsd, например, выполнить команду cgps, то после этого служба gpsd начинает стартовать и время синхронизируется от спутника.
Оказывается это известный баг:
 
https://gpsd.gitlab.io/gpsd/troubleshooting.html
 
Командой <syntaxhighlight lang="bash"> /etc/init.d/gpsd status </syntaxhighlight> можно увидеть текущий статус. Должен быть active (running) и не должно быть ошибок при загрузке.
Для корректной работы нужно настроить systemd на запуск gpsd при загрузке:
 
Корректируем /lib/systemd/system/gpsd.service. По умолчанию gpsd стартует после службы chronyd.service, меняем на запуск после wb-hwconf-manager.service, чтобы gpsd стартовала после инициализации GPS-модуля.
<syntaxhighlight lang="bash">
[Unit]
[Unit]
Description=GPS (Global Positioning System) Daemon
Description=GPS (Global Positioning System) Daemon
Строка 69: Строка 70:
Also=gpsd.socket
Also=gpsd.socket
</syntaxhighlight>
</syntaxhighlight>
 
#:
Создаем ссылку для systemd
#:Создайте ссылку для systemd:
<syntaxhighlight lang="bash">
#:<syntaxhighlight lang="bash">
ln -s /lib/systemd/system/gpsd.service /etc/systemd/system/multi-user.target.wants/
ln -s /lib/systemd/system/gpsd.service /etc/systemd/system/multi-user.target.wants/
</syntaxhighlight>
</syntaxhighlight>
Перезапускаем systemctl
#:Перезапустите systemctl:
<syntaxhighlight lang="bash">
#:<syntaxhighlight lang="bash">
systemctl daemon-reload
systemctl daemon-reload
</syntaxhighlight>
#:Затем перезапустите gpsd:
#:<syntaxhighlight lang="bash">
systemctl restart gpsd
</syntaxhighlight>
#После этого можно проверить работу NTP сервера командой
#:<syntaxhighlight lang="bash">
ntpq -p
</syntaxhighlight>
#:В результате должен получиться такой вывод:
#:<syntaxhighlight lang="bash">
    remote          refid      st t when poll reach  delay  offset  jitter
==============================================================================
LOCAL(0)        .LOCL.          10 l  388  64  100    0.000    0.000  0.002
*SHM(0)          .GPS.            0 l    7  16  377    0.000    9.404  20.126
</syntaxhighlight>
</syntaxhighlight>


Возможно в /etc/default/gpsd нужно поставить USBAUTO=“false”, я сейчас ставлю, но не уверен влияет ли это на что-то или нет.
Посмотреть ошибки и статус GPS-модуля можно командой
<syntaxhighlight lang="bash">
ntpq -c clockvar
</syntaxhighlight>


Узнать статус демонов gpsd и ntp
<syntaxhighlight lang="bash">
systemctl status gpsd
systemctl status ntp
</syntaxhighlight>


 
==Полезные ссылки==
 
*[https://support.wirenboard.com/t/nastrojka-modulya-gps/5353 Обсуждение настройки GPS-модуля на портале тех. поддержки]
'''Устаревшее'''
*[https://www.rapid7.com/blog/post/2015/07/27/adding-a-gps-time-source-to-ntpd/ Статья про настройку gpsd (англ.)]
Инструкция от пользователя.
*[https://www.lammertbies.nl/comm/info/gps-time Полезная статья про синхронизацию времени по GPS (англ.)]
Что сделать для сборки правильного нтп:
*[http://www.ntp.org/ Официальный сайт протокола NTP]
 
Поставить libcap-dev – без него не будет работать нтп с настройками, которые по умолчанию в системе и после ребута все сломается и придется через дебаг консоль убирать из загрузки нтп.
Через apt-get не получилось – ставил через dpkg брал тут: https://packages.debian.org/wheezy/armel/libcap-dev/download
Качаем отсюда нпт http://www.ntp.org/downloads.html (Production 4.2.8p6)
tar zxvf ntp-4.2.8p6.tar.gz
cd ntp-4.2.8p6
./configure —enable-linuxcaps # для этого и нужен libcap-dev
make
make install
service ntp stop
cp /usr/local/bin/ntp* /usr/bin/ && sudo cp /usr/local/sbin/ntp* /usr/sbin/  #заменяем системный нтп новым улучшенным
 
Далее настраиваем нтп – надо создать алиалсы для драйвера 20 (https://www.eecis.udel.edu/~mills/ntp/html/drivers/driver20.html)
 
vi /etc/udev/rules.d/10-gps.rules
 
KERNEL=="ttyAPP2",NAME="%k",SYMLINK+="gps0",MODE="0660",GROUP="ntp"
 
KERNEL==“pps0",NAME="%k",SYMLINK+="gpspps0",MODE="0660",GROUP="ntp"
 
Можно еще использовать драйвер 22 – нтп + драйвер 20 (нмеа) или 28 (гпсд)
Но 20 и так умеет ппс (flag1 1) и экспериментально я остановился на нем. (https://www.eecis.udel.edu/~mills/ntp/html/refclock.html)
 
Правим /etc/ntp.conf:
 
server 127.127.20.0 mode 17 minpoll 4 maxpoll 4 iburst prefer
fudge 127.127.20.0 flag1 1 flag2 0 time2 1.0 refid GPSP
 
time2 1.0 - это смещение времени гпс от ппс тк гпс и ппс асинхронны и если нет смещения то нтп отбранкует драйвер 20 – подбирается экспериментально по методике ниже (но думаю что для всех виренбордов 5 будет 1.0 (для пи2 у меня получилось 0.7)) https://support.ntp.org/bin/view/Support/ConfiguringNMEARefclocks
 
if you want a good estimation for fudge time2 (perhaps because PPS is not an option for you) you could use the following procedure:
 
Switch off the PPS processing for the NMEA driver and mark the clock as noselect. Set the fudge time2 to zero. Add a few good public time servers or another clock; here in Germany I can use my DCF77 radio clock for that purpose. Disable all output sentences of the GPS18x LVC but the GPRMC sentence.
Restart the daemon and watch the offset for the NMEA clock. When the value gets stable, use the absolute value of the offset as fudge time2 for the NMEA driver.
Optionally restart ntpd and verify that the offset remains small. Note the jitter, which is probably in the order of 5-10msec. If the offset is small enough (better than 2ms is doable, but takes a long time to stabilise), go to the next step. Otherwise fine-tune fudge time2 and repeat this step.
Enable PPS processing again if you can. After restarting ntpd jitter and offset should decrease rather fast.
 
Finally, remove the noselect statement and enjoy your fast-locking NMEA clock with a Garmin GPS18x LVC!
 
Перезагружаемся и смотрим что есть наши алиасы
 
root@wirenboard:~# ls /dev/gps*  
/dev/gps0  /dev/gpspps0
 
Далее ждем минут 10 и ntpq -nc peer -c as -c rl
Буква о у 127.127.20.0 – значит что последняя синхронизации с ппс (http://citrin.ru/net:ntpq)
 
root@wirenboard:~#  ntpq -nc peer -c as -c rl
 
remote          refid      st t when poll reach  delay  offset  jitter
==============================================================================
o127.127.20.0    .GPSP.          0 l    8  16  377    0.000    0.000  0.008
*185.22.60.71    212.20.50.208    2 u  21  64  377    3.510  -0.048  0.132
+95.104.192.10  194.190.168.1    2 u  55  64  377  18.911  -1.880  0.093
-144.76.115.197  131.188.3.221    2 u    4  64  377  51.630  -6.302  0.509
+89.111.54.85    194.29.130.252  2 u  46  64  377  25.978    0.225  0.088
ind assid status  conf reach auth condition  last_event cnt
===========================================================
1 30454  974a  yes  yes  none  pps.peer    sys_peer  4
2 30455  963a  yes  yes  none  sys.peer    sys_peer  3
3 30456  9424  yes  yes  none candidate  reachable  2
4 30457  933d  yes  yes  none  outlier              3
5 30458  943a  yes  yes  none candidate    sys_peer  3
 
associd=0 status=0415 leap_none, sync_uhf_radio, 1 event, clock_sync,
version="ntpd 4.2.8p6@1.3265 Wed Apr  6 16:13:39 UTC 2016 (2)",
processor="armv5tejl", system="Linux/4.1.15-imxv5-x0.1", leap=00,
stratum=1, precision=-17, rootdelay=0.000, rootdisp=1.120, refid=GPSP,
reftime=dab9e00e.9c7d01b8  Thu, Apr 14 2016  9:23:26.611,
clock=dab9e016.a2b1d422  Thu, Apr 14 2016  9:23:34.635, peer=30454, tc=4,
mintc=3, offset=0.000121, frequency=91.858, sys_jitter=0.007629,
clk_jitter=0.008, clk_wander=0.000
 
Это чтобы посмотреть ошибки и что выдает гпс
 
root@wirenboard:~# ntpq -c clockvar
associd=0 status=0011 1 event, clk_no_reply,
device="NMEA GPS Clock",
timecode="$GNRMC,092359.000,A,5549.0526,N,03735.1798,E,0.00,172.16,140416,,,A*78",
poll=3426, noreply=1, badformat=0, baddata=0, fudgetime2=1000.000,
stratum=0, refid=GPSP, flags=1
 
Дальше настраиваем нтп как нам надо – кому что можно откуда и так далее.

Текущая версия на 13:34, 12 мая 2023

Модуль GPS можно использовать в качестве источника точного времени.

Работает это так: локальный демон gpsd получает время с GPS-устройства и отдаёт его демону ntpd, который дальше работает с временем стандартным способом.

Настройка синхронизации времени контроллера с GPS:

  1. Установите необходимые пакеты
    apt install ntp gpsd gpsd-clients
    
  2. В конфигурационном файле gspd укажите порт к которому подключено устройство. А также установите параметр GPSD_OPTIONS="-n", это нужно чтобы синхронизация со спутниками начинала выполняться сразу после запуска.
    nano /etc/default/gpsd
    
    DEVICES="/dev/ttyMOD4"
    GPSD_OPTIONS="-n"
    
  3. Настройте ntpd. Для этого откройте конфигурационный файл:
    nano /etc/ntp.conf
    
    И дополните его следующим образом:
    driftfile /var/lib/ntp/ntp.drift
    restrict default nomodify notrust
    disable auth
    
    # local
    server 127.127.1.0
    fudge 127.127.1.0 stratum 10
    
    # GPS
    server 127.127.28.0 minpoll 4 maxpoll 4
    fudge 127.127.28.0 flag1 1 time1 0.35 refid GPS stratum 2
    tinker panic 0 stepout 1
    # PPS
    server 127.127.28.2 minpoll 4 maxpoll 4 prefer
    fudge 127.127.28.2 refid PPS stratum 1
    
    # Local users may interrogate the ntp server more closely.
    restrict 127.0.0.1
    restrict 127.127.1.0
    restrict 127.127.20.0
    restrict 127.127.22.0
    restrict 127.127.22.2
    restrict 127.127.28.0
    restrict 127.127.28.1
    restrict 127.127.28.2
    
  4. Установите запуск gpsd после wb-hwconf-manager.service. Это нужно, чтобы gpsd запускался после перезагрузки контроллера автоматически.
    Откройте файл /lib/systemd/system/gpsd.service в текстовом редакторе:
    nano  /lib/systemd/system/gpsd.service
    
    И приведите его к следующему виду:
    [Unit]
    Description=GPS (Global Positioning System) Daemon
    Requires=gpsd.socket
    # Needed with chrony SOCK refclock
    # After=chronyd.service
    After=wb-hwconf-manager.service
    
    [Service]
    EnvironmentFile=-/etc/default/gpsd
    ExecStart=/usr/sbin/gpsd -N $GPSD_OPTIONS $DEVICES
    
    [Install]
    Also=gpsd.socket
    
    Создайте ссылку для systemd:
    ln -s /lib/systemd/system/gpsd.service /etc/systemd/system/multi-user.target.wants/
    
    Перезапустите systemctl:
    systemctl daemon-reload
    
    Затем перезапустите gpsd:
    systemctl restart gpsd
    
  5. После этого можно проверить работу NTP сервера командой
    ntpq -p
    
    В результате должен получиться такой вывод:
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
     LOCAL(0)        .LOCL.          10 l  388   64  100    0.000    0.000   0.002
    *SHM(0)          .GPS.            0 l    7   16  377    0.000    9.404  20.126
    

Посмотреть ошибки и статус GPS-модуля можно командой

ntpq -c clockvar

Узнать статус демонов gpsd и ntp

systemctl status gpsd
systemctl status ntp

Полезные ссылки