介绍
(1)Chrony是一个用于计算机系统时钟同步的程序。它使用网络时间协议NTP来与远程时间服务器通信,根据这些服务器提供的时间信息来调整系统时钟。Chrony具有高精度,可配置,易使用等特点。
(2)同时,Chrony服务提供双向通信的能力,代表着它既可以作为客户端去外部时钟源获取时间到本地,也可以作为服务器将本地的时钟信息发送给其他服务器。
(3)有两个主要的程序chronyd和chronyc
chronyd:后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算机增减时间的比率,并对此进行补偿
chronyc:命令行用户工具,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计算机上工作,也可在一台不同的远程计算机上工作
2.概念
(1) 系统时钟和硬件时钟
系统时钟是指操作系统中用于记录时间的计数器,它通常以固定频率递增。硬件时钟是指计算机硬件上的实际时钟设备,一般是在主板上由电池供电的实时时钟芯片。当计算机启动时,操作系统会从硬件时钟读取当前时间,并将其作为系统启动时间。
(2) NTP协议
NTP协议是一种用于网络时间同步的协议。它通过在计算机之间传递精确的时间信息来使它们保持同步。
(3) NTP网络架构
Stratum 0 是高精度的计时设备,例如原子钟(如铯、铷)、GPS/北斗卫星等,它们生成非常精确的脉冲秒信号,触发所连接计算机上的中断和时间戳,它们也称为参考 (基准) 时钟。本身不具属于 NTP。
stratum 1 的设备直接与 stratum 0 连接,误差一般在几微秒,stratum 1 的服务器也可与其他 stratum 1 服务器对等连接。在 stratum 1 的服务器也被称为主时间服务器。
stratum 2 服务器(二级时间服务器)与 stratum 1 服务器连接并同步,stratum 2 的服务器可查询多个 stratum 1 的服务器,也可与其他 stratum 2 的服务器对等连接,从而互相同步。
stratum 3 的服务器与 stratum 2 的服务器同步,同步原理与 stratum 2 相同并为下一层提供时间同步,以此类推。
(4) 工作模式
a.单播客户端/服务器(client/server)
b.对称模式
对称模式也成为对等体模式
c.广播模式(broadcast)
广播服务器向广播地址发送报文,客户端接收报文。
d.组播模式(multicast)
组播服务器向组播地址发送报文,客户端接收报文
Chrony的工作原理
1.选择时钟源
Chrony能够自动选择最优的NTP服务器进行时间同步。它通过查询NTP服务器列表,选择误差最小的服务器进行同步。同时,Chrony还会对服务器进行分级,对于不同误差级别的服务器使用不同的权重进行选择
2.测量延迟和偏差
一旦选择了时间源,Chrony将开始与该时钟源进行通信。它通过发送NTP请求并接受响应来测量网络延迟和时钟偏差。
一次NTP请求的过程
延迟计算
delay = (t4-t1) - (t3-t2)
偏移时间差计算
offset =
推算过程
3.计算时钟校正
通过对多次测量的结果进行统计分析,Chrony可以计算出系统时钟相对于时钟源的校正值。这个校正值代表系统时钟应该被调整的大小和方向
4.调整系统时钟
最后,Chrony将使用计算得到的校正值来调整系统时钟。它会逐渐的改变系统时钟的频率和速度,使其接近正确时间。这种渐进式调整有助于避免系统时钟的剧烈跳动。Chrony使用一种时钟滤波器的算法来进行同步。时钟滤波器的主要思想是,通过对时间样本进行加权平均来消除异常的时间测量值,从而提高时间同步的准确性。Chrony会根据测量延迟的大小为每个时间样本分配权重,然后使用加权平均的方式计算偏差。
配置
maxchange 1000 1 2 第一个值表示在主时钟源可用的情况下的最大变化量,第二个值表示在某些时钟源不可用的情况下的最大变化量,第三个值表示在所有时钟源都不可用的情况下的最大变化量。单位为PPM(百万分之一秒,微妙)
maxslewrate 1000 每秒最多更新1毫秒
allow 允许访问的地址
rtcsync 定期将系统时间同步到RTC时间,默认是11分钟。
makestep 1000 10 chrony服务启动时,如果大于1000s,通过10个周期快速更新到正确时间
server 时钟源服务器
maxpoll 发送到服务器的请求之间的最大间隔
minpoll 最小间隔
prefer 优先选择
iburst 发送到服务器的前四个请求之间的间隔将为2秒或更短,而不是minpoll选项指定的间隔,这使chronyd在启动后不久即可进行时钟的第一次更新
trust 受信任的时钟源
参数名 | 含义 | 具体说明 |
M | 时钟源的说明 | ^表示服务器,= 表示二级时钟源 ,#表示本地的时钟 |
S | 指示源的状态 | *当前同步的源,+表示其他可接受的源,?表示连接丢失的源,x表示一个认为是falseticker 的时钟(即它的时间与大多数其他来源不一致),~表示其时间似乎具有太多可变性的来源,-被排除在外的可接受的源 |
Name/IP address | 源的名称或IP地址,或者参考时钟的refid值 | |
Stratum | 源的层级 | |
Poll | 表示源轮询的频率 | 以秒为单位,上图的2表示每2的2次方进行一次测量,chronyd会根据当时的情况自动改变轮询频率 |
Reach | 表示源的可达性的锁存值(八进制数值) | 该锁存值有8位,并在当接收或丢失一次时进行一次更新 |
LastRx | 表示从源收到最近的一次的时间 | 通常是几秒钟,字母m,h,d或y分别表示分钟,小时,天或年,值10年表示从未从该来源收到时间同步信息 |
Last sample | 表示本地时钟与上次测量时源的偏移量 | 方括号中的数字表示实际测量的偏移值,这可以以ns(表示纳秒),us(表示微秒),ms(表示毫秒)或s(表示秒)为后缀;方括号左侧的数字表示原始测量值,这个值是经过调整以允许应用于本地时钟的任何偏差;方括号右侧表示偏差值,+/-指示器后面的数字表示测量中的误差范围,+偏移表示本地时钟快速来源 |