Uhr online mit NTP und offline mit RTC synchronisieren?

11

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
Nils Toedtmann
quelle
So wie ich es verstehe, können Sie mit einer Kombination aus ntpd und hwclock bereits all diese Dinge tun.
Roy
@ Roy Sicher. Die Frage ist: Wie kann man ntp (d) und RTC (hwclock) kohärent kombinieren, um maximale Genauigkeit zu erreichen?
Nils Toedtmann
Ich verstehe, dass die Systemuhr mehr driftet als RTC. Ich bin neugierig, was Sie in Bezug auf die Art und Wirksamkeit der Verwaltung der Systemdrift durch Chrony als inakzeptabel empfunden haben. Wie ist die Chronik für Sie gescheitert?
dfc
@dfc chrony ist bei uns nicht gescheitert. Wir haben es noch nicht ausprobiert, da es anscheinend nicht die RTC verwendet, um die Zeit in Offline-Perioden zu halten, was meiner Meinung nach die Genauigkeit in unserem Anwendungsfall erhöhen würde. Wir werden chrony testen, wenn keine anderen vielversprechenderen Methoden vorgeschlagen werden.
Nils Toedtmann
Ich denke, Sie sollten sich mit Chronik befassen. Es scheint respektvoll, dass Sie eine gute Option aufgrund einer Vermutung ablehnen. Meiner Meinung nach ist es rückwärts, die Chronik zu untersuchen, wenn kein RTC-ntpd gefunden wird. Es scheint am einfachsten zu sein, zu sehen, ob die Chronik Ihren Bedürfnissen entspricht, und wenn nicht, dann gehen Sie dieses Kaninchenloch hinunter
dfc

Antworten:

4

Ihre Situation ist ungewöhnlich und ich wäre überrascht, wenn jemand eine standardbasierte ntpdKonfiguration 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 crontabsolchen Eintrag in Betracht gezogen ?

*/5 * * * *   ntpdate 0.pool.ntp.org || ( hwclock --adjust; hwclock --hctosys )

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/adjtimeDatei an (deren Format detailliert beschrieben man hwclockist 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 .

MadHatter
quelle
Sie haben die Grundidee verstanden :-) Aber es zählt (noch) nicht als Antwort, da es die (konstante, aber signifikante) RTC-Drift nicht berücksichtigt. Können wir es verbessern, zB nutzen /etc/adjtimeund hwclock --adjust?
Nils Toedtmann
Ja; siehe oben.
MadHatter
Dies ist die Art von Lösung, an die ich gedacht habe, als ich meinen vorherigen Kommentar geschrieben habe. Wenn die Systemuhr derzeit über ntpd synchronisiert ist, können Sie mit hwclock eine ziemlich genaue Driftrate für die RTC messen und einstellen.
Roy
Leider nicht, siehe Kommentare zu ntpd & '11 -minute mode '
Nils Toedtmann
-1

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.

BillThor
quelle
Ich verstehe nicht, wie das mit meiner Frage zusammenhängt. Ich glaube nicht, dass mein Problem ein Mangel an Treibern ist ... oder?
Nils Toedtmann
@NilsToedtmann Soweit ich feststellen kann, gibt es keinen offiziellen Fahrer für die RTC. Ich glaube, der localTreiber verwendet nur die Serveruhr, von der Sie Abweichungen melden. Ich werde meine Antwort aktualisieren.
BillThor
Wenn Sie "Treiber" sagen, meinen Sie damit Linux-Kerneltreiber (von denen es viele gibt) oder ntpd-Funktionen? Vielen Dank für Ihre Tipps, einige von ihnen sind interessant - obwohl ich denke, sie hätten eher als Kommentare gepostet werden sollen. Insbesondere für die Erwähnung der '11 -minute more 'hatte ich das vergessen. Ich habe meine Frage aktualisiert.
Nils Toedtmann
@NilsToedtmann Nein, ich meine NTP-Clock-Treiber. Ich habe die Erfahrung gemacht, dass RTCs normalerweise driften, aber nicht mit hohen Raten, wenn der Teig gut ist. Verpasste Ticks können ein Problem mit der Systemuhr sein.
BillThor