Eigener GPS-NTP-Server mit dem Raspberry

rbpsatIn vielerlei Hinsicht ist es wichtig,dass Netzwerkgeräte und Server über die gleiche Uhrzeit verfügen. Aufgrund vieler Umstände kommt es immer wieder innerhalb kürzester Zeit vor, dass die Uhrzeiten der einzelnen Teilnehmer “auseinanderlaufen”. Für den Zeitabgleich existiert das Network-Time-Protocol, dass wir uns in diesem Beitrag für den Zeitabgleich zu Nutze machen. Unser NTP-Server, welchen wir Schritt für Schritt einrichten, bezieht seine Uhrzeit via GPS und stellt diese im Netzwerk zur Verfügung.

 

 

 

100Eine kleine Anmerkung in eigener Sache:
Klenzel.de feiert seinen 100. Beitrag.
Mit Erscheinung dieses Beitrages haben wir nun eine dreistellige Anzahl erreicht.

Mehr dazu im Jubiläums-Blogbeitrag.

 

 

Bluetooth überprüfen

Falls wir planen, unseren GPS-Empfänger via Bluetooth anzubinden, bereiten wir unser System auf die Verwendung eines Bluetooth-USB-Sticks vor, wie es in diesem Beitrag ausführlich beschrieben wurde. Wir überprüfen anschließend den Status mit

/etc/init.d/bluetooth status

und erhalten im Erfolgsfall folgende Ansicht:

1

 

 

USB-GPS-Maus

Falls wir eine USB-GPS-Maus verwenden, schließen wir diese nun an unserem Raspberry an und prüfen mit

dmesg

als welches Gerät die GPS-Maus in unserem System eingebunden wurde. Standardmäßig entspricht dies dem Gerät “/dev/ttyUSB0“. Das merken wir uns für die spätere Konfiguration.

 

Bluetooth-GPS-Maus

Setzen wir eine Bluetooth-GPS-Maus ein, müssen wir diese zunächst finden, konfigurieren und verbinden. Falls wir die MAC-Adresse unserer GPS-Maus nicht auswendig kennen, ermitteln wir diese mit

hcitool scan

 

Dieses Tool scannt die erreichbare Umgebung nach aktiven Bluetooth-Komponenten und listet diese anschließend mitsamt der MAC-Adressen auf.

2

 

Anschließend binden wir, zunächst manuell, die GPS-Maus als Gerät in unser System ein:

rfcomm bind /dev/rfcomm0 00:02:78:AA:BB:CC

 

Damit die Einbindung künftig automatisch beim Systemstart erfolgt, erstellen wir für die GPS-Maus einen neuen Dienst (ab Raspbian Wheezy mit systemd), indem wir die Datei “/etc/systemd/system/rfcomm.service” mit folgendem Inhalt erstellen:

[Unit]
Description=RFCOMM service
After=bluetooth.service
Requires=bluetooth.service

[Service]
ExecStart=/usr/bin/rfcomm bind /dev/rfcomm0 00:02:78:AA:BB:CC
Restart=on-failure
RestartSec=5s
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Dabei ist natürlich die MAC-Adresse an das eigene Gerät anzupassen.

 

Anschließend aktivieren wir den neuen Dienst mit

systemctl restart rfcomm.service

und prüfen mit einem Neustart, ob die GPS-Maus beim Systemstart automatisch unter “/dev/rfcomm0” eingebunden wird:

rfcomm -a && ls -al /dev/rfcomm0

 

Die Ausgabe sollte in etwa so aussehen:

rfcomm0: 00:02:78:AA:BB:CC channel 1 closed
crw-rw---- 1 root dialout 216, 0 Mai 31 08:32 /dev/rfcomm0

 

 

GPS-Daten prüfen

Da wir das Gerät zuvor manuell ins System eingebunden haben bzw. sowieso vorhanden ist wenn eine USB-GPS-Maus eingesetzt wird, können wir bereits jetzt prüfen, ob die Verbindung hergestellt werden kann und die GPS-Maus Daten ausgibt. Dazu geben wir einfach den Inhalt der entsprechenden Gerätedatei aus mit

cat /dev/rfcomm0

…für eine Bluetooth-GPS-Maus bzw. mit…

cat /dev/ttyUSB0

…für einen via USB angeschlossenen GPS-Empfänger.

 

9

Wie wir an dieser Ausgabe sehen, meldet unser GPS-Empfänger bereits fleißig (NMEA-)Daten. Diese Ausgabe können wir mit der Tastenkombination “STRG+C” abbrechen.

 

GPS-Zeit auslesen und zur Verfügung stellen

Nun ist es an der Zeit, unsere GPS-Daten, die auch die aktuelle Uhrzeit enthalten, sinnvoll einzusetzen. Dazu installieren wir einen Dienst, der unseren künftigen NTP-Server mit der Uhrzeit aus den GPS-Daten versorgt:

apt-get install gpsd gpsd-clients

 

Nach der Installation ändern wir die Startparameter des GPSd-Dienstes. Dazu editieren wir die Datei “/etc/default/gpsd” und passen den Inhalt wie folgt an:

# Default settings for the gpsd init script and the hotplug wrapper.

