Kevin McQuiggin (VE7ZD/KN7Q)
Actually ntpd doesn’t work very well using NMEA sentences via USB or serial port as input. This is because of variance in the timing of the serial data stream and the way that the machine's CPU responds to interrupts on the serial or USB port from the GPS where the GPS unit is connected. Timing can be all over the map due to CPU workload and other tasks which are running.
If you have a local GPS receiver, then a FAR better approach is to use a pulsed output from the device to generate a high priority interrupt that is handled directly by the time management processes. This involves another daemon called gpsd and use of a GPS receiver that outputs a nanosecond-accurate “pulse per second” signal. Cheap receivers usually do not provide a PPS signal but several slightly more expensive ones do.
There is a good writeup on how to do this at https://www.lammertbies.nl/comm/info/gps-time.
I use a Garmin Garmin 18x LVC GPS Navigator Unit, which is available on Amazon for about USD$68. See the link for how to connect what to where!