NTP Konfiguration

NTP - Zeitsynchronisation im Netzwerk mit GPS oder Funkuhr als Referenzeitquelle

Konfiguration generell

Der NTP-Daemon liest seine Konfigurationsparameter aus einer Datei namens ntp.conf. Auf Unix-ähnlichen Systemen liegt diese Datei meist im Verzeichis /etc.

Wenn unter Windows eine aktuelle NTP-Version mit Hilfe des GUI-Installers von der Meinberg NTP-Download-Seite installiert wurde, liegt die Datei ntp.conf normalerweise in einem Verzeichnis etc\ im Installationsverzeichnis, z.B. in c:\Programme\NTP\etc.

Bei älteren Versionen von NTP für Windows wurde die Datei entweder im Verzeichnis %systemroot% oder im Verzeichnis %systemroot%\system32\drivers\etc abgelegt, wobei %systemroot% je nach Windows-Version dem Verzeichnis c:\winnt oder c:\Windows entspricht.

Normalerweise enthält die Datei ntp.conf mindestens eine oder mehrere Zeilen mit dem Keyword server. Jede dieser Zeilen gibt eine Referenzzeitquelle an, die entweder ein anderes Gerät im Netzwerk sein kann, oder auch eine Funkuhr, die direkt an den Computer angeschlossen ist.

Referenzzeitquellen werden durch eine IP-Adresse angegeben oder auch durch einen Hostname, der durch einen DNS Nameserver aufgelöst werden kann. Wenn es sich bei einer IP-Adresse um ein real existierendes Gerät im Netzwerk handelt, geht der NTP-Daemon davon aus, dass auf dem Gerät mit der IP-Adresse ein weiterer NTP-Daemon läuft, den er kontaktieren kann. Außerdem verwendet NTP einige Pseudo-IP-Adressen, die normalerweise im Netzwerk nicht verwendet werden, um spezielle Zeitquellen wie Funkuhren zu adressieren.

Zum Beispiel benutzt NTP die Pseudo-IP-Adresse 127.127.8.n, um eine Funkuhr von Meinberg anzusprechen, die direkt an den Computer angeschlossen ist. Um seine eigene Systemuhr anzusprechen, bei NTP local clock genannt, verwendet NTP die Pseudo-IP-Adresse 127.127.1.0. Diese Adresse darf nicht mit der IP-Adresse 127.0.0.1 verwechselt werden, die auch als localhost oder Loopback-Interface bezeichnet wird.

Achtung:
Einige sehr alte Versionen von NTP unter Windows haben Probleme mit der DNS-Namensauflösung wenn das Programmpaket mit MD5-Authentifizierung compiliert wurden. In diesem Fall müssen alle IP-Adressen in der Datei ntp.conf als numerische Werte eingegeben werden (z.B. 172.16.1.1). DNS-Hostnamen wie host.domain.com können nicht verwendet werden.

Konfiguration mit Meinberg Funkuhr (Unix)

Unter Unix-ähnlichen Systemen wird der Parse-Treiber verwendet, um Funkuhren von Meinberg mit serieller Schnittstelle als Referenzzeitquelle zu verwenden. Der Parse-Treiber ist Bestandteil des NTP-Pakets, muss aber beim Compilieren des NTP-Paketes explizit aktiviert werden. Bei den gängigen Linux-Distributionen ist der Parse-Treiber in den vorcompilierten Paketen aktiviert, bei einigen älteren Solaris-Versionen jedoch nicht.

Auf der Meinberg Software Download-Seite ist ein Treiberpaket für Meinberg Einsteckkarten unter Linux verfügbar, welches es erlaubt, die Einsteckkarten zu konfigurieren sowie deren Statusinformationen anzuzeigen. Zusätzlich ermöglicht der Treiber dem NTP-Daemon unter Linux, die Referenzzeit von der Einsteckkarte anstatt über die serielle Schnittstelle zu lesen. Dieser Treiber wird nur für die Einsteckkarten benötigt, nicht jedoch für Funkuhren, die direkt über eine serielle Schnittstelle angebunden sind.

Die unten aufgeführten Konfigurationsschritte müssen von einem Benutzer mit genügend Rechten auf dem System durchgeführt werden, z. B. dem Benutzer root.

Der Parse-Treiber spricht Funkuhren als Devices mit Namen /dev/refclock-n an, wobei n ein Index von 0 bis 3 sein kann, da der Parse-Treiber bis zu 4 Funkuhren gleichzeitig verwenden kann.

