Linux下硬件时间系统时间等概念

理解操作系统的硬件时间(RTC)、系统时间(UTC)、本地时间概念。操作系统如何配置实现无网络环境下时间准确。

在操作系统中,我们可以通过timedatectl命令来查看系统时间设置情况。

1765768134093

上述的输出内容,共展示了以下信息:

  • Local time:本地时间,CST 是中国标准时间(China Standard Time)的缩写。

  • Universal time:世界协调时(UTC),与本地时间相差 8 小时,符合东八区(+0800)的偏移。

  • RTC time:实时时钟(Real-Time Clock)时间,,与本地时间相差 8 小时。

  • Time zone:时区为 Asia/Shanghai (CST, +0800),明确系统设置的时区是上海时区,偏移量为+0800

  • System clock synchronized:系统时钟已同步,显示 yes,表明系统时钟正在与 NTP 服务器同步。如果内网环境,时间无法完成同步时,该处显示no

  • NTP service:NTP 服务状态为 active,说明 NTP 服务正在运行。

  • RTC in local TZ:实时时钟是否已经使用了本地时区,yes表示是,no表示否。

其中使人困惑的应该是RTC in local TZ,该部分后面内容进行说明。

时钟概念

硬件时间/实时时钟(RTC)

硬件时钟是计算机主板上的一个实时时钟(RTC,Real-Time Clock)芯片,它独立于操作系统运行,即使计算机断电,也能依靠主板上的纽扣电池维持计时。

工作原理:RTC 芯片内部有一个晶体振荡器,通过晶体的压电效应产生稳定的周期性振荡信号。这个振荡信号经过分频电路处理,转化为秒脉冲信号,进而实现对时间的计数,能够精确记录年、月、日、时、分、秒等时间信息。

数据来源:硬件时钟的数据来源主要是其自身的计时电路和晶体振荡器产生的稳定振荡信号。在计算机开机时,操作系统会读取硬件时钟的时间,并以此为基础来设置系统时钟的初始值。同时,用户也可以手动设置硬件时钟的时间,例如在 BIOS 设置界面中进行操作。

大部分操作系统会在启动时,读取硬件时间来更新系统时间。

系统时间(UTC)

系统时钟是操作系统内核维护的时间,它通常在操作系统启动时从RTC设置,然后由系统时钟进行跟踪。

工作原理:系统时钟基于硬件时钟(RTC)获取初始时间值,然后通过操作系统内核中的时钟中断机制来不断更新时间。时钟中断是由计算机的定时器芯片(如可编程中断定时器 PIT)产生的周期性中断信号,内核接收到这个中断信号后,就会增加系统时钟的计数值,从而实现时间的流逝。例如,每秒钟可能会产生 100 次时钟中断(具体频率取决于系统设置),每次中断系统时钟就会相应增加一定的时间量(如 10 毫秒)。

数据来源:系统时钟的初始数据来源于硬件时钟。在计算机启动过程中,BIOS 会将硬件时钟的时间传递给操作系统,操作系统以此为基础开始运行系统时钟。之后,系统时钟通过时钟中断机制不断更新,同时,系统也可以通过网络时间协议(NTP,Network Time Protocol)与外部时间服务器进行同步,获取更准确的时间数据来校准系统时钟。例如,操作系统会定期向 NTP 服务器发送请求,获取服务器上的准确时间,并根据两者的时间差来调整系统时钟,以保证系统时间的准确性。

NTP的概念下文补充

本地时间(Local time)

本地时间是系统时间经过时区转换后的时间。时区是根据地理位置确定的,全球分为24个时区,每个时区大约代表15度的经度。例如,北京时间是UTC+8,而伦敦时间是UTC+0。

在操作系统中,时区可以手动设置(tzselect),在上述的命令输出中,对应Time zone的概念。

RTC时钟的工作方式

在上述的命令输出中,有一个概念是RTC in local TZ

RTC in local TZ配置为yes时,意味着 RTC 芯片记录的时间是本地时区时间,而非 UTC 时间。这就意味着当前硬件时间,已经包含了时区,RTC时间等于本地时间,UTC时间需要加上时区重新计算

RTC in local TZ配置为no时,意味着 RTC 芯片记录的时间是 UTC 时间。这就意味着RTC时间等于UTC时间,当前本地时间计算时,需要在TRC时间上再加上时区,得到系统时间。

示例,RTC in local TZ = yes

1765769598897

当前配置下系统给出了一些告警提示信息。

示例,RTC in local TZ = no

1765769632564

RTC in local TZ = yes可能带来的问题

在上述的命令输出中,给出了一段告警信息

1
2
3
4
5
6
Warning: The system is configured to read the RTC time in the local time zone.
This mode cannot be fully supported. It will create various problems
with time zone changes and daylight saving time adjustments. The RTC
time is never updated, it relies on external facilities to maintain it.
If at all possible, use RTC in UTC by calling
'timedatectl set-local-rtc 0'.

中文:

1
2
告警:系统配置为读取本地时区的RTC时间。
无法完全支持此模式。它将在时区更改和夏令时调整方面产生各种问题。RTC时间从不更新,它依赖于外部设施来维护它。如果可能的话,通过调用"timedatectl set-local-rtc 0"在UTC中使用RTC。

问题点在于时区更改和夏令时调整方面产生问题,因为系统时间直接采用的RTC时间进行展示,系统时间完全依赖硬件时间。无法根据相应的时区调整修改时间。

通过系统UI调整时区,系统实际上是基于当前计算出来的UTC时间+时区计算的,重启后,当前时间会重新从RTC读取并展示。

如何修正

按照系统警告提示,在终端执行timedatectl set-local-rtc 0,修改后重启桌面即可。

如果你的机器不通公网,内外没有BTP服务对时,可以这样修改。

修改后系统时间为RTC时间+时区

NTP服务

NTP 即网络时间协议(Network Time Protocol),它是用于在计算机网络中同步时钟的标准互联网协议 。

NTP 服务器:包括权威时间服务器(如国际原子时标准的服务器)和本地 NTP 服务器。本地 NTP 服务器可以从权威时间服务器获取时间,并为本地网络中的设备提供时间同步服务,可提高时间同步的效率和可靠性,减少对外部网络的依赖。

Linux下硬件时间系统时间等概念

https://blog.plcent.com/linux-systime-time-discuss/

作者

Nolly

发布于

2025-12-15

更新于

2025-12-15

许可协议

评论