# Start the gpsd daemon automatically at boot time
START_DAEMON="true"

# Use USB hotplugging to add new USB devices automatically to the daemon
USBAUTO="false"

# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
DEVICES="/dev/rfcomm0"

# Other options you want to pass to gpsd
GPSD_OPTIONS="-b -n"

Zur Erklärung:

Zunächst geben wir an, dass der Dienst beim Systemstart automatisch geladen werden soll; eine automatische Konfiguration von GPS-Empfänger lehnen wir ab.

Zudem geben wir die Gerätedatei unseres GPS-Empfängers an, die wir in den ersten Schritten dieses Beitrags ermittelt haben.

Wir geben die zusätzliche Startoption “-n” an. Mit dieser Option wird auf keinen bestimmten Client gewartet, wenn die Zeit vom GPS-Empfänger ausgelesen werden soll. Verwenden wir eine Bluetooth-GPS-Maus, geben wir zusätzlich die Option “-b” an die besagt, dass eine nur lesende Verbindung zu einem Bluetooth-Gerät hergestellt wird.

Nach dem Bearbeiten und Speichern der Datei sollte der Dienst “gpsd” mit

systemctl restart gpsd.service

neu gestartet werden und danach können wir mit

cgps

unsere GPS-Daten in formatierter Form anzeigen lassen.

8

 

Zeitserver installieren

Der Dienst “gpsd” stellt nun fortlaufend die Uhrzeit aus den GPS-Daten zur Verfügung. Nun installieren und konfigurieren wir den eigentlichen Zeitserver, der sich dieser Daten bedient. Die Installation führen wir wie gewohnt mit unserem Paketmanager durch:

apt-get install ntp ntpdate

 

Vor dem Start des NTP-Dienstes passen wir die Konfiguration unseren Bedürfnissen an. Dazu editieren wir die Datei “/etc/ntp.conf” und fügen am Ende folgende Zeitquellen ein:

server 127.127.28.0 minpoll 4
fudge 127.127.28.0 time1 0.183 refid NMEA
server 127.127.28.1 minpoll 4 prefer
fudge 127.127.28.1 refid PPS

 

Da die IP-Adressen stets auf den eigenen Rechner (localhost) verweisen, müssen diese nicht angepasst werden und sind für jede Installation passend.

Wir verbleiben in dieser Konfigurationsdatei und erlauben nun den Zugriff auf unseren Zeitdienst. Dazu bewegen wir uns zum folgenden Bereich:

# Clients from this (example!) subnet have unlimited access, but only if
# cryptographically authenticated.

und fügen unter der auskommentierten Zeile

#restrict 192.168.123.0 mask 255.255.255.0 notrust

eine weitere Zeile ein, mit der wir den Zeitabgleich für unser Netzwerk “192.168.1.0/24” freigeben:

restrict 192.168.1.0 mask 255.255.255.0 nomodify

 

Als letzten Schritt vor dem Start des NTP-Dienstes sorgen wir für einen manuellen Zeitabgleich für den Fall, dass unsere Systemzeit zu stark von der GPS-Zeit abweicht.

ntpdate -u ptbtime1.ptb.de

 

Jetzt können wir unseren Zeitserver mit

/etc/init.d/ntp start

starten.

 

Wir prüfen, ob sich unser NTP-Server der GPS-Zeit bedient mit:

watch -n1 ntpq -p

 

Die Ausgabe zeigt, wenn alle bisherigen Schritte erfolgreich verlaufen sind, dass der NTP-Server seine Zeit via GPS (mit dem Protokoll NMEA) bezieht und unsere Systemzeit rund drei Millisekunden abweicht:

10

Diese Anzeige kann mit der Tastenkombination “STRG+C” abgebrochen werden.

 

Einrichtung auf den Clients

Damit unsere Clients nun die Uhrzeit von unserem NTP-Server beziehen können, installieren wir das Paket “ntp” mittels

apt-get install ntp

 

Anschließend tragen wir die IP unseres eigenen NTP-Servers (also die des Raspberrys, in diesem Beispiel 192.168.1.127) in die NTP-Konfigurationsdatei “/etc/ntp/ntp.conf” ein und entfernen die während der Installation vorgegebenen Server:

server 192.168.1.127 iburst

 

Vor dem Start des NTP-Dienstes führen wir auch hier zunächst einen manuellen Abgleich durch. Dabei geben wir den Schalter “-g” an, damit auch Zeitdifferenzen von über 1000 Sekunden korrigiert werden.

ntpd -q -g

 

Nun können wir den NTP-Dienst auf unserem Client starten:

/etc/init.d/ntp start

 

Verfügt unser Linux-Client im Gegensatz zu einem Raspberry über eine Hardware-Uhr, kann diese mit

hwclock --systohc

an die Systemzeit angeglichen werden.

 

Letztendlich prüfen wir unser Vorgehen mit

watch -n1 ntpq -p

 

Unser Client sollte nun die Zeit von unserem NTP-Server beziehen, der wiederum sein “Wissen” aus den NMEA-Daten bezieht.

11

Diese Anzeige kann mit der Tastenkombination “STRG+C” abgebrochen werden.