Chrony and GPSD

From Alpine Linux
Revision as of 20:52, 6 February 2020 by Nangel (talk | contribs) (update conf.d/gpsd to match new gentoo init script)
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Sources such as:

Describe how to wire a Garmin gps 18 lvc to a serial port to grab the PPS (pulse-per-second) signal to create a Stratum 1 timesource. Other sources show using ntpd, and the gpsd man page provides config snippets.


Alpine Linux gpsd package 3.9-r1 and higher has the necessary pps code to interface with chrony. This page lists all of the files for a complete, working example:


  • /etc/modules needs to list the pps_ldisc module - you'll need to manually load it if not doing a reboot

Contents of /etc/modules

pps_ldisc
  • If the GPS 18 LVC is on /dev/ttyS1, then:

Contents of /etc/conf.d/gpsd

# Copyright 1999-2010 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # Config file for gpsd server # Optional arguments # Options include: # -b = bluetooth-safe: open data sources read-only # -n = don't wait for client connects to poll GPS # -N = don't go into background # -F sockfile = specify control socket location # -G = make gpsd listen on INADDR_ANY # -D integer (default 0) = set debug level # -S integer (default 2947) = set port for daemon GPSD_OPTIONS="-n -b" DEVICES="/dev/ttyS1" GPSD_SOCKET="/var/run/gpsd.sock" BAUDRATE="4800" # Serial setup # # For serial interfaces, options such as low_latency are recommended # Also, http://catb.org/gpsd/upstream-bugs.html#tiocmwait recommends # setting the baudrate with stty # Uncomment the following lines if using a serial device: # /bin/stty -F ${DEVICE} ${BAUDRATE} /bin/setserial ${DEVICE} low_latency


Note: As of v3.11, the init.d and conf.d files have been merged from gentoo.

The purpose is to allow gpsd to start without editing /etc/conf.d/gpsd. Note that while gpsd will now start without editing the conf.d file, it will do so with no gps devices attached.

Also note that if you are using a serial device it is still recommended to add the stty and setserial commands as noted in the example configuration above.


  • This shows all three methods of getting time from gpsd:

Contents of /etc/chrony/chrony.conf

server 0.pool.ntp.org server 1.pool.ntp.org server 2.pool.ntp.org initstepslew 30 0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org # SHM0 from gpsd is the NEMA data at 4800bps, so is not very accurate refclock SHM 0 delay 0.5 refid NEMA # SHM1 from gpsd (if present) is from the kernel PPS_LDISC # module. It includes PPS and will be accurate to a few ns refclock SHM 1 offset 0.0 delay 0.1 refid PPS # SOCK protocol also includes PPS data and # it also provides time within a few ns refclock SOCK /var/run/chrony.ttyS1.sock delay 0.0 refid SOCK # If you see something in ns... its good. # 1 second = # 1000 ms = # 1000000 us = # 1000000000 ns logchange 0.5 local stratum 10 logdir /var/log/chrony keyfile /etc/chrony/chrony.keys commandkey 10 dumpdir /var/log/chrony driftfile /var/log/chrony/chrony.drift allow all

Chronyc

If everything is working correctly, a chronyc 'sources' command should look like this:

chronyc> sources
210 Number of sources = 6
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
#x NEMA                          0   4   377    14   +684ms[ +684ms] +/-  252ms
#+ PPS                           0   4   377    13  +2040ns[+2060ns] +/-   50ms
#* SOCK                          0   4   377     7   +225ns[ +245ns] +/- 2217ns
^? tick.tock.com                 2  10   377   318  -5144us[-5144us] +/-   72ms
^? time.keeper.net               3  10   377   720  -4571us[-4567us] +/-  139ms
^? dead.time.server.org          0  10     0   10y     +0ns[   +0ns] +/-    0ns
  • NEMA (SHM0) is "x" - its really unstable
  • PPS (SHM1) is good, but the delay of 0.1 makes it the not-preferred master
  • SOCK is the preferred master
  • The other NTP servers are only used if the local server goes down.

Notes

  • In /etc/chrony/chrony.conf, there are three possible time sources:
    • SHM 0 (NEMA serial data)
    • SHM 1 (NEMA with PPS)
    • SOCK (PPS 'proprietary' gpsd/chrony interface)
  • You only need 1 of them, although all 3 are shown above
  • In the example above, SHM1 is specified with a delay of 0.1 to prevent it from competing with the SOCK protocol
    • If you prefer to use the SHM1 source instead of SOCK, then either:
      • comment out the SOCK protocol line
      • or reverse the delay values.
  • Note that the SHM0 source (NEMA only, no PPS) is set to a higher delay - don't use it if you have PPS available.
    • An example of where you would want to use SHM0 is a USB based gps receiver - they don't have the PPS line
  • Chrony creates the SOCK interface; chrony should be started before gpsd. If you restart chronyd for some reason, make sure you restart gpsd after.
  • The SHM0 interface can be used with USB based gps devices. In this case, use /dev/ttyUSBX in the /etc/conf.d/gpsd file, and leave the stty and setserial lines commented out.