Jedes der verwendeten Devices wird als symbolischer Link zu einem einem realen Device angelegt, hinter dem sich eine Funkuhr verbirgt. Meist handelt es sich bei dem realen Device um eine serielle Schnittstelle, an die eine Funkuhr angeschlossen ist, unter Linux kann der Link jedoch auch auf ein Device zeigen, hinter dem sich eine Einsteckkarte verbirgt.

Jede der Funkuhren muss in der Datei ntp.conf durch eine Zeile mit dem Keyword server und einer Pseudo-IP-Adresse 127.127.8.n angegeben werden. Dabei muss der Wert für n jeweils der Index-Nummer entsprechen, die für das oben erwähnte symbolische Device /dev/refclock-n verwendet wurde.

Auf die Pseudo-IP-Adresse folgt noch ein Parameter mode m, der den Typ der Funkuhr angibt, die unter dieser Adresse angesprochen wird. Die Tabelle unten gibt die für Funkuhren von Meinberg verwendeten Werte für den mode-Parameter und die zugehörigen Funkuhr-Typen an:

Mode-Nummer Funkuhr Trust Time
mode 0 Meinberg PZF-Funkuhr mit TCXO 12 Stunden
mode 1 Meinberg PZF-Funkuhr mit OCXO 4 Tage
mode 2 Meinberg Standard Time String mit 9600, 7E2 30 Minuten
mode 7 Meinberg GPS mit OCXO, 19200, 8N1 4 Tage

Wenn beispielsweise eine einzelne Funkuhr an der ersten seriellen Schnittstelle des Computers angeschlossen ist, wird zunächst ein symbolischer Link angelegt, der auf die erste serielle Schnittstelle verweist. Unter Linux hat diese Schnittstelle oft den Namen /dev/ttyS0, kann aber je nach Unix-System auch anders heißen:

ln -s /dev/ttyS0 /dev/refclock-0

Wenn eine Einsteckkarte mit dem Meinberg Linux-Treiber als Referenzzeitquelle für NTP verwendet werden soll, muss der symbolische Link auf die Gerätedatei zeigen, hinter der sich die Einstekkarte verbirgt:

ln -s /dev/mbgclock0 /dev/refclock-0

Achtung: Aktuelle Versionen des Linux-Treibers erzeugen symbolische Links /dev/refclock-* automatisch durch das Linux udev-System. Bei älteren Versionen des Treibers (vor v3.0.0) dagegen musste der Link manuell angelegt werden und die Gerätedatei für die Einsteckkarte hieß /dev/mbgntp. Im Zweifelsfall gibt die README- oder LIESMICH-Datei des Treiberpaketes Auskunft.

Im nächsten Schritt wird die Datei ntp.conf angepasst, um dem NTP-Daemon mitzuteilen, welche Funkuhr er verwenden soll. Die Datei muss eine server-Zeile für das Gerät refclock-0 enthalten, das oben angelegt wurde. Wenn die Funkuhr das Meinberg Standard-Zeittelegramm mit 9600 Baud und Datenformat 7E2 ausgibt, muss der Mode-Parameter laut der Tabelle oben mit 2 angegeben werden. Wenn der Linux-Treiber für eine Einsteckkarte verwendet wird, muss immer mode 2 verwendet werden:

server 127.127.8.0 mode 2     # standard time string with 9600, 7E2

Zusätzlich sollte ein server-Eintrag für die Local Clock angelegt werden, die als Fallback-Reserve genutzt werden kann, wenn keine andere Referenzzeitquelle mehr verfügbar sein sollte. Da die Local Clock nicht sehr genau ist, sollte ihr Stratum auf einen niedrigen Wert gesetzt werden, z.B. Stratum 12:

server 127.127.1.0            # local clock
fudge  127.127.1.0 stratum 12

Um die Änderungen wirksam werden zu lassen, muss der NTP-Daemon neu gestartet werden. Ein NTP-Daemon, der zusammen mit dem Betriebssystem geliefert wurde, kann mit oder ohne Unterstützung für Funkuhren von Meinberg compiliert worden sein.

Ein NTP-Daemon, der zusammen mit dem Betriebssystem geliefert wurde, kann mit oder ohne Unterstützung für Funkuhren von Meinberg compiliert worden sein.

Wenn nach dem Start des NTP-Daemons die Ausgabe des Befehls ntpq -p eine Referenzzeitquelle mit der Bezeichnung generic auflistet, unterstützt der NTP-Daemon die Funkuhr.

Wenn keine Referenzzeitquelle mit der Bezeichnung generic angezeigt wird, wurde das NTP-Paket eventuell ohne Unterstützung für die Parse-Uhren compiliert, oder dem NTP-Daemon wird der Zugriff auf die Gerätedatei verwehrt ("Permission denied"). Die Syslog-Meldungen des NTP-Daemon nach dem Start geben Aufschluss über den tatsächlichen Grund für das Problem.

