Linux硬件时钟与系统时钟
操作系统的时间(时钟)由以下4个部分决定:
- 时间数值
- 时间标准(本地时间/UTC/其他)
- 时区
- 夏令时(DST,Daylight Saving Time,部分适用,中国已经废止)
操作系统有两个时钟,分别是硬件时钟和系统时钟,大多数操作系统的时钟管理方式如下:
- 启动时根据硬件时钟设置系统时钟
- 维护准确的系统时钟
- 关机时根据系统时钟设置硬件时钟
硬件时钟
硬件时钟,又称实时时钟(Real Time Clock,RTC)或CMOS时钟,是独立的硬件设备(电池、电容元件等),保存的时间包括年、月、日、时、分、秒。2016年之后的UEFI固件还能保存时区和是否使用夏令时。
操作硬件时钟的工具是hwclock
,用于查询、设置硬件时钟等。
读取硬件时钟:
|
|
使用系统时钟设置硬件时钟:
|
|
更新硬件时钟后,/etc/adjtime
随之更新。
系统时钟
系统时钟,又称软件时钟,是Linux内核的一部分,包括时间、时区、夏令时(如果适用)。
系统启动时,系统时钟的初始值根据硬件时钟设定(依赖于/etc/adjtime
);
系统启动后,Linux内核利用定时器中断维护系统时钟 ,与硬件时钟无关。
操作系统时钟的工具是timedatectl
,用于查询/设置时间、设置时区、设置时间同步等。
查询时钟,其中包括本地时间、UTC时间、RTC时间、时区、系统时钟同步状态、NTP服务状态、RTC是否使用本地时间:
|
|
设置时钟,时间格式是yyyy-MM-dd hh:mm:ss
:
|
|
时间字符串为本地时间,执行命令后,本地时间、UTC时间、RTC时间会同时更新。
开启时间同步:
|
|
时间同步
可以使用ntpd -qg
命令同步时间。
另外,Linux系统自带ntpd.service,可以使用systemctl start ntpd
命令启动NTP服务。
需要注意的是,ntpd
命令或服务仅更新本地时间和UTC时间,不更新RTC时间。 可以设置一个过去的时间,然后执行ntpd
命令校准时间,再执行timedatectl
命令查询验证。
不过这并不是什么大问题,因为关机时操作系统会根据系统时钟重设硬件时钟,下次启动时,二者恢复一致。
时间标准
两种时间标准:
- 本地时间(时区相关)
- UTC时间(时区无关)
硬件时钟所采用的时间标准是由操作系统决定的,默认情况下,Windows使用本地时间,macOS使用UTC时间,类Unix系统则各有不同。
使用UTC时间标准的操作系统通常把硬件时钟视为UTC,然后在启动时根据时区进行调整设置系统时间。
如果一台机器上安装了多个操作系统,它们都使用硬件时钟设置系统时间,建议采用统一的UTC时间标准,避免切换系统时发生时间错乱。
参考文档