在线时使用NTP同步时钟,在离线时使用RTC?

是否有一个现有的机制,可以在线同步一个linux系统与NTP,并且在离线状态下可预测漂移RTC?


我们操作远程“收集器”:收集传感器数据并对其进行时间标记的embedded式Linux系统。 我们需要他们的时钟错误保持合理的小,比如5秒以内。 通常我们使用NTP来同步他们的时钟,并且工作正常 – 只要系统在线。

问题是一些collections家有非常糟糕的上行链路,可能会下降数小时,数天甚至数周。 这并不能阻止本地数据收集,但是如果没有NTP,Linux系统时钟会发生严重的漂移,并且相当不可预测。

OTOH,硬件的RTC漂移也很厉害,但速度不变。 RTC漂移率因板而异,但每块板不变,可以测量。

我想我们需要的是一个机制,做到以下几点:

  • 在部署之前测量电路板的RTC漂移率
  • 如有可能,通过NTP定期调整系统时间
  • 当NTP不可用时,定期从RTC调整系统时间。 考虑已知的RTC漂移率。
  • 可选:测量并logging在线时正在进行的RTC漂移率(1)

对于“机制”,我的意思是一些维护良好,logging在案的软件和/或configuration可以处理“在线”与“离线”两种状态,确保系统时钟与正确的时间源同步(ntp vs. rtc),检测状态变化,并校正RTC漂移。 不pipe它是作为一个特殊的ntpdconfiguration/插件,作为单独的守护进程,还是作为一个cron作业来实现,都没关系。

我看了一下Chrony ,但是根据它的文档,它试图预测系统时钟的漂移,在我们的例子中漂移比RTC漂移更加不可预测。 Chrony似乎只使用RTC来保持重新启动的时间。


(1)注意ntpd激活内核的“11分钟模式”(每隔11分钟从系统时钟更新rtc)。 目前的内核和ntpd似乎没有办法阻止11分钟的模式。 因此,当ntpd正在运行(thx @billthor)时,任何rtc漂移信息都会丢失。


更新/编辑:

  • 我们正在考虑通过USB或串行为MSF或DCF77信号(我们位于欧洲)添加一个外部无线电时钟。 但我们宁愿保持硬件精益。
  • 我们的collections家位于室内,通常在地下室。 所以添加GPS时钟将无济于事。
  • 我们使用Debian 7.这意味着来自util-linux-2.20.1的hwclock,来自ntp-4.2.6.p5的ntpdate-4.2.6p5,ntpd,chrony-1.24(可能是1.30)。
  • 请注意,我们的问题不是我们不知道如何使用ntpdate(8)hwclock(8)date(1)等。请参阅斜体添加的部分关于我的意思是“机制”。
  • 增加了关于“11分钟模式”的脚注
  • 这是一个关于离线同步和RTC漂移的非常有趣的讨论

你的情况是不寻常的,如果有人想出一个标准的基于ntpd的configuration来做你想做的事,我会感到惊讶。 这就是说,我喜欢惊讶,而且这些部分经常发生。

但是,直到有人提出一个更好的主意,你有没有考虑过这样的crontab条目?

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

IE,每隔五分钟尝试通过ntpdate同步时钟,如果(并且只有)失败,根据/etc/adjtime文件调整硬件时钟漂移(其格式在man hwclock详细描述,其第一行你已经使用你对该特定RTC速率的知识进行了适当的填充),然后从RTC设置系统时钟。

请注意,如果您select这样的解决scheme,而且您正在部署大量这些系统,则使用该池时应认为是礼貌的,并根据您的使用情况提供相应的服务器。 您可以在http://www.pool.ntp.org/en/vendors.htmlfind更多信息。

NTP已经有了一些机制来知道它是在线还是离线,并且会根据需要切换到较低优先级的源。 检查到达值触发备用源是非常容易的,但我会坚持使用NTP。 如下面所讨论的,对RTC漂移的监测和校正可能是困难的。

在互联网前的日子里,我使用了一个可以打电话到数据源并同步时钟的程序。 仍然有可用的服务通过调制解调器提供时间源。 这将需要访问电话线。

本地时钟有已知的问题,不适用于RTC。 有些问题logging在NTP已知操作系统问题列表中。 这些可能会导致你的时钟漂移。 解决它们可以解决你的问题。 在没有错过蜱虫的情况下,我发现本地(系统)时间源可能非常稳定。

您可以使用Dumb时钟驱动程序(33),将程序写入相应的RTC时间到/ dev / dumbclockX设备。

还有一些基于无线电时钟的其他驱动程序。 其中一些使用诸如WWV和CHU之类的短波服务,这些服务可能在GPS信号不可用的环境中工作。 对于欧洲来说,这个清单将包括BBC,TDF,RBU和RMW。

Pavel Krejci也写了一个RTC驱动程序,但似乎并没有被纳入官方的驱动程序。 这可能与PPStypes同步一起工作。

应该可以在部署之前测量RTC漂移。 但是,您需要确保RTC没有被自动更新。 当使用adjtimex函数更新系统时钟时,RTC可能每11分钟更新一次。

NTP将在连接时更新时钟。 通常NTP将拒绝对系统时钟进行大的调整。 有选项可以调整时钟可以调整多远。

我build议使用上面的RTC的选项。 无线电时钟可能比GPS时钟更合适。

在没有可靠的时间源的情况下测量漂移以进行比较可能是徒劳的。 如果当地时间不稳定,则不能用它来监视RTC,反之亦然。 如果内核每隔11分钟更新一次RTC,则在连接NTP时测量漂移将不起作用。 我使用的RTC有一秒钟的分辨率,所以它们必须显着漂移才能可靠地测量。