Der Grund für Meldungen "Permission denied" kann bei aktuellen Linux-Distributionen eins der Programme AppArmor oder SELinux sein, die den Zugriff auf Dateien und Geräte kontrollieren und beschränken. Einzelheiten dazu und wie man das Problem beseitigt finden sich den Dateien README und LIESMICH aus dem Linux-Treiberpaket.

Wenn der NTP-Daemon ohne Unterstützung für die Parse-Uhren compiliert wurde, muß das NTP-Paket auf dem Zielsystem neu compiliert werden. Dazu muss ein Compiler auf dem System installiert sein, außerdem müssen die Programmquellen vorliegen, die in der Standard-NTP-Distribution enthalten sind.

In dem Beispiel unten ist name der Hauptname einer NTP-Distribution. NTP-Distributionen stehen als Archive mit Namen name.tar.gz zum Download im Internet bereit und müssen auf dem Zielsystem entpackt werden:

tar xvzf name.tar.gz

Durch diesen Befehl wird ein neues Verzeichnis name angelegt, das noch weitere Unterverzeichnisse enthält. Um das Paket zu compilieren, wechselt man in das neu angelegte Verzeichnis, wo man die Befehle configure und make aufruft, um das Programmpaket zu compilieren:

cd name
./configure --enable-MEINBERG
make

Nachdem die Compilierung erfolgreich beendet wurde, liegt jedes der erzeugten Programme in einem Unterverzeichnis mit dem gleichen Namen wie das Programm selbst. Wenn sichergestellt ist, daß nicht bereits ein anderer NTP-Daemon läuft, kann der neu erzeugte Daemon gestartet werden. Wenn es sich um ein NTP-Paket mit der Version 4.x handelt, lautet der Befehl

ntpd/ntpd

Im Fall einer NTP-Version 3.x dagegen lautet der Befehl

xntpd/xntpd

Der Befehl ntpq -p kann verwendet werden, um die korrekte Funktionsweise zu überprüfen. Wenn alles wunschgemäß arbeitet, können die neu ausführbaren Dateien in das Zielverzeichnis kopiert werden, wo sie beim Start des Systems gefunden werden. Die Installation der Programme kann normalerweise geschehen durch Eingabe des Befehls

make install

Falls vorher bereits ein NTP-Paket installiert war, muss sichergestellt sein, dass die alten NTP-Programme gelöscht oder von den neuen Programmen überschrieben werden, so dass beim Systemstart nicht versehentlich der alte NTP-Daemon gestartet wird. Der neue Daemon muss in dem Verzeichnis liegen, wo die Strartup-Scripts ihn erwarten.

Besonders bei einem Versionssprung von NTP v3.x auf NTP v4.x sollte die geänderte Namensgebung berücksichtigt werden, etwa von xntpd nach ntpd.

Konfiguration mit Meinberg Funkuhr (Windows)

Auf Windows-Systemen werden die meisten Funkuhren von NTP noch nicht direkt unterstützt. Stattdessen kann der Treiber von Meinberg eingesetzt werden, um die Windows-Systemzeit zu synchronisieren. Der NTP-Service stellt dann lediglich die synchronisierte Windows-Systemzeit im Netzwerk bereit.

Wenn NTP für Windows mit Hilfe des GUI-Installers von der Meinberg NTP-Download-Seite installiert wird und das Setup-Programm das bereits installierte Treiberpaket findet, schlägt der Installer eine entsprechende NTP-Konfiguration mit dem Titel "Follow Meinberg Time Service" vor.

Für diese Konfiguration muss die Datei ntp.conf die folgenden Zeilen enthalten:

server 127.127.1.0            # local clock
fudge  127.127.1.0 stratum 0   # disciplined by radio clock

Da die Windows-Systemzeit von einer Funkuhr synchronisiert wird, kann in diesem Fall der Stratum-Wert der Local Clock hoch auf 0 gesetzt werden. Der NTP-Server ist dann als Stratum-1-Server im Netzwerk sichtbar.

Ebenso sollte kein driftfile angegeben werden. Wenn bereits eine Datei mit dem Namen ntp.drift auf dem Rechner existiert, sollte diese Datei gelöscht werden. Andernfalls könnte der NTP-Service versuchen, basierend auf dem Wert aus dem Driftfile die Drift der Systemzeit zu kompensieren. Damit würde der NTP-Service gegen den Funkuhr-Treiber arbeiten, wodurch nur eine schlechte Zeitsynchronisation erzielt werden kann.

