Zeitsynchronisation unter Linux mit DCF77 Funkuhr-Modul und ntpd
Linux Systeme können über das Network Time Protocol (NTP) und den NTP-Dienst ntpd Zeitinformationen über das Internet beziehen und damit die lokale Systemzeit laufend aktuell halten. Hat ein System keinen Netzwerkzugriff, kann eine PC-Funkuhr mit USB-Schnittstelle zur Zeitsynchronisation verwendet werden. In diesem Artikel zeigen wir die Konfiguration einer solchen Funkuhr am Beispiel der Expert Mouse Clock USB II 0107 unter Ubuntu 16.04 mit Linux Kernel 4.4 auf einem LES v3.
Hardware Installation und Ausrichtung der Antenne
Das Funkuhr-Modul wird direkt mit einem USB-Port des Linux Systems verbunden. Sobald das Modul Strom über die USB Schnittstelle erhält, beginnt es unabhängig vom Rechner die Bits des DCF77 Funksignals[1] auf Langwelle abzuholen (77,5 kHz).
Für einen bestmöglichen Empfang sind folgende Dinge zu beachten:
- Elektrosmog wie nahestehende Netzteile/Röhrenmonitore/Elektromotoren, aber auch andere elektrische Geräte oder Metallplatten stören das Funk-/Langwellen Signal teilweise erheblich. Das Funkuhr-Modul sollte daher nicht in der Nähe solcher Geräte sein.
- Die räumliche Ausrichtung des Moduls zum Sender ist sehr wichtig. Das Modul empfängt über die eingebaute Ferritantenne langwellige Signale von der Sendeanlage Mainflingen.[2] Eine horizontale und rechtwinklige Ausrichtung zum Senderort sehr empfehlenswert.[3] Damit wird am Modul die bestmögliche Signalstärke erreicht.
- Status des Betriebs-LED: Blinkt das Betriebs-LED auf dem Modul unregelmäßig schnell, ist die Funkverbindung gestört. In diesem Fall ist keine Zeitsynchronisation möglich. Im ordnungsgemäßen Betrieb blinkt die LED langsam im Sekundentakt abwechselnd rot und grün.
Zeitserver NTP Daemon einrichten
Der ntp Daemon unterstützt zahlreiche Funkuhr-Module, darunter auch das im Test eingesetzte Expert Mouse Clock USB II 0107 Modul.
Der NTP Deamon wird unter Ubuntu via apt installiert:
sudo apt install ntp
Damit das Modul vom NTP Deamon angesprochen wird, muss die Konfigurationsdatei /etc/ntp.conf folgendermaßen angepasst werden (z.B. via nano /etc/ntp.conf):
driftfile /var/lib/ntp/ntp.drift server 127.127.8.0 mode 19 prefer logfile /var/log/ntp logconfig =all
Bei der vermeintliche Netzwerkadresse 127.127.8.0 handelt sich nicht um eine IP-Adresse, sondern um eine hinterlegte PseudoIP. Der erste Teil "127.127.8" verweist auf den generischen Referenztreiber.[4] Der hintere Teil ".0" bezieht sich auf das Gerät, unter der das Funkuhr-Modul angesprochen wird (/dev/refclock-0).
Udev Regel einrichten
Um für das Funkuhr-Modul beim Systemstart die Gerätedatei /dev/refclock-0 automatisch zu erstellen, ist eine udev Regel erforderlich. Zum Einrichten der Regel ist die USB ProductID erforderlich, die mittels lsub abgefragt werden kann:
tk@testsystem:~$ lsusb [...] Bus 001 Device 004: ID 0403:e88a Future Technology Devices International, Ltd Expert mouseCLOCK USB II [...] tk@testsystem:~$
Nun kann im im Ordner /etc/udev/rules.d/ die entsprechende Regel (z.B. via sudo nano /etc/udev/rules.d/05-DCF77.rules) mit folgendem Inhalt angelegt werden:
KERNEL=="ttyUSB*", ATTRS{idProduct}=="e88a", SYMLINK+="refclock-0"
Dadurch wird für das USB Gerät mit der ProductID e88a ein symbolischer Link /dev/refclock-0 erstellt.
Durch das Aufrufen von sudo udevadm trigger ist der Link dann vorhanden:
$ ls /dev/r* /dev/random /dev/refclock-0 /dev/rfkill /dev/rtc /dev/rtc0
AppArmor konfigurieren
Damit der NTP Daemon auf die /dev/refclock-0 gebundene serielle USB TTY Schnittstelle zugreifen darf, muss AppArmor entsprechend konfiguriert werden.
Mittels sudo nano /etc/apparmor.d/tunables/ntpd ist folgender Eintrag zu setzen (andere Devices sind auzukommentieren):
@{NTPD_DEVICE}="/dev/ttyUSB*"
Anschließend empfiehlt es sich, einen Reboot des Systems durchzuführen, um die korrekte Funktionsweise nach einem Neustart zu überprüfen.
Überprüfung der Funktion des DCF77 Moduls
Mit folgendem Kommando kann die Funktion des Moduls überprüft werden:
ntpq -c cv -c rv
Beispielausgabe nach kurzer Laufzeit:
associd=0 status=0020 2 events, clk_unspec, device="RAW DCF77 CODE (Expert mouseCLOCK USB v2.0)", timecode="---#-#-#-#####---D--S12--1--P1----2p1--8-2-241--8----81---P", poll=4, noreply=0, badformat=1, baddata=0, fudgetime1=425.000, stratum=0, refid=DCFa, flags=0, refclock_time="df5a4d5e.00000000 Sat, Sep 29 2018 19:13:34.000", refclock_status="DST; TIME CODE; (LEAP INDICATION; CALLBIT)", refclock_format="RAW DCF77 Timecode", refclock_states="*NOMINAL: 00:01:35 (42.98%); BAD FORMAT: 00:02:06 (57.01%); running time: 00:03:41" associd=0 status=c218 leap_alarm, sync_lf_radio, 1 event, no_sys_peer, version="ntpd 4.2.8p4@1.3265-o Fri Jul 6 20:10:51 UTC 2018 (1)", processor="x86_64", system="Linux/4.4.0-135-generic", leap=11, stratum=1, precision=-22, rootdelay=0.000, rootdisp=453.861, refid=DCFa, reftime=df5a4d41.5497ee34 Sat, Sep 29 2018 21:13:05.330, clock=df5a4d5f.07b18724 Sat, Sep 29 2018 21:13:35.030, peer=11255, tc=6, mintc=3, offset=0.000000, frequency=0.000, sys_jitter=8.319076, clk_jitter=5.563, clk_wander=0.000
Im obigen Beispiel braucht das Modul in schlechter Empfangslage mehrere Minuten um eine vollständige Zeitsynchronisation durchführen zu können. Erkennbar ist die schlechte Empfangslage in folgender Zeile:
refclock_states="*NOMINAL: 00:01:35 (42.98%); BAD FORMAT: 00:02:06 (57.01%); running time: 00:03:41"
Der folgende Screenshot zeigt die Ausgabe mit optimaler Ausrichtung der integrierten Ferritantenne (NOMINAL 99,32%, BAD 0,67% bei ca. 13 Stunden Laufzeit):
Einzelnachweise
- ↑ DCF77 (de.wikipedia.org)
- ↑ Sendeanlagen in Mainflingen (de.wikipedia.org)
- ↑ Ausbreitung DCF77 Signalt (Datei:Dcf weite.jpg) (de.wikipedia.org)
- ↑ Generic Reference Driver (doc.ntp.org)
Autor: Wilfried Seifert Wilfried Seifert, tätig in der Abteilung Systems Engineering bei Thomas-Krenn, ist in seinem Arbeitsbereich für die System-/Prototypenentwicklung sowie Softwaredeployment / Rollout zuständig. LPIC 3 zertifiziert, beschäftigt sich u.a. mit Aufbau / Programmierung Embedded Systemen.
|