Gibt es einen Mechanismus, der ein Linux-System online mit NTP und offline mit einer vorhersehbar driftenden RTC synchronisiert?
Wir betreiben Remote- "Kollektoren": eingebettete Linux-Systeme, die Sensordaten erfassen und zeitstempeln. Wir brauchen ihre Taktfehler, um einigermaßen klein zu bleiben, sagen wir unter 5 Sekunden. Normalerweise verwenden wir NTP, um ihre Uhren zu synchronisieren, und das funktioniert einwandfrei - solange das System online ist.
Das Problem ist, dass einige Sammler sehr schlechte Uplinks haben, die für Stunden, Tage oder sogar Wochen ausfallen können. Das stoppt die lokale Datenerfassung nicht, aber ohne NTP driftet die Linux-Systemuhr schlecht und ziemlich unvorhersehbar.
OTOH, die RTC der Hardware driftet ebenfalls stark, jedoch mit konstanter Geschwindigkeit. Die RTC-Driftrate variiert von Karte zu Karte, ist jedoch pro Karte konstant und kann gemessen werden.
Ich denke, wir brauchen einen Mechanismus, der Folgendes bewirkt:
- Messen Sie die RTC-Driftrate einer Karte vor ihrer Bereitstellung
- Passen Sie die Systemzeit nach Möglichkeit regelmäßig / regelmäßig über NTP an
- Passen Sie die Systemzeit regelmäßig von RTC aus an, wenn NTP nicht verfügbar ist. Berücksichtigen Sie die bekannte RTC-Driftrate.
- Optional: Messen und notieren Sie die RTC-Driftrate, die online ausgeführt wird (1).
Mit 'Mechanismus' meine ich eine gut gewartete, dokumentierte Software und / oder Konfiguration, die die beiden Zustände "online" vs. "offline" verarbeiten kann. Stellen Sie sicher, dass die Systemuhr mit der richtigen Zeitquelle synchronisiert ist (ntp vs. rtc), Zustandsänderung erkennen und die RTC-Drift korrigieren. Es spielt keine Rolle, ob es als spezielle ntpd-Konfiguration / Plugin, als separater Daemon, als Cron-Job oder sonst implementiert ist.
Ich habe mir Chrony angesehen , aber laut Dokumentation versucht es, die Drift der Systemuhr vorherzusagen , die in unserem Fall weitaus unvorhersehbarer driftet als die RTC. Chrony scheint die RTC nur zu verwenden, um die Zeit über Neustarts hinweg zu halten.
(1) Hinweis ntpd aktiviert den '11 -Minutenmodus 'des Kernels (Aktualisierung des RTC von der Systemuhr alle 11 Minuten). Mit aktuellen Kerneln und ntpd scheint es keine Möglichkeit zu geben, den 11-Minuten-Modus zu verhindern. Daher gehen alle RTC-Driftinformationen verloren, während ntpd ausgeführt wird (thx @billthor).
Updates / Änderungen:
- Wir erwägen, eine externe Funkuhr für das MSF- oder DCF77-Signal (mit Sitz in Europa) über USB oder seriell hinzuzufügen. Wir halten die Hardware aber lieber schlank.
- Unsere Sammler befinden sich drinnen, oft im Keller. Das Hinzufügen von GPS-Uhren hilft also nicht.
- Wir verwenden Debian 7. Das bedeutet hwclock von util-linux-2.20.1, ntpdate-4.2.6p5, ntpd von ntp-4.2.6.p5, chrony-1.24 (möglicherweise 1.30).
- Beachten Sie, dass unser Problem ist nicht , dass wir nicht wissen , wie zu verwenden
ntpdate(8)
,hwclock(8)
,date(1)
etc. Bitte beachten Sie den zusätzlichen Abschnitt in Kursivschrift über das, was ich meine mit ‚Mechanismus‘. - Fußnote zum '11 -Minutenmodus 'hinzugefügt
- Hier ist eine sehr interessante Diskussion über Offline-Sync und RTC-Drift
Antworten:
Ihre Situation ist ungewöhnlich und ich wäre überrascht, wenn jemand eine standardbasierte
ntpd
Konfiguration entwickelt, um das zu tun, was Sie wollen. Das heißt, ich mag es überrascht zu sein, und es passiert ziemlich oft um diese Teile herum.Aber bis jemand eine bessere Idee hat, haben Sie einen
crontab
solchen Eintrag in Betracht gezogen ?IE, versuchen Sie alle fünf Minuten, die Uhr über zu synchronisieren
ntpdate
, und wenn (und nur wenn) dies fehlschlägt, passen Sie die Hardware-Uhr für die Drift entsprechend der/etc/adjtime
Datei an (deren Format detailliert beschriebenman hwclock
ist und deren erste Zeile Sie mit Ihrem Wissen entsprechend ausgefüllt haben Stellen Sie dann die Systemuhr von der RTC aus ein.Beachten Sie, dass es als höflich angesehen wird, mit dem Pool zu arbeiten und Server im Verhältnis zu Ihrer Nutzung zurückzuzahlen, wenn Sie sich für eine Lösung wie diese entscheiden und eine erhebliche Anzahl dieser Systeme bereitstellen. Weitere Informationen finden Sie unter http://www.pool.ntp.org/en/vendors.html .
quelle
/etc/adjtime
undhwclock --adjust
?NTP verfügt bereits über Mechanismen, um festzustellen, ob es online oder offline ist, und wechselt bei Bedarf zu Quellen mit niedrigerer Priorität. Es ist sehr einfach, den Reichweitenwert zu überprüfen, um eine alternative Quelle auszulösen, aber ich würde mich an NTP halten. Wie nachstehend erläutert, ist es wahrscheinlich schwierig, die RTC-Drift zu überwachen und zu korrigieren.
In Tagen vor dem Internet habe ich ein Programm verwendet, das eine Datenquelle anruft und die Uhr synchronisiert. Möglicherweise sind noch Dienste verfügbar, die eine Zeitquelle über ein Modem bereitstellen. Dies würde den Zugang zu einer Telefonleitung erfordern.
Es sind Probleme mit der lokalen Uhr bekannt, die nicht für die RTC gelten. Einige Probleme sind in der Liste der bekannten NTP-Betriebssystemprobleme dokumentiert . Diese können für Ihre Uhrendrift verantwortlich sein. Das Lösen dieser Probleme kann Ihr Problem lösen. In Abwesenheit fehlender Ticks habe ich festgestellt, dass die lokale (System-) Zeitquelle möglicherweise sehr stabil ist.
Möglicherweise können Sie den Dumb Clock-Treiber (33) mit einem Programm verwenden, das die entsprechende RTC-Zeit auf das Gerät / dev / dummclockX schreibt.
Es gibt eine Reihe anderer Treiber, die auf Funkuhren basieren. Einige von ihnen verwenden Kurzwellendienste wie WWV und CHU, die möglicherweise in Umgebungen funktionieren, in denen keine GPS-Signale verfügbar sind. Für Europa würde diese Liste BBC, TDF, RBU und RMW enthalten.
Pavel Krejci hat ebenfalls einen RTC-Treiber geschrieben, der jedoch nicht in die offiziellen Treiber aufgenommen zu sein scheint. Dies funktioniert möglicherweise mit der PPS-Typ-Synchronisation.
Es sollte möglich sein, die RTC-Drift vor dem Einsatz zu messen. Sie müssen jedoch sicherstellen, dass die RTC nicht automatisch aktualisiert wird. Wenn die Systemuhr mit der Funktion adjtimex aktualisiert wird, kann die RTC alle 11 Minuten aktualisiert werden.
NTP aktualisiert die Uhr, wenn eine Verbindung besteht. Normalerweise weigert sich NTP, große Anpassungen an der Systemuhr vorzunehmen. Es gibt Optionen zum Einstellen, wie weit die Uhr eingestellt werden kann.
Ich habe oben Optionen für die Verwendung der RTC vorgeschlagen. Eine Funkuhr ist möglicherweise besser geeignet als eine GPS-Uhr.
Das Messen der Drift ohne eine zuverlässige Zeitquelle zum Vergleich ist wahrscheinlich eine vergebliche Anstrengung. Wenn die Ortszeit instabil ist, können Sie sie nicht zur Überwachung der RTC verwenden und umgekehrt. Das Messen der Drift bei verbundenem NTP funktioniert nicht, wenn der Kernel die RTC alle 11 Minuten aktualisiert. Die von mir verwendeten RTCs haben eine Auflösung von einer Sekunde, sodass sie erheblich driften müssten, um zuverlässig messbar zu sein.
quelle
local
Treiber verwendet nur die Serveruhr, von der Sie Abweichungen melden. Ich werde meine Antwort aktualisieren.