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