Konfiguration ohne Funkuhr

Die Konfiguration der Computer ohne eigene Funkuhr ist sehr einfach. Für jeden Timeserver im Netzwerk, der als Referenzzeitquelle genutzt werden soll, muss die Datei ntp.conf eine server-Zeile mit der IP-Adresse oder dem Hostname des Gerätes enthalten. Dabei sollten Timeserver mit gutem Stratum-Wert angegeben werden, die auf kurzen Netzwerk-Wegen erreichbar sind.

Zusätzlich kann auch hier die Local Clock des Computers angegeben werden, die als Fallback-Reserve genutzt werden kann, wenn keine andere Referenzzeitquelle erreichbar sein sollte.

Da die Local Clock hier nicht durch ein anderes Programm synchronisiert wird, sollte sie auf einen relativ schlechten Stratum gesetzt werden, z.B. 12. Dadurch ist sichergestellt, dass Timeserver im Netz mit besserem Stratum bevorzugt werden:

server 127.127.1.0            # local clock
fudge 127.127.1.0 stratum 12  # not disciplined
  
server ntp_server_1 iburst
server ntp_server_2 iburst
server ...

Im Beispiel oben stehen ntp_server_1, ntp_server_2, usw, für den Hostname oder die IP-Adresse existierender Timeserver. Das Keyword iburst sorgt für eine schnelle Erstsynchronisierung beim Programmstart. Sehr alte NTP Versionen unterstützen das Keyword iburst nicht.

Zusätzliche Konfigurationsparameter

Im laufenden Betrieb ermittelt der NTP-Daemon, wie sehr die Systemzeit des Computers von der Referenzzeit wegdriftet. Der Daemon kann diesen ermittelten Wert in einer Datei speichern, von wo er ihn beim nächsten Start wieder lesen kann. Hierdurch wird die Dauer der Zeitsynchronisierung beim erneuten Start des Daemons verkürzt. Um diese Möglichkeit zu nutzen, muss der Name des Driftfiles in einer Zeile der Datei ntp.conf angegeben werden, z.B.:

 driftfile /etc/ntp.drift
 

Achtung: Wenn das NTP-Programm unter Windows zusammen mit der Meinberg-Treibersoftware arbeitet, sollte kein Driftfile angegeben werden. Siehe Abschnitt Konfiguration mit Meinberg Funkuhr (Windows).

Es gibt eine Anzahl weitere Optionen, die in der Konfigurationsdatei eingestellt werden können. Nähere Informationen dazu findet man in der NTP-Dokumentation.

Überprüfung des NTP-Status

Das Kommandozeilen-Programm ntpq kann dazu benutzt werden, den Status des NTP-Daemons auf dem eigenen Computer oder auch auf einem anderen Computer im Netzwerk zu überprüfen.

ntpq kann in einem interaktiven Modus oder im Batchbetrieb arbeiten. Im Batchbetrieb führt ntpq einen Befehl aus und kehrt dann zur Eingabeaufforderung zurück. Bei Aufruf des Programms mit dem Parameter -p ('peers') wird eine Tabelle mit Informationen über die verwendeten Referenzzeitquellen ausgegeben. Um den Status des NTP-Daemons des eigenen Computers anzugeben, wird einfach der Befehl

ntpq -p
verwendet. Man kann auch den Hostname oder die IP-Adresse eines Gerätes im Netzwerk angeben, um sich den Status des dort laufenden NTP-Daemons anzeigen zu lassen:
ntpq -p ntp_server_1, ntp_server_2, ...
Die Ausgabe des Programms sollte etwa so aussehen:

remote          refid     st    t   when  poll   reach     delay    offset    jitter
======================================================================================
LOCAL(0)        .LCL0.    12    l   11    64     1         0.000    0.000     0.977
*GENERIC(0)     .DCFa.    0     -   24    64     377       0.000    0.050     0.003
+172.16.3.103   .PPS.     1     u   13    64     1         0.701    0.228     0.977

Die Tabelle enthält je eine Zeile für jede in der Datei ntp.conf angegebene Referenzzeitquelle. Im Beispiel oben sind das 3 Zeitquellen: Die eigene Local Clock, eine DCF77-Funkuhr als refclock-0, und ein Timeserver im Netzwerk unter der IP-Adresse 172.16.3.103.

Wenn das erste Zeichen einer Zeile kein Leerzeichen ist, dann enthält es eine Kennung, wie der NTP-Daemon diese Zeitquelle bewertet. Direkt nach dem Start des Daemons enthalten alle Zeilen am Anfang ein Leerzeichen. Der NTP-Daemon benötigt mehrere Abfragezyklen (polling cycles), um die angegebenen Zeitquellen zu prüfen und eine davon als diejenige auszuwählen, auf die er sich synchronisiert.

