我知道我的硬件时钟基于一个简单的石英钟,并且随着时间的推移会不同步,但系统时间基于 CPU 时钟,因此非常准确。
我所处的环境中没有可以使用 NTP 的环境,因此我需要知道系统时钟自动地同步回硬件时钟以防止其漂移?
如果没有,我需要设置一个 cron 作业或调用其他程序来hwclock
同步回硬件时钟。所有设置都为 UTC,因此不必担心。
答案1
我认为这一页提供最佳答案:
2. Linux 如何跟踪时间
2.1 基本策略
Linux 系统实际上有两个时钟:一个是电池供电的“实时时钟”(也称为“RTC”、“CMOS 时钟”或“硬件时钟”),它在系统关闭时跟踪时间,但在系统运行时不使用。另一个是“系统时钟”(有时称为“内核时钟”或“软件时钟”),它是基于计时器中断的软件计数器。它在系统不运行时不存在,因此必须在启动时从 RTC(或其他时间源)初始化它。ntpd 文档中对“时钟”的引用指的是系统时钟,而不是 RTC。
两个时钟会以不同的速率漂移,因此它们会逐渐彼此分离,并远离“真实”时间。保持它们准时的最简单方法是测量它们的漂移率并在软件中应用校正因子。由于 RTC 仅在系统未运行时使用,因此在启动时读取时钟时应用校正因子,使用 clock(8) 或 hwclock(8)。通过使用 adjtimex(8) 调整系统时间随每次定时器中断前进的速率来校正系统时钟。
adjtimex(8) 的一个粗略替代方案是让 chron 定期运行 clock(8) 或 hwclock(8),以将系统时间同步到(已更正的)RTC。clock(8) 手册页中推荐了这种方法,如果您经常这样做而不会导致系统时间出现较大的“跳跃”,这种方法是可行的,但 adjtimex(8) 是一种更优雅的解决方案。如果时间向后跳跃,某些应用程序可能会抱怨。
提高准确性的下一步是使用 ntpd 之类的程序定期从网络时间服务器或无线电时钟读取时间,并不断调整系统时钟的速率,以使时间始终匹配,而不会导致系统时间突然“跳跃”。如果您在启动时始终有网络连接,则可以完全忽略 RTC,并使用 ntpdate(随 ntpd 软件包提供)从时间服务器(LAN 上的本地服务器或互联网上的远程服务器)初始化系统时钟。但如果您有时没有网络连接,或者您需要在网络激活之前的启动序列中保持时间准确,那么您还需要在 RTC 中维护时间。