updates
[KenyonWiki.git] / Time_server.mdwn
1 This page documents my project to build a stratum 1 NTP [[!wikipedia time server]] at my house. Its hostname is einstein.kenyonralph.com.
2 <!-- There is a link to this page from http://wiki.northgrum.com/wiki/Network_Time_Protocol#Stratum_1_time_servers -->
3 [[!toc levels=2]]
4
5 ## GPS selection
6
7 I selected the [Garmin GPS 18x LVC](http://www.amazon.com/gp/product/B0016O3T7A) for the following reasons:
8
9 * Plenty of documentation exists by people who have used this unit as an NTP timing source.
10 * The receiver and antenna are integrated into one enclosure.
11 * Minimal assembly and soldering necessary, compared to bare-board receivers.
12 * Available on [Amazon](http://amazon.com/) for a decent price.
13
14 I ordered the 18x (and a [serial cable](http://www.amazon.com/gp/product/B000ZKNANO)) on Amazon on 2011-09-05. UPS delivered it on 2011-09-09.
15
16 ## Cable Construction
17
18 I simply spliced the GPS 18x LVC wires onto serial and USB wires. This matches what's documented in Garmin's GPS 18x LVC Technical Specifications.
19
20 ## GPS preparation
21
22 I used a Windows Vista computer with Garmin's SNSRXCFG_270.exe to upgrade the firmware from version 3.60 to the latest, 3.70. I also used SNSRXCFG_270.exe to set the PPS pulse width to 200 ms, and disable all NMEA sentences except GPGGA.
23
24 ## Debian GNU/Linux setup
25
26 Here are the steps in summary (written for Debian wheezy in February 2015):
27
28 * Install [[!debpkg pps-tools]]
29 * Create udev rules
30 * Create systemd service unit for ldattach
31
32 Some details:
33
34 When you do `sudo ldattach PPS /dev/ttyS0`, the PPS modules will be loaded automatically and the device `/dev/pps0` will be created. Place some udev rules in `/etc/udev/rules.d/77-local.rules` to create device symlinks and run ldattach automatically:
35
36     SUBSYSTEM=="pps", MODE="0664" GROUP="dialout"
37     KERNEL=="ttyS2", RUN+="/bin/stty --file=/dev/ttyS2 9600"
38     KERNEL=="ttyS2" SYMLINK+="gps0"
39     KERNEL=="pps0" SYMLINK+="gpspps0"
40
41 systemd unit to run `ldattach` (enable with `systemctl enable ldattach@ttyS2`):
42
43     [Unit]
44     Description=PPS Line Discipline for GPS Timekeeping for %i
45     Before=ntpd.service
46
47     [Service]
48     ExecStart=/usr/sbin/ldattach pps /dev/%i
49     Type=forking
50
51     [Install]
52     WantedBy=multi-user.target
53
54
55 Here is my working ntp.conf:
56
57     rlimit memlock -1
58     driftfile /var/lib/ntp/ntp.drift
59     restrict localhost
60     restrict default limited noquery
61     server darwin.kenyonralph.com iburst
62     pool 2.pool.ntp.org iburst
63     server 127.127.20.0 mode 16 minpoll 3 iburst
64     fudge 127.127.20.0 flag1 1 flag2 0 flag3 1 time2 0.545
65     leapfile /etc/ntp/leap-seconds.list
66
67 Example output after letting ntpd run for about 8 hours:
68
69     kenyon@einstein ~ % ntpq -ccv -p -crv -ckern -csysinfo
70     associd=0 status=0000 no events, clk_unspec,
71     device="NMEA GPS Clock",
72     timecode="$GPGGA,172617,1111.3839,N,11111.4417,W,2,11,0.8,126.3,M,-35.5,M,,*71",
73     poll=3418, noreply=0, badformat=0, baddata=0, fudgetime2=545.000,
74     stratum=0, refid=GPS, flags=5
75          remote           refid      st t when poll reach   delay   offset  jitter
76     ==============================================================================
77      2.us.pool.ntp.o .POOL.          16 p    -   64    0    0.000    0.000   0.000
78     oGPS_NMEA(0)     .GPS.            0 l    -    8  377    0.000    0.000   0.004
79     +darwin.kenyonra 127.67.113.92    2 u   50   64  377   28.478    4.232   0.953
80     -2001:470:c:4a1: 131.188.3.220    2 u   45   64  377  200.027   11.259   0.586
81     -2604:a880:800:1 184.105.182.7    3 u   39   64  377   82.776    4.196   1.805
82     -ntp.jtsage.com  216.218.254.202  2 u   24   64  377   69.561   -1.286   0.490
83     -2604:a880:800:1 184.105.182.7    3 u   46   64  377   82.421    3.827   0.603
84     *yurizoku.tk     209.51.161.238   2 u   59   64  377   80.916    1.554   0.619
85     +198.110.48.12 ( 204.9.54.119     2 u   35   64  377  100.437    1.796   1.330
86     -108.61.194.85 ( 201.198.247.252  2 u   53   64  377   45.230   -5.521   1.041
87     associd=0 status=041d leap_none, sync_uhf_radio, 1 event, kern,
88     version="ntpd 4.2.8p1@1.3265-o Mon Feb  9 09:59:02 UTC 2015 (1)",
89     processor="x86_64", system="Linux/3.16.7-ckt2", leap=00, stratum=1,
90     precision=-23, rootdelay=0.000, rootdisp=1.015, refid=GPS,
91     reftime=d884bdb9.bc1f69e3  Tue, Feb 10 2015  9:26:17.734,
92     clock=d884bdba.e1639551  Tue, Feb 10 2015  9:26:18.880, peer=27173, tc=3,
93     mintc=3, offset=-0.000130, frequency=-13.457, sys_jitter=0.004033,
94     clk_jitter=0.051, clk_wander=0.031, tai=35, leapsec=201507010000,
95     expire=201512280000
96     associd=0 status=041d leap_none, sync_uhf_radio, 1 event, kern,
97     pll offset:            0
98     pll frequency:         -13.4565
99     maximum error:         0.0015
100     estimated error:       3.4e-05
101     kernel status:         pll ppsfreq ppstime ppssignal nano
102     pll time constant:     3
103     precision:             1e-06
104     frequency tolerance:   500
105     pps frequency:         -13.4874
106     pps stability:         0.280609
107     pps jitter:            0.050
108     calibration interval   256
109     calibration cycles:    152
110     jitter exceeded:       45
111     stability exceeded:    2
112     calibration errors:    0
113     associd=0 status=041d leap_none, sync_uhf_radio, 1 event, kern,
114     system peer:        GPS_NMEA(0)
115     system peer mode:   client
116     leap indicator:     00
117     stratum:            1
118     log2 precision:     -23
119     root delay:         0.000
120     root dispersion:    1.015
121     reference ID:       GPS
122     reference time:     d884bdb9.bc1f69e3  Tue, Feb 10 2015  9:26:17.734
123     system jitter:      0.004033
124     clock jitter:       0.051
125     clock wander:       0.031
126     broadcast delay:    0.000
127     symm. auth. delay:  0.000
128
129 I also tried setting up a time server with FreeBSD to see if it's any easier or better.
130
131 ## FreeBSD setup
132
133 This section was written in October 2011. I no longer run this FreeBSD system. I'm running the NTP server on the Linux machine described above.
134
135 I am using [ntp-devel](http://www.freshports.org/net/ntp-devel/) from ports.
136
137 ### /etc/rc.conf
138     ntpd_enable="YES"
139     ntpd_flags="-N -p /var/run/ntpd.pid -f /var/db/ntpd.drift"
140     ntpd_program="/usr/local/sbin/ntpd"
141     ntpd_sync_on_start="YES"
142
143 ### /etc/devfs.conf
144     link cuau0 gps0
145
146 ### /etc/ttys
147 Commented out ttyu*.
148
149 ### Kernel configuration
150 Put this in `/usr/src/sys/amd64/conf/PPS-GENERIC`:
151
152     #
153     # PPS -- Generic kernel configuration file for FreeBSD/amd64 PPS
154     #
155     include GENERIC
156     ident PPS-GENERIC
157     options PPS_SYNC
158
159 ### /etc/make.conf
160     KERNCONF= PPS-GENERIC GENERIC
161
162 ### /etc/ntp.conf
163     server 127.127.20.0 minpoll 3
164     fudge 127.127.20.0 flag1 1 flag2 0 flag3 1 time2 0.600
165     server darwin.kenyonralph.com iburst
166     server voodoo.kenyonralph.com iburst
167     server grunt.kenyonralph.com iburst
168     pool 2.us.pool.ntp.org iburst
169
170 ### Example output
171 Example output after running for a few minutes and while doing buildworld and buildkernel:
172
173     kenyon@gauss ~ % ntpq -p -c clockvar -c readvar; ntpdc -c kerninfo
174          remote           refid      st t when poll reach   delay   offset  jitter
175     ==============================================================================
176     oGPS_NMEA(0)     .GPS.            0 l   38   64  377    0.000    0.648   0.249
177      2.us.pool.ntp.o .POOL.          16 p    -   64    0    0.000    0.000   0.002
178     *darwin.kenyonra 127.67.113.92    2 u   63   64  377   20.431    3.263   3.354
179     -voodoo.kenyonra 106.61.18.129    3 u   61   64  377    0.243    4.485   0.124
180     +grunt.kenyonral 106.61.18.129    3 u   64   64  377    0.182    3.521   0.225
181     -conquest.kjsl.c 69.36.224.15     2 u   62   64  377   26.374    5.768   2.522
182     -bindcat.fhsu.ed 128.138.140.44   2 u   63   64  377   75.219    4.115   1.846
183     -peachesgeldof.k 204.9.54.119     2 u   64   64  377   94.141    3.787   2.844
184     -ip-173-201-38-8 198.153.152.52   2 u   58   64  377   24.752    6.104   1.801
185     -druid.storyinme 130.207.244.240  2 u   56   64  377   65.657   -2.773   4.542
186     +cheezum.mattnor 129.7.1.66       2 u   65   64  377   45.797    2.972   2.286
187     associd=0 status=0000 no events, clk_unspec,
188     device="NMEA GPS Clock",
189     timecode="$GPGGA,085740,1111.1111,N,11111.1111,W,1,09,0.9,103.2,M,-35.3,M,,*77",
190     poll=14, noreply=0, badformat=0, baddata=0, fudgetime2=600.000,
191     stratum=0, refid=GPS, flags=5
192     associd=0 status=04ad leap_none, sync_uhf_radio, 10 events, kern,
193     version="ntpd 4.2.7p225@1.2483-o Fri Oct 21 04:59:50 UTC 2011 (1)",
194     processor="amd64", system="FreeBSD/9.0-RC1", leap=00, stratum=1,
195     precision=-19, rootdelay=0.000, rootdisp=2.380, refid=GPS,
196     reftime=d24d03df.edabdc26  Sat, Oct 22 2011  1:57:03.928,
197     clock=d24d0405.3f696dad  Sat, Oct 22 2011  1:57:41.247, peer=38673, tc=6,
198     mintc=3, offset=0.648, frequency=-4.048, sys_jitter=0.249,
199     clk_jitter=0.000, clk_wander=0.005
200     pll offset:           0.000624065 s
201     pll frequency:        -4.048 ppm
202     maximum error:        2.0824e-05 s
203     estimated error:      1.7e-08 s
204     status:               2007  pll ppsfreq ppstime nano
205     pll time constant:    6
206     precision:            1e-09 s
207     frequency tolerance:  496 ppm
208     kenyon@gauss ~ % ntpq -c "rv 38673"
209     associd=38673 status=973a conf, reach, sel_pps.peer, 3 events, sys_peer,
210     srcadr=GPS_NMEA(0), srcport=123, dstadr=127.0.0.1, dstport=123, leap=00,
211     stratum=0, precision=-20, rootdelay=0.000, rootdisp=0.000, refid=GPS,
212     reftime=d24d03de.ffd6d0b6  Sat, Oct 22 2011  1:57:02.999,
213     rec=d24d03df.edabdc26  Sat, Oct 22 2011  1:57:03.928, reach=377,
214     unreach=0, hmode=3, pmode=4, hpoll=6, ppoll=6, headway=0, flash=00 ok,
215     keyid=0, offset=0.648, delay=0.000, dispersion=0.928, jitter=0.249,
216     filtdelay=     0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00,
217     filtoffset=    0.65    0.70    0.76    0.80    0.86    0.91    0.99    1.06,
218     filtdisp=      0.00    0.96    1.92    2.88    3.84    4.80    5.76    6.72
219
220 Here is what kerninfo looks like with the PPS_SYNC kernel option:
221
222     pll offset:           0.000123674 s
223     pll frequency:        -3.918 ppm
224     maximum error:        0.000111415 s
225     estimated error:      1.51e-07 s
226     status:               2107  pll ppsfreq ppstime ppssignal nano
227     pll time constant:    6
228     precision:            1e-09 s
229     frequency tolerance:  496 ppm
230     pps frequency:        -3.918 ppm
231     pps stability:        0.033 ppm
232     pps jitter:           4.729e-06 s
233     calibration interval: 64 s
234     calibration cycles:   27
235     jitter exceeded:      5
236     stability exceeded:   0
237     calibration errors:   10
238
239 ## Conclusion
240
241 FreeBSD is much nicer than Linux (as of late 2011) at being a stratum 1 NTP server using a NMEA GPS with PPS reference clock.
242
243 As of early 2015, I would say it's about an equal amount of effort between FreeBSD and Debian Linux. Debian Linux is a little more effort if you want to create a proper Debian package of NTP, but since I've already done that, you don't have to. You may use the NTP package from my Debian repository by adding the following line to your sources.list:
244
245     deb http://kenyonralph.com/repo/ jessie/
246
247 ## Notes
248
249 * Show serial port settings:
250  * Linux: `stty --all --file=/dev/ttyS0`
251  * FreeBSD: `stty -a -f /dev/cuau0`
252 * Set serial port baud rate to 4800:
253  * Linux: `stty --file=/dev/ttyS0 4800`
254  * FreeBSD (but not really necessary since `cu` can do it, and doesn't seem to take effect anyway): `stty -f /dev/cuau0 4800`
255 * Observe NMEA output:
256  * Linux: `cat /dev/ttyS0`
257  * FreeBSD: `cu -l /dev/cuau0 -s 4800`
258
259 ## References
260
261 * NTP documentation: [Reference Clock Support](http://www.eecis.udel.edu/~mills/ntp/html/refclock.html)
262 * NTP support wiki: [Configuring Garmin Refclocks](https://support.ntp.org/bin/view/Support/ConfiguringGarminRefclocks)
263 * NTP support wiki: [Configuring NMEA Refclocks](https://support.ntp.org/bin/view/Support/ConfiguringNMEARefclocks)
264 * NTP support wiki: [Garmin Refclock Users](https://support.ntp.org/bin/view/Support/GarminRefclockUsers)
265 * [Adding a FreeBSD NTP server based on an GPS 18 LVC device](http://www.satsignal.eu/ntp/FreeBSD-GPS-PPS.htm) by David Taylor
266 * [Enabling ntpd PPS support for Debian Lenny Linux](http://www.worldtimesolutions.com/support/ntp/Debian_Lenny_Linux_PPS_support_for_ntpd.html) by World Time Solutions
267 * [Garmin GPS 18x OEM](https://buy.garmin.com/shop/shop.do?cID=158&pID=27594)
268 * [NTP server using PC gnu/linux and freebsd](http://www.wraith.sf.ca.us/ntp/) by Steven Bjork
269 * [Stratum 1 NTP, Garmin GPS 18 LVC on FreeBSD 8.0](http://blog.doylenet.net/?p=145) by Ryan Doyle
270 * [Synchronising to a Garmin GPS 18 LVC](http://www.sput.nl/time/garmin.html) by R.J. van der Putten
271 * [Synchronizing an NTP server to GPS/PPS](http://linlog.blogspot.com/2009/07/synchronizing-ntp-server-to-gpspps.html) by Pela-Suros
272 * [Synchronizing ntpd to a Garmin GPS 18 LVC via gpsd](http://www.rjsystems.nl/en/2100-ntpd-garmin-gps-18-lvc-gpsd.php) by Jaap Winius