combine command lines
[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 [gauss.kenyonralph.com](http://www.pool.ntp.org/scores/2001:470:8683:0:219:b9ff:fe7d:e6e0) 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 I first tried using the GPS with an old Pentium III computer running Ubuntu 11.04 natty running kernel 2.6.38-11-generic-pae. I could see the NMEA sentences with `gpsd` and `gpspipe -r`, but a few seconds after I did `sudo ldattach PPS /dev/ttyS0` the system would lock up hard due to some kernel bug in some driver for my hardware. I saw `BUG: scheduling while atomic` in the syslog, but I wasn't able to capture the whole bug output. The same bug would occur if I just did `cat /dev/ttyS0`. So I just gave up with that old hardware and moved the GPS to my newer desktop computer running Debian squeeze and kernel 2.6.39-bpo.2-amd64. No lockups on this machine.
27
28 You need to have `/usr/include/timepps.h` to compile ntpd with proper PPS support. This header [does not exist in Debian yet](http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=570233), so I used the one from [Alexander Gordeev's git repository](https://github.com/ago/pps-tools/).
29
30 The ntpd in Debian squeeze [does not have debugging enabled](http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=643954), which makes it difficult to see what is going on with your local reference clock. I [rebuilt the squeeze package](http://raphaelhertzog.com/2010/12/15/howto-to-rebuild-debian-packages/) with debugging enabled, but I still wasn't getting very good results. It would not select the GPS as system peer or PPS peer, and jitter was high, in the tens of milliseconds. So I compiled my own ntp version 4.2.6p4 straight from the tarball, starting with this configure line: `./configure --prefix=/usr --sysconfdir=/var/lib/ntp` The output below is from this build of ntp, not the Debian package, which was version 4.2.6p2.
31
32 When you do `sudo ldattach PPS /dev/ttyS0`, the PPS modules will be loaded automatically and the device `/dev/pps0` will be created. I have some udev rules to create device symlinks and run ldattach:
33
34     KERNEL=="ttyS0" SYMLINK+="gps0"
35     KERNEL=="ttyS0", RUN+="/usr/sbin/ldattach pps /dev/%k"
36     KERNEL=="pps0" SYMLINK+="gpspps0"
37
38 Here is my working Debian squeeze ntp.conf:
39
40     driftfile /var/lib/ntp/ntp.drift
41     server 127.127.20.0
42     fudge 127.127.20.0 flag1 1 flag2 0 flag3 1 time2 0.600
43     server voodoo.kenyonralph.com iburst
44     server darwin.kenyonralph.com iburst
45     pool 2.us.pool.ntp.org iburst
46
47 Example output after letting ntpd run for about 8 hours:
48
49     ntpq -p -c clockvar; ntptime; ntpdc -c kerninfo
50          remote           refid      st t when poll reach   delay   offset  jitter
51     ==============================================================================
52     oGPS_NMEA(0)     .GPS.            0 l    3    8  377    0.000    0.001   0.001
53     *voodoo.kenyonra 72.29.161.5      2 u   46   64  377    0.243    2.454   0.146
54     +darwin.kenyonra 127.67.113.92    2 u   14   64  377   20.122    2.467   3.413
55     associd=0 status=0012 , 1 event, clk_bad_format,
56     device="NMEA GPS Clock",
57     timecode="$GPRMC,212627,A,1111.1111,N,11111.1111,W,000.0,171.9,011011,012.1,E*61",
58     poll=3876, noreply=0, badformat=1, baddata=0, fudgetime1=0.000,
59     stratum=0, refid=GPS, flags=5
60     ntp_gettime() returns code 0 (OK)
61       time d2320403.a6e5ab84  Sat, Oct  1 2011 14:26:27.651, (.651942165),
62       maximum error 1617 us, estimated error 0 us
63     ntp_adjtime() returns code 0 (OK)
64       modes 0x0 (),
65       offset 0.530 us, frequency 4.205 ppm, interval 1 s,
66       maximum error 1617 us, estimated error 0 us,
67       status 0x2007 (PLL,PPSFREQ,PPSTIME,NANO),
68       time constant 3, precision 0.001 us, tolerance 500 ppm,
69     pll offset:           5.3e-07 s
70     pll frequency:        4.205 ppm
71     maximum error:        0.001617 s
72     estimated error:      0 s
73     status:               2007  pll ppsfreq ppstime nano
74     pll time constant:    3
75     precision:            1e-09 s
76     frequency tolerance:  500 ppm
77
78 I'm going to try setting up a time server with FreeBSD next to see if it's any easier or better.
79
80 ## FreeBSD setup
81
82 I am using [ntp-devel](http://www.freshports.org/net/ntp-devel/) from ports.
83
84 ### /etc/rc.conf
85     ntpd_enable="YES"
86     ntpd_flags="-N -p /var/run/ntpd.pid -f /var/db/ntpd.drift"
87     ntpd_program="/usr/local/sbin/ntpd"
88     ntpd_sync_on_start="YES"
89
90 ### /etc/devfs.conf
91     link cuau0 gps0
92
93 ### /etc/ttys
94 Commented out ttyu*.
95
96 ### Kernel configuration
97 Put this in `/usr/src/sys/amd64/conf/PPS-GENERIC`:
98
99     #
100     # PPS -- Generic kernel configuration file for FreeBSD/amd64 PPS
101     #
102     include GENERIC
103     ident PPS-GENERIC
104     options PPS_SYNC
105
106 ### /etc/make.conf
107     KERNCONF= PPS-GENERIC GENERIC
108
109 ### /etc/ntp.conf
110     server 127.127.20.0 minpoll 3
111     fudge 127.127.20.0 flag1 1 flag2 0 flag3 1 time2 0.600
112     server darwin.kenyonralph.com iburst
113     server voodoo.kenyonralph.com iburst
114     server grunt.kenyonralph.com iburst
115     pool 2.us.pool.ntp.org iburst
116
117 ### Example output
118 Example output after running for a few minutes and while doing buildworld and buildkernel:
119
120     kenyon@gauss ~ % ntpq -p -c clockvar -c readvar; ntpdc -c kerninfo
121          remote           refid      st t when poll reach   delay   offset  jitter
122     ==============================================================================
123     oGPS_NMEA(0)     .GPS.            0 l   38   64  377    0.000    0.648   0.249
124      2.us.pool.ntp.o .POOL.          16 p    -   64    0    0.000    0.000   0.002
125     *darwin.kenyonra 127.67.113.92    2 u   63   64  377   20.431    3.263   3.354
126     -voodoo.kenyonra 106.61.18.129    3 u   61   64  377    0.243    4.485   0.124
127     +grunt.kenyonral 106.61.18.129    3 u   64   64  377    0.182    3.521   0.225
128     -conquest.kjsl.c 69.36.224.15     2 u   62   64  377   26.374    5.768   2.522
129     -bindcat.fhsu.ed 128.138.140.44   2 u   63   64  377   75.219    4.115   1.846
130     -peachesgeldof.k 204.9.54.119     2 u   64   64  377   94.141    3.787   2.844
131     -ip-173-201-38-8 198.153.152.52   2 u   58   64  377   24.752    6.104   1.801
132     -druid.storyinme 130.207.244.240  2 u   56   64  377   65.657   -2.773   4.542
133     +cheezum.mattnor 129.7.1.66       2 u   65   64  377   45.797    2.972   2.286
134     associd=0 status=0000 no events, clk_unspec,
135     device="NMEA GPS Clock",
136     timecode="$GPGGA,085740,1111.1111,N,11111.1111,W,1,09,0.9,103.2,M,-35.3,M,,*77",
137     poll=14, noreply=0, badformat=0, baddata=0, fudgetime2=600.000,
138     stratum=0, refid=GPS, flags=5
139     associd=0 status=04ad leap_none, sync_uhf_radio, 10 events, kern,
140     version="ntpd 4.2.7p225@1.2483-o Fri Oct 21 04:59:50 UTC 2011 (1)",
141     processor="amd64", system="FreeBSD/9.0-RC1", leap=00, stratum=1,
142     precision=-19, rootdelay=0.000, rootdisp=2.380, refid=GPS,
143     reftime=d24d03df.edabdc26  Sat, Oct 22 2011  1:57:03.928,
144     clock=d24d0405.3f696dad  Sat, Oct 22 2011  1:57:41.247, peer=38673, tc=6,
145     mintc=3, offset=0.648, frequency=-4.048, sys_jitter=0.249,
146     clk_jitter=0.000, clk_wander=0.005
147     pll offset:           0.000624065 s
148     pll frequency:        -4.048 ppm
149     maximum error:        2.0824e-05 s
150     estimated error:      1.7e-08 s
151     status:               2007  pll ppsfreq ppstime nano
152     pll time constant:    6
153     precision:            1e-09 s
154     frequency tolerance:  496 ppm
155     kenyon@gauss ~ % ntpq -c "rv 38673"
156     associd=38673 status=973a conf, reach, sel_pps.peer, 3 events, sys_peer,
157     srcadr=GPS_NMEA(0), srcport=123, dstadr=127.0.0.1, dstport=123, leap=00,
158     stratum=0, precision=-20, rootdelay=0.000, rootdisp=0.000, refid=GPS,
159     reftime=d24d03de.ffd6d0b6  Sat, Oct 22 2011  1:57:02.999,
160     rec=d24d03df.edabdc26  Sat, Oct 22 2011  1:57:03.928, reach=377,
161     unreach=0, hmode=3, pmode=4, hpoll=6, ppoll=6, headway=0, flash=00 ok,
162     keyid=0, offset=0.648, delay=0.000, dispersion=0.928, jitter=0.249,
163     filtdelay=     0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00,
164     filtoffset=    0.65    0.70    0.76    0.80    0.86    0.91    0.99    1.06,
165     filtdisp=      0.00    0.96    1.92    2.88    3.84    4.80    5.76    6.72
166
167 Here is what kerninfo looks like with the PPS_SYNC kernel option:
168
169     pll offset:           0.000123674 s
170     pll frequency:        -3.918 ppm
171     maximum error:        0.000111415 s
172     estimated error:      1.51e-07 s
173     status:               2107  pll ppsfreq ppstime ppssignal nano
174     pll time constant:    6
175     precision:            1e-09 s
176     frequency tolerance:  496 ppm
177     pps frequency:        -3.918 ppm
178     pps stability:        0.033 ppm
179     pps jitter:           4.729e-06 s
180     calibration interval: 64 s
181     calibration cycles:   27
182     jitter exceeded:      5
183     stability exceeded:   0
184     calibration errors:   10
185
186 ## Conclusion
187
188 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.
189
190 ## Notes
191
192 * Show serial port settings:
193  * Linux: `stty --all --file=/dev/ttyS0`
194  * FreeBSD: `stty -a -f /dev/cuau0`
195 * Set serial port baud rate to 4800:
196  * Linux: `stty --file=/dev/ttyS0 4800`
197  * FreeBSD (but not really necessary since `cu` can do it, and doesn't seem to take effect anyway): `stty -f /dev/cuau0 4800`
198 * Observe NMEA output:
199  * Linux: `cat < /dev/ttyS0`
200  * FreeBSD: `cu -l /dev/cuau0 -s 4800`
201
202 ## References
203
204 * NTP documentation: [Reference Clock Support](http://www.eecis.udel.edu/~mills/ntp/html/refclock.html)
205 * NTP support wiki: [Configuring Garmin Refclocks](https://support.ntp.org/bin/view/Support/ConfiguringGarminRefclocks)
206 * NTP support wiki: [Configuring NMEA Refclocks](https://support.ntp.org/bin/view/Support/ConfiguringNMEARefclocks)
207 * NTP support wiki: [Garmin Refclock Users](https://support.ntp.org/bin/view/Support/GarminRefclockUsers)
208 * [Adding a FreeBSD NTP server based on an GPS 18 LVC device](http://www.satsignal.eu/ntp/FreeBSD-GPS-PPS.htm) by David Taylor
209 * [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
210 * [Garmin GPS 18x OEM](https://buy.garmin.com/shop/shop.do?cID=158&pID=27594)
211 * [LinuxPPS installation](http://wiki.enneenne.com/index.php/LinuxPPS_installation) and [ntpd support](http://wiki.enneenne.com/index.php/LinuxPPS_NTPD_support)
212 * [NTP server using PC gnu/linux and freebsd](http://www.wraith.sf.ca.us/ntp/) by Steven Bjork
213 * [NTP](http://en.gentoo-wiki.com/wiki/NTP) on Gentoo Wiki
214 * [Stratum 1 NTP, Garmin GPS 18 LVC on FreeBSD 8.0](http://blog.doylenet.net/?p=145) by Ryan Doyle
215 * [Synchronising to a Garmin GPS 18 LVC](http://www.sput.nl/time/garmin.html) by R.J. van der Putten
216 * [Synchronizing an NTP server to GPS/PPS](http://linlog.blogspot.com/2009/07/synchronizing-ntp-server-to-gpspps.html) by Pela-Suros
217 * [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
218 * [Ubuntu bug 805661](https://bugs.launchpad.net/bugs/805661)
219 * [Using a Garmin GPS 18 LVC as NTP stratum-0 on Linux 2.6](http://time.qnan.org/) by Philip M. White