RTC 时间同步不起作用(CONFIG_RTC_SYSTOHC)

RTC 时间同步不起作用(CONFIG_RTC_SYSTOHC)

CONFIG_RTC_SYSTOHC我在内核中启用了该选项:

Device Drivers  --->
    [*] Real Time Clock  --->
        [*]   Set the RTC time based on NTP synchronization

帮助说:

CONFIG_RTC_SYSTOHC:

If you say yes here, the system time (wall clock) will be stored in the RTC
specified by RTC_HCTOSYS_DEVICE approximately every 11 minutes if userspace
reports synchronized NTP status.

但是,我的硬件时钟未同步。我已经RTC_HCTOSYS_DEVICE正确设置了:

CONFIG_RTC_HCTOSYS_DEVICE="rtc0"

上面引用的帮助说,如果“如果用户空间报告同步的 NTP 状态”,则同步有效。这意味着什么?我ntpdate使用 cron 定期(每 4 小时)同步我的时间。

如何告诉我的系统我已ntp同步并且我希望我的硬件时钟同步?

答案1

既然您已经ntp通过 cron 进行了时间更新,ntpupdate为什么不将硬件同步添加到该 cron(或创建第二个)呢?我在公司的一些非常非常旧的 RHEL 3 和 4 机器上使用了同样的方法来保持时钟同步。

0 */4 * * * ntpdate mytimeserver.com && ( hwclock --adjust; hwclock -w )

ntpdate如果成功,此 cron 会将硬件时钟更新为系统时间。有关的更多信息hwclock commands

添加注释:

mytimeserver.com对我来说是一个内部 VIP,其中有一些时间服务器以提供冗余。如果您无法访问同一事物,则应该将服务器更改ntp为不同的 ntp 池,以便每个系统都不会依赖于一台且仅一台 ntp 服务器。

服务器1:

0 */4 * * * ntpdate 0.pool.ntp.org  && ( hwclock --adjust; hwclock -w )

服务器2:

0 */4 * * * ntpdate 1.pool.ntp.org  && ( hwclock --adjust; hwclock -w )

答案2

ntpdateSTA_UNSYNC调整系统时间时不清除标志。因此内核认为系统时间无效并且不更新RTC。它不清楚,STA_UNSYNC因为它用于adjtime()设置系统时间而不是adjtimex()

为了使用CONFIG_RTC_SYSTOHC该功能,您必须使用清除STA_UNSYNC标志的工具,即ntpd

可能应该将该问题报告给ntpdate开发人员。

答案3

从 cronjob运行ntpdate将在每次运行时调整系统时间,但这并不意味着您的系统是“NTP 同步”(时钟可以在定期同步之间漂移)并且内核不会自动同步 RTC。

ntpdate您从 cronjob运行而不是 running 有什么特殊原因吗ntpdntpd将保持更准确的时间,进行更多的错误检查(这样错误的时间服务器不会给您带来混乱),并控制系统的时钟频率以补偿振荡器漂移。

此外,它还会向内核报告“NTP 同步状态”,然后内核会定期设置 hwclock。

ntpdate手册页:

可以根据需要手动运行 ntpdate 以设置主机时钟,也可以从主机启动脚本运行以在启动时设置时钟。在某些情况下,这对于在启动 NTP 守护进程 ntpd 之前初始设置时钟很有用。也可以从 cron 脚本运行 ntpdate。然而,值得注意的是,带有设计的 cron 脚本的 ntpdate 并不能替代 NTP 守护进程,后者使用复杂的算法来最大限度地提高准确性和可靠性,同时最大限度地减少资源使用。最后,由于 ntpdate 不像 ntpd 那样规定主机时钟频率,因此使用 ntpdate 的准确性受到限制。

一般来说,最好使用它ntpd来保持时钟同步,除非您有特殊原因不这样做(例如,传输数据非常昂贵的远程或隔离系统)。

相关内容