Ein Stern * als erstes Zeichen einer Zeile kennzeichnet die Referenzzeitquelle, auf die sich der NTP-Daemon zur Zeit synchronisiert, das Pluszeichen + kennzeichnet qualitativ hochwertige Zeitquellen, die ebenfalls als Referenzzeitquelle in Frage kommen, wenn die aktuell genutzte Zeitquelle nicht mehr verfügbar sein sollte (candidates).

Die Spalte remote zeigt den (Pseudo-) Hostname oder die IP-Adresse der Referenzzeitquelle. Dabei bezeichnet z.B. LOCAL die Local Clock, GENERIC(0) das Device refclock-0 des Parse-Treibers. Die refid gibt den Typ der Referenzzeitquelle an, dabei bedeutet z.B. LOCAL oder LCL wiederum Local Clock, .DCFa. ist ein Standard-DCF77-Empfänger, und .PPS. bedeutet, dass die Synchronisierung über ein Hardware-PPS-Signal (Sekundenimpuls) erfolgt. Andere Kennungen sind möglich, abhängig von der Art der Referenzzeitquelle.

Die Spalte st zeigt die Stratum-Nummer der Referenzzeitquelle an. Im Beispiel oben hat die Local Clock den Stratum 12, der Timeserver mit der IP-Adresse 172.16.3.103 hat den Stratum 1, das beste, was über das Netzwerk zu sehen ist, und die Funkuhr hat Stratum 0, daher wird die Funkuhr als Referenzzeitquelle verwendet. Da die Funkuhr Stratum 0 hat, wird der eigenen NTP-Daemon von Clients im Netzwerk als Stratum-1 Timeserver gesehen.

Der Wert in der Spalte when zeigt die Anzahl der Sekunden seit dem letzten Polling-Zyklus an. Wenn dieser Wert den in der Spalte poll gezeigten Wert erreicht, führt der NTP-Daemon einen Zeitvergleich mit der entsprechenden Referenzzeitquelle durch und setzt den Wert für when wieder auf 0. Die Ergebnisse der Zeitvergleiche werden gefiltert und dienen als Maß für die Qualität und Erreichbarkeit einer Zeitquelle.

Die Spalte reach zeigt, ob die Referenzzeitquelle während der letzten Polling-Zyklen erreichbar war. Die Zahl ist ein 8-Bit-Register, dessen Wert historisch bedingt in oktaler Schreibweise angezeigt wird. Wenn der NTP-Daemon gerade gestartet ist, ist der reach-Wert für alle Zeitquellen 0. Nach jedem erfolgreichen Polling-Zyklus wird eine '1' von rechts in das Register hineingeschoben, so dass nach dem Start des Daemons nach jedem erfolgreichen Pollingzyklus nacheinander die Werte 0, 1, 3, 7, 17, 37, 77, 177, 377 angezeigt werden. 377 ist der höchstmögliche Wert, der aussagt, dass die letzten 8 Polling-Zyklen erfolgreich waren.

Erfolgreich bedeutet, dass Daten mit der Zeitquelle ausgetauscht werden konnten, und dass die Referenzzeitquelle selbst auch synchron zu ihrer eigenen Zeitquelle war. Im Fall einer Funkuhr bedeutet das konkret, dass der Polling-Versuch als nicht erfolgreich bewertet wird, wenn die Funkuhr nicht synchron zu ihrem Sender ist, z.B. weil das Antennenkabel abgezogen wurde, oder aber auch, wenn keine Daten empfangen werden können, weil z.B das serielle Kabel zu einer externen Uhr abgezogen wurde.

Der NTP-Daemon entscheidet erst nach mehreren erfolgreichen Polling-Zyklen, ob er eine Zeitquelle als Referenz für sich akzeptiert, die wie oben beschrieben durch einen '*' gekennzeichnet wird.

Die Spalten delay, offset und jitter zeigen einige Zeiten an, die aus den gefilterten Daten der Polling-Zyklen gewonnen wurden. In einigen Versionen von ntpq wird die letzte Spalte mit disp (dispersion) bezeichnet statt mit jitter. Alle Werte sind in Millisekunden angegeben. Der Wert delay ist die Laufzeit zwischen der Anfrage des NTP-Daemons bis zum Eintreffen der Antwort. Der Wert offset zeigt die Zeitdifferenz zwischen der Referenzzeit und der eigenen Systemzeit. Der Wert jitter gibt die Größenordnung der Schwankungen zwischen einzelnen Zeitvergleichen an.