Raspberry Pi Stratum 1 NTP Server

In Netzwerken ist der Einsatz eines NTP- Servers zur Zeitsynchronisation unabdingbar. Besonders bei der Aufzeichnung und Korrellation von Ereignissen muss eine verlässliche Zeitquelle vorhanden sein. Da es sich bei NTP um ein hierarchisches System handelt, das UDP als Übertragungsprotokoll verwendet, ist ein Hauptaugenmerk auf einen möglichst geringen Stratum- Level und ein fälschungssicheres Signal der Quelle zu legen.

Üblicherweise werden meist mehrere Zeitserver im Internet zum Abgleich verwendet. Zur Erhöhung der Genauigkeit und der Sicherheit sollte man eine weitere unabhängige Quelle einbinden und die Internet-Systeme lediglich als Backup verwenden. Hier bietet sich das GPS System an. Jeder der aktuell 24 aktiven Satelliten ist mit mehreren Cäsium und Rubidium Atomuhren ausgestattet, die für eine hohe Genauigkeit der Zeitsignale Sorge tragen. Wie man diese Signale im Netzwerk unter Verwendung eines Raspberry Pi als NTP Zeitquelle nutzbar machen kann ist Gegenstand dieses Artikels.

Vorbereitung der Hard- und Software

Zum Einsatz kommt bei mir ein Raspberry Pi 2 auf dessen SD-Card die Raspbian Version 9.6 (stretch) installiert wird (2018-11-13-raspbian-stretch), sowie ein GPS- Empfänger mit NEO-7M Chipsatz, der ein PPS Signal bereitstellt und einen externen Antennenanschluss besitzt.

Abhängig vom verwendeten Empfänger muss dieser mit dem Raspberry verbunden werden. Da der o.g. Empfänger seine GPS Daten auch seriell zur Verfügung stellen kann, wurde er über die RxD/TxD Anschlüsse und der PPS Ausgang mit dem GPIO18 des Raspberry verbunden. Die Spannungsversorgung des Empfängermoduls kann ebenfalls vom Raspberry bezogen werden.

Nach dem Aufbau der Hardware und der Grundinstallation des Betriebssystems erfolgt die Anpassung.

1. Netzwerkparameter und Hostname festlegen
2. Location, Zeitzone und Tastaturlayout über raspi-config anpassen
3. Ausgabe von Shell Nachrichten über die serielle Schnittstelle in raspi-config deaktivieren

Weiter geht es mit den Vorbereitungen für das PPS Signal. Hierzu muss in der Datei /boot/config.txt folgende Zeile hinzugefügt werden:

dtoverlay=pps-gpio,gpiopin=18

Um diese Änderung zu aktivieren ist nun ein Neustart notwendig.


Installation und Konfiguration der Software

Grundsätzlich sollte das System vor der Installation von Software aktualisiert werden. Dies erfolgt über die bekannte Kombination aus

apt update
und
apt upgrade

Nachdem nun die installierten Pakete und die Paketliste aktualisiert sind, kann es mit der eigentlichen Softwareinstallation losgehen.

Software für den GPS Empfänger

Neben der Software für den GPS Empfänger selbst wird in diesem Schritt auch gleich die Schnittstelle für das PPS System mit installiert:

apt install gpsd
apt install gps-utils
apt install pps-tools

Die Konfiguration des gpsd erfolgt in der Datei /etc/default/gpsd. Diese sollte folgende Zeilen enthalten:

START_DAEMON="true"
USBAUTO="false"
DEVICES="/dev/ttyAMA0"
GPSD_OPTIONS="-n"

Zur Aktivierung der PPS Funktionalität muss die Zeile

pps-gpio

zur Datei /etc/modules hinzugefügt werden.

Nach einem Neustart des Systems sollten die PPS Module geladen sein:

lsmod | grep pps
pps_ldisc               2413  2
pps_gpio                3089  0
pps_core                8606  3 pps_gpio,pps_ldisc

Zudem sollte das PPS Device gefunden werden was besagt, dass der Kernel auch eine Unterstützung dafür
eingebaut hat:

dmesg|grep pps
[    4.414249] pps_core: LinuxPPS API ver. 1 registered
[    4.422411] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    4.503273] pps pps0: new PPS source pps@12.-1
[    4.511611] pps pps0: Registered IRQ 163 as PPS source
[ 6844.328489] pps_ldisc: PPS line discipline registered
[ 6844.332769] pps pps1: new PPS source ttyAMA0
[ 6844.332878] pps pps1: source "/dev/ttyAMA0" added

Ob das PPS Device ordnungsgemäß funktioniert kann man mit dem Befehl

ppstest /dev/pps0

testen:

trying PPS source "/dev/pps0"
found PPS source "/dev/pps0"
ok, found 1 source(s), now start fetching data...
source 0 - assert 1549207946.001432222, sequence: 16948 - clear  0.000000000, sequence: 0
source 0 - assert 1549207947.001432641, sequence: 16949 - clear  0.000000000, sequence: 0
source 0 - assert 1549207948.001433060, sequence: 16950 - clear  0.000000000, sequence: 0

Abgebrochen wird die Ausgabe mit STRG+C.

Das GPS sollte nun funktionsbereit sein. Kontrollieren kann man das mittels des Befehls

cgps -s

der eine Ausgabe ähnlich der folgenden zeigen sollte:
cgps aus den GPS Tools
Wichtig ist hierbei, dass der Status "3D FIX" anzeigt, was besagt, dass der GPS Empfänger ein sogenanntes Lock der Satelliten erreicht hat.


NTP

Die Installation von ntp kann, im Gegensatz zu früheren Raspbian Versionen, bei denen ntp aus den Sources kompiliert werden musste, direkt aus den Repositories erfolgen:

apt install ntp

Was nun noch fehlt ist die Anpassung der Konfigurationsdatei.

/etc/ntp.conf

driftfile /var/lib/ntp/ntp.drift

statsdir /var/log/ntpstats/
statistics loopstats peerstats clockstats

filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable

server 0.debian.pool.ntp.org iburst
server 1.debian.pool.ntp.org iburst
server 2.debian.pool.ntp.org iburst
server 3.debian.pool.ntp.org iburst

restrict -4 default kod notrap nomodify nopeer noquery limited
restrict -6 default kod notrap nomodify nopeer noquery limited

restrict 127.0.0.1
restrict ::1

restrict source notrap nomodify noquery

tinker step 0.4 stepback 0.4 stepfwd 0.4

server 127.127.22.0 minpoll 4 maxpoll 4
fudge 127.127.22.0 refid PPS stratum 0 flag3 1 flag4 1

server 127.127.28.0 minpoll 4 maxpoll 4 prefer
fudge 127.127.28.0 time1 +0.130 refid GPS stratum 2
Nach einem Neustart des ntp Dienstes sollte nach dem Befehl

ntpq -c peers -c rv

eine Ausgabe ähnlich der folgenden sichtbar werden:
NTP Status
Das war es auch schon. Der Raspberry Pi kann nun im Netzwerk als Stratum 1 Zeitserver verwendet werden.

Ach ja...

und das ganze passt dann in ein herkömmliches Gehäuse für einen Raspberry Pi.