ntpd/ntp mit externen lokalen Zeitquellen

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Installation von Programmen

  2. Ein Terminal öffnen

  3. Root-Rechte

ntp arbeitet mit einer Vielzahl von lokalen Zeitquellen (serielle, USB-, PCI-Geräte) zusammen, z.B. DCF- oder GPS-Quellen. Die Nutzung von zwei möglichen externen Quellen wird im folgenden gezeigt:

DCF Funkuhr - Gude MouseClock II

Das folgende Beispiel zeigt, wie eine DCF-77 Uhr von Gude 🇩🇪, eine "MouseClock II Funkuhr", eingebunden wird. ntp erwartet DCF-Funkuhren unter /dev/refclock-x - daher wird eine udev-Regel benötigt, um dem meist seriell oder via USB angeschlossenen Gerät einen festen Namen zuzuweisen. Als Beispiel der Inhalt einer udev-Regel, z.B. /etc/udev/rules.d/05-persistent-dcf.rules, passend zur Gude MouseClock II Funkuhr:

KERNEL=="ttyUSB*", ATTRS{idProduct}=="e88a", SYMLINK+="refclock-%m"

udev-Regel aktivieren ntp neu starten[2][3]:

sudo udevadm trigger
sudo service ntp restart 

Nach der Installation des ntp-Dienstes wird die externe Funkuhr in der Konfigurationsdatei /etc/ntp.conf angegeben:

# GUDE Expert mouseCLOCK USB II
server 127.127.8.0 mode 19 prefer
fudge 127.127.8.0 refid GUDE

Nach etwa 3 Minuten sollte eine korrekt ausgerichtete Funkuhr (nach Mainflingen/Hessen) synchronisiert sein. ntp und die Funkuhr können mit watch beobachtet und überprüft werden:

watch -n1 ntpq -c cv -c rv 
associd=0 status=0020 , 2 events, clk_unspec,
device="RAW DCF77 CODE (Expert mouseCLOCK USB v2.0)",
timecode="--#--###---------D--S1-4-1-4p-24---p12----1-4---8--2--1---P",
poll=12, noreply=0, badformat=0, baddata=1, fudgetime1=425.000,
stratum=0, refid=GUDE, flags=2,
refclock_time="d3c5d844.00000000  Fri, Aug  3 2012  4:55:32.000",
refclock_status="DST; TIME CODE; (LEAP INDICATION; ANTENNA)",
refclock_format="RAW DCF77 Timecode",
refclock_states="*NOMINAL: 00:10:33 (88.16%); ILLEGAL DATE: 00:01:25 (11.83%); running time: 00:11:58"
associd=0 status=0214 leap_none, sync_lf_radio, 1 event, freq_mode,
version="ntpd 4.2.6p3@1.2290-o Tue Jun  5 20:12:08 UTC 2012 (1)",
processor="x86_64", system="Linux/3.2.0-29-generic", leap=00, stratum=1,
precision=-22, rootdelay=0.000, rootdisp=31.196, refid=GUDE,
reftime=d3c5d838.75cb8306  Fri, Aug  3 2012  6:55:20.460,
clock=d3c5d844.8f4457f4  Fri, Aug  3 2012  6:55:32.559, peer=44449, tc=6,
mintc=3, offset=-43.458, frequency=-3.564, sys_jitter=1.685,
clk_jitter=14.366, clk_wander=1.260

In der Ausgabe erkennt man, dass die Funkuhr mit stratum=0 und der zugehörige PC mit dem ntp-Dienst als stratum=1 läuft.

Zusätzlich kann es nötig sein, AppArmor den Zugriff auf das NTP-Gerät zu erlauben, und zwar nicht über den Symlink (/dev/refclock-x), sondern dem echten seriellen oder USB-Gerät. In der Datei /etc/apparmor.d/tunables/ntpd wird die die Variable NTPD_DEVICE auf das verwendete NTP-Gerät gesetzt:

@{NTPD_DEVICE}="/dev/ttyUSB*"

Die Variable NTPD_DEVICE wird damit im AppArmor Profil usr.sbin.ntpd korrekt verwendet. AppArmor muss anschließend neu gestartet werden:

sudo service apparmor restart 

GPS-Maus - per gpsd

Ist am Rechner eine GPS-Maus angeschlossen, kann diese als Zeitquelle verwendet werden. Es sollte eine udev-Regel vorhanden sein, die der GPS Maus mit "SYMLINK+="gps0" einen festen Namen vergibt (/dev/gps0). Weitere Voraussetzung ist, dass die GPS-Maus von gpsd erkannt und verwendet wird, und gpsd als automatisch startender Dienst konfiguriert ist.

Kurzhilfe für gpsd, Installieren und Konfigurieren[1]:

sudo apt-get install gpsd
sudo dpkg-reconfigure gpsd 

Die Fragen nach automatisch Starten und automatisch GPS Geräte erkennen wird mit Ja beantwortet. Als zusätzliche Option gibt man meist "-n" an, damit GPS Daten auch ohne Client permanent an den Rechner gesendet werden. Nach einem Neustart des gpsd mit

sudo service gpsd restart 

werden die GPS Zeitdaten in den Shared Memory Driver (SHM) abgelegt. Nach einem Neustart der GPS-Maus kann es einige Minuten dauern, bis es einen SAT-fix hat und die Zeitdaten bereitstehen. Es können dabei weitere Clientprogramme gpsd gleichzeitig nutzen, die Nutzung als Zeitquelle für ntp blockiert die GSP Maus nicht. Clientprogramme dürfen /dev/gps0 natürlich nicht direkt nutzten, sondern müssen so konfiguriert werden, dass sie gpsd nutzen.

Die von gpsd bereitgestellten Zeitdaten in dem SHM können nun von ntp verwendet werden, die Konfiguration erfolgt in der /etc/ntp.conf :

# SHM 0
server 127.127.28.0
fudge 127.127.28.0 refid GPSa

# SHM 1
server 127.127.28.1
fudge 127.127.28.1 refid GPSp

SHM 1 mit PPS Daten wird nicht von allen GPS Mäusen unterstützt, und kann daher deaktiviert werden, falls hier keine Zeitdaten ankommen. Der ntp Dienst muss nun neu gestartet werden:

sudo service ntp restart 

Die folgende Beispiel Ausgabe zeigt

ntpq -c peers 
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 LOCAL(0)        .LOCL.          10 l 155m   64    0    0.000    0.000   0.000
xSHM(0)          .GPSu.           0 l   54   64  377    0.000  -104.24   1.684
*SHM(2)          .DCFm.           0 l    4   16  377    0.000   -0.045   0.039
xzinc.v-yu.com   131.188.3.221    2 u  833 1024  377   73.571  -26.173  27.213
+char-ntp-pool.c .shm0.           1 u  771 1024  377   31.242    0.920  21.549