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
ntpdate
STA_UNSYNC
调整系统时间时不清除标志。因此内核认为系统时间无效并且不更新RTC。它不清楚,STA_UNSYNC
因为它用于adjtime()
设置系统时间而不是adjtimex()
。
为了使用CONFIG_RTC_SYSTOHC
该功能,您必须使用清除STA_UNSYNC
标志的工具,即ntpd
。
可能应该将该问题报告给ntpdate
开发人员。
答案3
从 cronjob运行ntpdate
将在每次运行时调整系统时间,但这并不意味着您的系统是“NTP 同步”(时钟可以在定期同步之间漂移)并且内核不会自动同步 RTC。
ntpdate
您从 cronjob运行而不是 running 有什么特殊原因吗ntpd
?ntpd
将保持更准确的时间,进行更多的错误检查(这样错误的时间服务器不会给您带来混乱),并控制系统的时钟频率以补偿振荡器漂移。
此外,它还会向内核报告“NTP 同步状态”,然后内核会定期设置 hwclock。
从ntpdate
手册页:
可以根据需要手动运行 ntpdate 以设置主机时钟,也可以从主机启动脚本运行以在启动时设置时钟。在某些情况下,这对于在启动 NTP 守护进程 ntpd 之前初始设置时钟很有用。也可以从 cron 脚本运行 ntpdate。然而,值得注意的是,带有设计的 cron 脚本的 ntpdate 并不能替代 NTP 守护进程,后者使用复杂的算法来最大限度地提高准确性和可靠性,同时最大限度地减少资源使用。最后,由于 ntpdate 不像 ntpd 那样规定主机时钟频率,因此使用 ntpdate 的准确性受到限制。
一般来说,最好使用它ntpd
来保持时钟同步,除非您有特殊原因不这样做(例如,传输数据非常昂贵的远程或隔离系统)。