一:概述
Linux系统的时钟有两种,一种是硬件时钟(BIOS时间),另一个是系统时钟(Linux系统内核时间)。当Linux启动时,系统内核会去读取硬件时钟的设置,然后系统时钟都会独立于硬件操作。有时系统时钟会独立于硬件操作,有时系统时钟和硬件时钟不一致,我们需要执行时间同步操作,调整系统时间。
二:Linux系统中时钟和硬件时钟的区别
Linux系统的时间由系统时钟(system clock)进行管理,桌面环境中显示的当前时间和日期、服务进程和内核记录在日志中的事件发生时间全部参照系统时间。使用date命令可以显示系统时钟时间,如下图所示:
时间显示有两种类型,分别是UTC(世界标准时间)和本地时间.UTC是以原子钟为基准的世界通用标准时间,于基于天文观测的GMT(格林威治标准时间)大致相同。而本地时间又称地区标准时间,对于国家和地区来说是通用的。
时间差信息存储在/usr/share/zoneinfo目录下的本地时间文件中,使用ls命令显示时差信息,如下图所示:
系统时钟使用UTC,执行date命令指定--utc选项会显示世界标准时间。只执行date表示本地标准时间。系统时钟UTC和本地标准时间显示如下图所示:
硬件时钟是主板上某个IC提供的时钟,该IC具有备用电池,即使PC关闭,该时钟也会继续运转,也称为实时时钟或CMOS时钟。如果关闭系统,系统时钟在存储器中的值将会消失。当系统开机或启动之时,硬件时钟的时间会同步到系统时钟,但是在系统运行时使用的时间·不是硬件时钟的时间。
二:设置系统时间
使用date命令和timedatectl命令设置系统时钟的时间必须要有root权限,一般用户只能用这些命令显示时间。在没有网络连接时,也可以手动更改时间。修改系统时间,也可以使用date命令,使用格式和之前有所不一样。
格式:date MMDDhhmm [[CC]YY] [.ss]
其中MM表示月份,DD表示日期,hh表示小时,mm表示分钟,CC表示年份的前两位数,ss表示秒。
使用date命令设置系统时钟,如下图所示。将系统时钟设置为当前年份的10月3日9:00,再次使用date命令检查时钟是否设置成功。
与date命令相比,timedatectl命令可以显示和设置更详细的时钟信息。
格式:timedatectl [选项] {子命令}
timedatectl命令有关时间设置的主要子命令如下表所示:
子命令 | 说明 |
status | 省略显示系统时钟和硬件时钟及其他详细信息的子命令时的缺省设置 |
set-time [时间] | 设置系统时钟的硬件时钟,仅在禁用NTP时可以设置,格式为:HH:MM:SS或YYYY-MM-DD HH:MM:SS |
set-ntp[布尔值] | 启用或者禁用NTP.布尔值为0,禁用NTP,布尔值为1,启用NTP |
set-timezone[时区] | 修改时区 |
使用timedatectl命令显示有关当前时间的详细信息,如下图所示:
在使用rimedatectl命令修改当前时间之前,需要了解一下NTP,因为涉及到禁用和启用NTP的问题。NTP(Network Time Protocol)用于同步时间的协议,可以使用NTP设置系统时钟时间。计算即通过使用NTP应用网络上其他计算机时间来同步时间。
使用timedatectl命令修改当前时间,如下图所示:
启用NTP后,更改时区,如下图所示:
三:NTP设置
在使用NTP进行时间同步程序中,许多发行版本都会使用chronyd守护进程和chronyc命令,它们可以取代常规的ntpd守护进程和ntpdate命令,在之前的基础上改进了功能和性能。
chronyd是使用NTP同步时间的客户端或服务器的守护进程,它将时间分配给NTP客户端和上层NTP服务器接收时间同步的客户端功能。使用chromyd进行时间同步的方法有两种方法:slew和step。
- slew:阶段性纠正与NTP服务器时间差,实现时间同步。这是时间差较少时同步方法。
- step:一次性修改与NTP服务器的时间差。这是时间差较大德同步方法。
硬件时钟(RTC)的同步方法有两种:rtcsync和rtcfile,不管是RedHat还是Ubuntu,在安装chrony软件包时都会设置rtcsync.
- rtcsync:这是一种定期将硬件时钟与系统时间同步的方法。
- rtcfile:chroned监视系统时钟和硬件时钟之间的差异并将记录在driftfile指令指定的文件中。指定-s选项启动时,chronyd应用此文件·。
作为系统启动时的初始化过程之一,内核通过执行某函数来读取硬件时钟时间,并将该值设置为系统时钟UTC。如果指定了rtcsync(chronyd.conf中的默认设置)。当chronyd启动时,它将内核发出系统调用指定的信号。收到信号后,硬件时钟每11分钟与系统时间同步一次。为了使内核同步处理,必须使用以下设置来构建内核:
CONIG_GENERIC_CMOS_UPDATE=y
CONFIG_RTC_SYSTHOC=y.
CONFIG_RTC_SYSTOHC_DEVICE="rtc0"
CentOS内核和Ubuntu内核都使用此设置(内核名称取决于操作系统的版本)配置文件/etc/chromy.conf(CentOS)和/etc/chrony/chrony.conf(Ubuntu)的格式想用,主要配置命令及说明如下表所示:
命令 | 说明 |
server 主机名 | 指定作为时间源使用的NTP服务器,如果指定了iburst选项,启动后的最初4此间隔以2秒进行,启动后同步有效 |
pool 名称 | 指定要用作时间源的多个NTP服务器,如果指定选项maxsources,则要使用的最大服务器将视为指定值 |
makestep 阈值次数 | 如果时间差大于阈值(单位:秒)需要同步,直到达到指定的查询数量 |
rtcsync | 定期同步硬件时钟 |
rtcfile | 使用driftfile文件校正时间 |
driftfile 文件名 | 指定文件名,该记录系统时钟和硬件时钟之间的差异 |
chronyc是chronyd的控制命令,可以通过在命令行上指定子命令来执行,也可以不带任何参数地执行,或者是通过在提示符chronyc>下输入子命令以交互方式执行。
命令格式:chronyc [选项] {子命令}
chronyc命令地子命令以及说明如下表所示:
子命令 | 说明 |
sources | 显示时间源信息 |
tracking | 显示系统时钟提示信息 |
makestep | 如果时间差大于阈值(单位:秒),它将逐步同步直到达指定数量的查询为止,如果未指定参数,则会立即调整时间 |
交互执行cronyc命令如下图所示。通过提示符chronyc>方式输入不同地子命令,显示时钟信息。输入makestep表示逐步设置时间,输入sources显示时间辕信息,输入tracking显示系统时钟性能信息,最后输入quit退出提示符chronyc>输入方式。