caf9c88c2b5fb2a7b47fe75f0109ed5c04570d17
[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](http://www.pool.ntp.org/scores/2001:470:d:6ad:222:4dff:fe83:cd4a) and it is part of the NTP pool.
2 <!-- 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 * Build a customized [[!debpkg ntp]] package which [enables debugging](http://bugs.debian.org/643954) and builds against the timepps.h header installed by pps-tools (there is no PPS support in the current Debian package of NTP, but there is a [bug report](https://bugs.debian.org/691672) requesting that it be built-in)
31 * Build a custom kernel which enables CONFIG_NTP_PPS
32
33 Some details:
34
35 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:
36
37     SUBSYSTEM=="pps", MODE="0664" GROUP="dialout"
38     KERNEL=="ttyS0" SYMLINK+="gps0"
39     KERNEL=="ttyS0", RUN+="/usr/sbin/ldattach pps /dev/%k"
40     KERNEL=="pps0" SYMLINK+="gpspps0"
41
42 Here is my working ntp.conf:
43
44     rlimit memlock 128
45     driftfile /var/lib/ntp/ntp.drift
46     restrict localhost
47     restrict default limited kod noquery
48     server darwin.kenyonralph.com iburst
49     pool 2.us.pool.ntp.org iburst
50     server 127.127.20.0 mode 16 minpoll 3 iburst
51     fudge 127.127.20.0 flag1 1 flag2 0 flag3 1 time2 0.545
52     leapfile /etc/ntp/leap-seconds.list
53
54 Example output after letting ntpd run for about 8 hours:
55
56     kenyon@einstein ~ % ntpq -ccv -p -crv -ckern -csysinfo
57     associd=0 status=0000 no events, clk_unspec,
58     device="NMEA GPS Clock",
59     timecode="$GPGGA,172617,1111.3839,N,11111.4417,W,2,11,0.8,126.3,M,-35.5,M,,*71",
60     poll=3418, noreply=0, badformat=0, baddata=0, fudgetime2=545.000,
61     stratum=0, refid=GPS, flags=5
62          remote           refid      st t when poll reach   delay   offset  jitter
63     ==============================================================================
64      2.us.pool.ntp.o .POOL.          16 p    -   64    0    0.000    0.000   0.000
65     oGPS_NMEA(0)     .GPS.            0 l    -    8  377    0.000    0.000   0.004
66     +darwin.kenyonra 127.67.113.92    2 u   50   64  377   28.478    4.232   0.953
67     -2001:470:c:4a1: 131.188.3.220    2 u   45   64  377  200.027   11.259   0.586
68     -2604:a880:800:1 184.105.182.7    3 u   39   64  377   82.776    4.196   1.805
69     -ntp.jtsage.com  216.218.254.202  2 u   24   64  377   69.561   -1.286   0.490
70     -2604:a880:800:1 184.105.182.7    3 u   46   64  377   82.421    3.827   0.603
71     *yurizoku.tk     209.51.161.238   2 u   59   64  377   80.916    1.554   0.619
72     +198.110.48.12 ( 204.9.54.119     2 u   35   64  377  100.437    1.796   1.330
73     -108.61.194.85 ( 201.198.247.252  2 u   53   64  377   45.230   -5.521   1.041
74     associd=0 status=041d leap_none, sync_uhf_radio, 1 event, kern,
75     version="ntpd 4.2.8p1@1.3265-o Mon Feb  9 09:59:02 UTC 2015 (1)",
76     processor="x86_64", system="Linux/3.16.7-ckt2", leap=00, stratum=1,
77     precision=-23, rootdelay=0.000, rootdisp=1.015, refid=GPS,
78     reftime=d884bdb9.bc1f69e3  Tue, Feb 10 2015  9:26:17.734,
79     clock=d884bdba.e1639551  Tue, Feb 10 2015  9:26:18.880, peer=27173, tc=3,
80     mintc=3, offset=-0.000130, frequency=-13.457, sys_jitter=0.004033,
81     clk_jitter=0.051, clk_wander=0.031, tai=35, leapsec=201507010000,
82     expire=201512280000
83     associd=0 status=041d leap_none, sync_uhf_radio, 1 event, kern,
84     pll offset:            0
85     pll frequency:         -13.4565
86     maximum error:         0.0015
87     estimated error:       3.4e-05
88     kernel status:         pll ppsfreq ppstime ppssignal nano
89     pll time constant:     3
90     precision:             1e-06
91     frequency tolerance:   500
92     pps frequency:         -13.4874
93     pps stability:         0.280609
94     pps jitter:            0.050
95     calibration interval   256
96     calibration cycles:    152
97     jitter exceeded:       45
98     stability exceeded:    2
99     calibration errors:    0
100     associd=0 status=041d leap_none, sync_uhf_radio, 1 event, kern,
101     system peer:        GPS_NMEA(0)
102     system peer mode:   client
103     leap indicator:     00
104     stratum:            1
105     log2 precision:     -23
106     root delay:         0.000
107     root dispersion:    1.015
108     reference ID:       GPS
109     reference time:     d884bdb9.bc1f69e3  Tue, Feb 10 2015  9:26:17.734
110     system jitter:      0.004033
111     clock jitter:       0.051
112     clock wander:       0.031
113     broadcast delay:    0.000
114     symm. auth. delay:  0.000
115
116 I also tried setting up a time server with FreeBSD to see if it's any easier or better.
117
118 ## FreeBSD setup
119
120 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.
121
122 I am using [ntp-devel](http://www.freshports.org/net/ntp-devel/) from ports.
123
124 ### /etc/rc.conf
125     ntpd_enable="YES"
126     ntpd_flags="-N -p /var/run/ntpd.pid -f /var/db/ntpd.drift"
127     ntpd_program="/usr/local/sbin/ntpd"
128     ntpd_sync_on_start="YES"
129
130 ### /etc/devfs.conf
131     link cuau0 gps0
132
133 ### /etc/ttys
134 Commented out ttyu*.
135
136 ### Kernel configuration
137 Put this in `/usr/src/sys/amd64/conf/PPS-GENERIC`:
138
139     #
140     # PPS -- Generic kernel configuration file for FreeBSD/amd64 PPS
141     #
142     include GENERIC
143     ident PPS-GENERIC
144     options PPS_SYNC
145
146 ### /etc/make.conf
147     KERNCONF= PPS-GENERIC GENERIC
148
149 ### /etc/ntp.conf
150     server 127.127.20.0 minpoll 3
151     fudge 127.127.20.0 flag1 1 flag2 0 flag3 1 time2 0.600
152     server darwin.kenyonralph.com iburst
153     server voodoo.kenyonralph.com iburst
154     server grunt.kenyonralph.com iburst
155     pool 2.us.pool.ntp.org iburst
156
157 ### Example output
158 Example output after running for a few minutes and while doing buildworld and buildkernel:
159
160     kenyon@gauss ~ % ntpq -p -c clockvar -c readvar; ntpdc -c kerninfo
161          remote           refid      st t when poll reach   delay   offset  jitter
162     ==============================================================================
163     oGPS_NMEA(0)     .GPS.            0 l   38   64  377    0.000    0.648   0.249
164      2.us.pool.ntp.o .POOL.          16 p    -   64    0    0.000    0.000   0.002
165     *darwin.kenyonra 127.67.113.92    2 u   63   64  377   20.431    3.263   3.354
166     -voodoo.kenyonra 106.61.18.129    3 u   61   64  377    0.243    4.485   0.124
167     +grunt.kenyonral 106.61.18.129    3 u   64   64  377    0.182    3.521   0.225
168     -conquest.kjsl.c 69.36.224.15     2 u   62   64  377   26.374    5.768   2.522
169     -bindcat.fhsu.ed 128.138.140.44   2 u   63   64  377   75.219    4.115   1.846
170     -peachesgeldof.k 204.9.54.119     2 u   64   64  377   94.141    3.787   2.844
171     -ip-173-201-38-8 198.153.152.52   2 u   58   64  377   24.752    6.104   1.801
172     -druid.storyinme 130.207.244.240  2 u   56   64  377   65.657   -2.773   4.542
173     +cheezum.mattnor 129.7.1.66       2 u   65   64  377   45.797    2.972   2.286
174     associd=0 status=0000 no events, clk_unspec,
175     device="NMEA GPS Clock",
176     timecode="$GPGGA,085740,1111.1111,N,11111.1111,W,1,09,0.9,103.2,M,-35.3,M,,*77",
177     poll=14, noreply=0, badformat=0, baddata=0, fudgetime2=600.000,
178     stratum=0, refid=GPS, flags=5
179     associd=0 status=04ad leap_none, sync_uhf_radio, 10 events, kern,
180     version="ntpd 4.2.7p225@1.2483-o Fri Oct 21 04:59:50 UTC 2011 (1)",
181     processor="amd64", system="FreeBSD/9.0-RC1", leap=00, stratum=1,
182     precision=-19, rootdelay=0.000, rootdisp=2.380, refid=GPS,
183     reftime=d24d03df.edabdc26  Sat, Oct 22 2011  1:57:03.928,
184     clock=d24d0405.3f696dad  Sat, Oct 22 2011  1:57:41.247, peer=38673, tc=6,
185     mintc=3, offset=0.648, frequency=-4.048, sys_jitter=0.249,
186     clk_jitter=0.000, clk_wander=0.005
187     pll offset:           0.000624065 s
188     pll frequency:        -4.048 ppm
189     maximum error:        2.0824e-05 s
190     estimated error:      1.7e-08 s
191     status:               2007  pll ppsfreq ppstime nano
192     pll time constant:    6
193     precision:            1e-09 s
194     frequency tolerance:  496 ppm
195     kenyon@gauss ~ % ntpq -c "rv 38673"
196     associd=38673 status=973a conf, reach, sel_pps.peer, 3 events, sys_peer,
197     srcadr=GPS_NMEA(0), srcport=123, dstadr=127.0.0.1, dstport=123, leap=00,
198     stratum=0, precision=-20, rootdelay=0.000, rootdisp=0.000, refid=GPS,
199     reftime=d24d03de.ffd6d0b6  Sat, Oct 22 2011  1:57:02.999,
200     rec=d24d03df.edabdc26  Sat, Oct 22 2011  1:57:03.928, reach=377,
201     unreach=0, hmode=3, pmode=4, hpoll=6, ppoll=6, headway=0, flash=00 ok,
202     keyid=0, offset=0.648, delay=0.000, dispersion=0.928, jitter=0.249,
203     filtdelay=     0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00,
204     filtoffset=    0.65    0.70    0.76    0.80    0.86    0.91    0.99    1.06,
205     filtdisp=      0.00    0.96    1.92    2.88    3.84    4.80    5.76    6.72
206
207 Here is what kerninfo looks like with the PPS_SYNC kernel option:
208
209     pll offset:           0.000123674 s
210     pll frequency:        -3.918 ppm
211     maximum error:        0.000111415 s
212     estimated error:      1.51e-07 s
213     status:               2107  pll ppsfreq ppstime ppssignal nano
214     pll time constant:    6
215     precision:            1e-09 s
216     frequency tolerance:  496 ppm
217     pps frequency:        -3.918 ppm
218     pps stability:        0.033 ppm
219     pps jitter:           4.729e-06 s
220     calibration interval: 64 s
221     calibration cycles:   27
222     jitter exceeded:      5
223     stability exceeded:   0
224     calibration errors:   10
225
226 ## Conclusion
227
228 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.
229
230 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:
231
232     deb http://kenyonralph.com/repo/ wheezy/
233
234 ## Notes
235
236 * Show serial port settings:
237  * Linux: `stty --all --file=/dev/ttyS0`
238  * FreeBSD: `stty -a -f /dev/cuau0`
239 * Set serial port baud rate to 4800:
240  * Linux: `stty --file=/dev/ttyS0 4800`
241  * FreeBSD (but not really necessary since `cu` can do it, and doesn't seem to take effect anyway): `stty -f /dev/cuau0 4800`
242 * Observe NMEA output:
243  * Linux: `cat /dev/ttyS0`
244  * FreeBSD: `cu -l /dev/cuau0 -s 4800`
245
246 ## References
247
248 * NTP documentation: [Reference Clock Support](http://www.eecis.udel.edu/~mills/ntp/html/refclock.html)
249 * NTP support wiki: [Configuring Garmin Refclocks](https://support.ntp.org/bin/view/Support/ConfiguringGarminRefclocks)
250 * NTP support wiki: [Configuring NMEA Refclocks](https://support.ntp.org/bin/view/Support/ConfiguringNMEARefclocks)
251 * NTP support wiki: [Garmin Refclock Users](https://support.ntp.org/bin/view/Support/GarminRefclockUsers)
252 * [Adding a FreeBSD NTP server based on an GPS 18 LVC device](http://www.satsignal.eu/ntp/FreeBSD-GPS-PPS.htm) by David Taylor
253 * [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
254 * [Garmin GPS 18x OEM](https://buy.garmin.com/shop/shop.do?cID=158&pID=27594)
255 * [NTP server using PC gnu/linux and freebsd](http://www.wraith.sf.ca.us/ntp/) by Steven Bjork
256 * [Stratum 1 NTP, Garmin GPS 18 LVC on FreeBSD 8.0](http://blog.doylenet.net/?p=145) by Ryan Doyle
257 * [Synchronising to a Garmin GPS 18 LVC](http://www.sput.nl/time/garmin.html) by R.J. van der Putten
258 * [Synchronizing an NTP server to GPS/PPS](http://linlog.blogspot.com/2009/07/synchronizing-ntp-server-to-gpspps.html) by Pela-Suros
259 * [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