目录

Linux硬件时钟与系统时钟

操作系统的时间(时钟)由以下4个部分决定:

  • 时间数值
  • 时间标准(本地时间/UTC/其他)
  • 时区
  • 夏令时(DST,Daylight Saving Time,部分适用,中国已经废止)

操作系统有两个时钟,分别是硬件时钟和系统时钟,大多数操作系统的时钟管理方式如下:

  • 启动时根据硬件时钟设置系统时钟
  • 维护准确的系统时钟
  • 关机时根据系统时钟设置硬件时钟

硬件时钟

硬件时钟,又称实时时钟(Real Time Clock,RTC)或CMOS时钟,是独立的硬件设备(电池、电容元件等),保存的时间包括年、月、日、时、分、秒。2016年之后的UEFI固件还能保存时区和是否使用夏令时。

操作硬件时钟的工具是hwclock,用于查询、设置硬件时钟等。

读取硬件时钟:

1
# hwclock --show

使用系统时钟设置硬件时钟:

1
# hwclock --systohc

更新硬件时钟后,/etc/adjtime随之更新。

系统时钟

系统时钟,又称软件时钟,是Linux内核的一部分,包括时间、时区、夏令时(如果适用)。

系统启动时,系统时钟的初始值根据硬件时钟设定(依赖于/etc/adjtime);

系统启动后,Linux内核利用定时器中断维护系统时钟 ,与硬件时钟无关。

操作系统时钟的工具是timedatectl,用于查询/设置时间、设置时区、设置时间同步等。

查询时钟,其中包括本地时间、UTC时间、RTC时间、时区、系统时钟同步状态、NTP服务状态、RTC是否使用本地时间:

1
2
3
4
5
6
7
8
# timedatectl
               Local time: Tue 2020-06-02 18:08:06 CST
           Universal time: Tue 2020-06-02 10:08:06 UTC
                 RTC time: Tue 2020-06-02 10:08:06    
                Time zone: Asia/Shanghai (CST, +0800) 
System clock synchronized: yes                        
              NTP service: active                     
          RTC in local TZ: no 

设置时钟,时间格式是yyyy-MM-dd hh:mm:ss

1
2
3
4
5
6
7
8
9
# timedatectl set-time "2020-06-02 17:30:00"
# timedatectl
               Local time: Tue 2020-06-02 17:30:05 CST
           Universal time: Tue 2020-06-02 09:30:05 UTC
                 RTC time: Tue 2020-06-02 09:30:05    
                Time zone: Asia/Shanghai (CST, +0800) 
System clock synchronized: no                         
              NTP service: inactive                   
          RTC in local TZ: no  

时间字符串为本地时间,执行命令后,本地时间、UTC时间、RTC时间会同时更新。

开启时间同步:

1
# timedatectl set-ntp 1

时间同步

可以使用ntpd -qg命令同步时间。

另外,Linux系统自带ntpd.service,可以使用systemctl start ntpd命令启动NTP服务。

需要注意的是,ntpd命令或服务仅更新本地时间和UTC时间,不更新RTC时间。 可以设置一个过去的时间,然后执行ntpd命令校准时间,再执行timedatectl命令查询验证。

不过这并不是什么大问题,因为关机时操作系统会根据系统时钟重设硬件时钟,下次启动时,二者恢复一致。

时间标准

两种时间标准:

  • 本地时间(时区相关)
  • UTC时间(时区无关)

硬件时钟所采用的时间标准是由操作系统决定的,默认情况下,Windows使用本地时间,macOS使用UTC时间,类Unix系统则各有不同。

使用UTC时间标准的操作系统通常把硬件时钟视为UTC,然后在启动时根据时区进行调整设置系统时间。

如果一台机器上安装了多个操作系统,它们都使用硬件时钟设置系统时间,建议采用统一的UTC时间标准,避免切换系统时发生时间错乱。


参考文档