一 介绍

1 简介

        集群中节点之间需要时间同步,Chronyd不依赖外部的时间服务NTP,在内部搭建时间服务器。

        Chrony是网络时间协议(NTP)的一种实现,是一个类Unix系统上NTP客户端和服务器的替代品。Chrony客户端可以与NTP servers同步系统时间,也可以与参考时钟(例如:GPS接受设备)进行同步,还与手动输入的时间进行同步。同样Chrony也可以作为一个NTPv4(RFC 5905) server为其他计算机提供时间同步服务。
        Chrony 可以更快的同步系统时钟,具有更好的时钟准确度,并且它对于那些不是一直在线的系统很有帮助。Chrony在Internet上同步的两台机器之间的典型精度在几毫秒内,而在LAN上的机器之间的精度在几十微秒内。chronyd 更小、更节能,它占用更少的内存且仅当需要时它才唤醒 CPU。即使网络拥塞较长时间,它也能很好地运行。它支持 Linux 上的硬件时间戳,允许在本地网络进行极其准确的同步。Chrony 是自由开源的,并且支持 GNU/Linux 和 BSD 衍生版(比如 FreeBSD、NetBSD)、macOS 和 Solaris 等。

2 与ntpd对比

(1)chronyd做的比ntpd好的

  • chronyd可以在时断时续访问参考时间源的环境下工作,而ntpd需要定期轮询参考时间源才能正常工作。
  • 即使网络拥塞时间更长,chronyd也可以运行良好。
  • chronyd通常可以更快、更准确地同步时钟。
  • chronyd能够快速适应晶体振荡器温度变化引起的时钟频率的突然变化,而ntpd可能需要很长时间才能稳定下来。
  • 在默认配置下,为了不影响其他正在运行的程序,chronyd从不在系统启动同步时钟之后执行时间步进。ntpd也可以配置为从不步进时间,但它必须使用不同的方法来调整时钟,这有一些缺点,包括对时钟精度的负面影响。
  • chronyd可以在更大的范围内调整Linux系统上的时钟频率,这使得它甚至可以在时钟损坏或不稳定的机器上运行。例如,在一些虚拟机上。
  • chronyd体积更小,占用的内存更少,而且只有在必要的时候才会唤醒CPU,这对于节能来说是更好的选择。

(2)chronyd能做的但ntpd做不到的

  • chronyd提供了对孤立网络的支持,在孤立网络中,时间校正的唯一方法就是手动输入。例如,由管理员查看时钟。chronyd可以检查在不同的更新中修正的错误,从而估算出计算机增加或减少时间的速度,并在随后使用这个估算来调整计算机时钟。
  • chronyd可以计算RTC时钟(在计算机关闭时保持时间的时钟)的增益和损耗率。它可以在系统启动时使用这些计算的数据,以及从RTC时钟获取的时间调整值来设置系统时间。RTC时钟设备目前仅在Linux系统上可用。
  • 支持Linux上的硬件时间戳,允许在本地网络上进行非常精确的同步。

(3)ntpd做得到但chronyd做不到的

  • ntpd支持NTP v4(RFC 5905)的所有同步模式,包括broadcast、multicast和manycast clients and servers模式。请注意,broadcast和multicast模式(即使有身份验证)与普通servers and clients模式相比,更不精确、更不安全,通常应避免使用。
  • ntpd支持使用公钥加密的Autokey协议(RFC 5906)对服务器进行身份验证。注意,该协议已被证明是不安全的,可能会被Network Time Security(NTS)取代。
  • ntpd包含很多参考时间源的驱动程序,而chronyd依赖于其他程序(例如gpsd),以使用共享内存(SHM)或Unix domain socket(SOCK)访问参考时间源的数据。

(4)chronyd与ntpd,该怎么选

  • 除了由不支持Chrony的工具管理或监视的系统,或者具有不能与Chrony一起使用的硬件参考时钟的系统之外,其他系统都应该首选Chrony。
  • 需要使用Autokey协议对数据包进行身份验证的系统只能使用ntpd,因为chronyd不支持这个协议。Autokey协议存在严重的安全问题,应避免使用该协议。使用对称密钥进行身份验证,而不是使用Autokey,这是chronyd和ntpd都支持的。Chrony支持更强的哈希函数,如SHA256和SHA512,而ntpd只能使用MD5和SHA1。

二 内网安装(若只是为了安装使用,则只看这一章即可,也可参照下一章进行时间服务器多层嵌套)

# 安装chrony,设置开机启动
[root@192 ~]# yum install chrony
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.tuna.tsinghua.edu.cn
 * extras: mirrors.163.com
 * updates: mirrors.163.com
Package chrony-3.4-1.el7.x86_64 already installed and latest version
Nothing to do
[root@192 ~]# systemctl start chronyd
[root@192 ~]# systemctl enable chronyd

# server配置,vim /etc/chrony.conf 添加以下两项
# Allow NTP client access from local network.
allow all # 允许所有主机从server端同步时间

# Serve time even if not synchronized to a time source.
local stratum 10 # 即使server端无法从互联网同步时间,也同步本机时间至client

# client配置,vim /etc/chrony.conf 注释原server配置,改为prod1机器IP地址
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 192.168.247.136 iburst


# 都重启服务
[root@192 ~]# systemctl restart chronyd
# 服务端查看server端在线情况和时间同步情况
[root@192 ~]# chronyc activity
200 OK
0 sources online
0 sources offline
1 sources doing burst (return to online)
0 sources doing burst (return to offline)
0 sources with unknown address
[root@192 ~]# chronyc tracking
Reference ID    : B65C0C0B (time5.aliyun.com)
Stratum         : 3
Ref time (UTC)  : Tue Dec 28 08:56:41 2021
System time     : 0.000352393 seconds fast of NTP time
Last offset     : +0.000411336 seconds
RMS offset      : 0.000915787 seconds
Frequency       : 1.113 ppm slow
Residual freq   : -0.518 ppm
Skew            : 55.244 ppm
Root delay      : 0.024603928 seconds
Root dispersion : 0.003826973 seconds
Update interval : 64.2 seconds
Leap status     : Normal

# 客户端查看server端(也就是本地服务器)在线情况和时间同步情况
[root@192 ~]# chronyc activity
200 OK
1 sources online
0 sources offline
0 sources doing burst (return to online)
0 sources doing burst (return to offline)
0 sources with unknown address
[root@192 ~]# chronyc tracking
Reference ID    : C0A8F788 (192.168.247.136)
Stratum         : 4
Ref time (UTC)  : Tue Dec 28 08:55:38 2021
System time     : 0.000000145 seconds slow of NTP time
Last offset     : +0.000075000 seconds
RMS offset      : 0.000075000 seconds
Frequency       : 31.362 ppm slow
Residual freq   : +0.119 ppm
Skew            : 198.082 ppm
Root delay      : 0.024361094 seconds
Root dispersion : 0.004769796 seconds
Update interval : 2.0 seconds
Leap status     : Normal

三 为处于孤立网络中的系统配置chrony

        孤立网络指的是不连接到互联网的网络。为处于孤立网络中的系统配置chrony,我们首先需要选择一台计算机作为master timeserver。网络中的其他计算机都作为客户端与master同步时间,或者作为客户端的客户端与master的客户端同步时间。在master上,必须用系统时钟的平均偏移率手动设置drift文件。加入master重启,它将会从周围的系统上获取时间数据,并计算平均值来设置它的系统时间。然后它基于drift文件恢复调整系统时间。drift文件会在使用settime命令后自动更新。

# 在master上,编辑/etc/chrony.conf配置文件如下
driftfile /var/lib/chrony/drift    #指定存储chronyd计算的系统时钟增益和损耗数据的drift文件位置。
commandkey 1
keyfile /etc/chrony.keys    #ntp数据包验证密钥文件
initstepslew 10 client1 client3 client6
local stratum 8
manual    #使得可以在chronyc中使用settime命令手动设置时间
allow 192.0.2.0    #其中192.0.2.0是允许连接到master的客户端的网络地址。


# 在master的客户端上,编辑/etc/chrony.conf配置文件如下:
server master    #设置master为同步时间源
driftfile /var/lib/chrony/drift
logdir /var/log/chrony
log measurements statistics tracking
keyfile /etc/chrony.keys
commandkey 24
local stratum 10
initstepslew 20 master
allow 192.0.2.123    #192.0.2.123是master的ip地址



# 客户端的客户端的chrony.conf配置与以上客户端的配置类似,但是没有local和allow指令。

四 使用chrony

1 chrony的安装启动、查看状态、停止

#安装
yum install chrony
#启动以及启用开机自启
systemctl start chronyd
systemctl enable chronyd
#查看状态
systemctl status chronyd
#停止以及禁用开机自启
systemctl stop chronyd
systemctl disable chronyd

 2 检查chrony的同步状态

(1)使用root用户或chrony用户执行chronyc tracking

[root@192 ~]# chronyc tracking
Reference ID    : C0A8F788 (192.168.247.136)
Stratum         : 4
Ref time (UTC)  : Tue Dec 28 08:55:38 2021
System time     : 0.000000145 seconds slow of NTP time
Last offset     : +0.000075000 seconds
RMS offset      : 0.000075000 seconds
Frequency       : 31.362 ppm slow
Residual freq   : +0.119 ppm
Skew            : 198.082 ppm
Root delay      : 0.024361094 seconds
Root dispersion : 0.004769796 seconds
Update interval : 2.0 seconds
Leap status     : Normal
  1. Reference ID: 与之进行同步的ntp服务器的参考ID(一串16进制数字)和名称(或ip地址)
  2. Stratum: 与附加硬件参考时钟的计算机(stratum-1)的距离。本机是stratum-3,也就是说139.199.215.251是stratum-2。
  3. Ref time (UTC): 来自参考时间源的最后测量的UTC时间
  4. System time: 正常情况下,chronyd默认不会步进调整时钟,因为时间的跳跃会有对某些应用程序造成不良后果的风险。相反,系统时钟的偏差是通过略微加快或减慢系统时钟的方式来调整,知道消除偏差,然后返回系统时钟的正常速度。这样做的结果是,将会有一段时间,系统时钟(由其他程序读取的)会和chronyd估计的当前真实时间(当chronyd作为ntp服务器时,报告给其他ntp客户端的时间)不一样。这一行显示的值是这两个时间的差值。
  5. Last offset: 最后一次时钟更新时估计的本地偏移量
  6. RMS offset: 偏移量的长期平均值
  7. Frequency: 如果chronyd不进行校正,系统时钟出错的频率。它以ppm表示(百万分之几)。例如:1ppm表示当系统时钟认为前进了1秒时,它实际上相对于真实时间前进了1.000001秒。
  8. Residual freq: 当前选择的参考时间源的‘residual frequency’。表示从参考时间源测量到的频率与当前使用的频率之间的差值。
  9. Skew: 频率上的估计误差范围
  10. Root delay: 本计算机到最终同步的stratum-1计算机的网络路径延迟的总和。
  11. Root dispersion: 通过所有经过的计算机,回到最终同步的stratum-1计算机累积的总弥散。下面的公式给出了计算机时钟精度的绝对界(假设stratum-1计算机的时间是正确的):clock_error <= |system_time_offset| + root_dispersion + (0.5 * root_delay)。
  12. Update interval: 最后两次时钟更新的时间间隔
  13. Leap status: 可能值为Normal、Insert second、Delete second、Not synchronized

 (2)chronyc sources

chronyc sources显示关于chronyd当前连接的时间源的信息。添加可选的-v参数将显示额外的行来解释每列的含义。

[root@192 ~]# chronyc sources
210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^? time.cloudflare.com           0   8     0     -     +0ns[   +0ns] +/-    0ns
^- tick.ntp.infomaniak.ch        1   6   377    14    -26ms[  -26ms] +/-  154ms
^+ 139.199.214.202               2   6   377    17  -1038us[-1038us] +/-   29ms
^* time5.aliyun.com              2   6   377    82  -1636us[-2077us] +/-   13ms
[root@192 ~]# chronyc sources -v
210 Number of sources = 4

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^? 123.200.159.162.in-addr.>     0   8     0     -     +0ns[   +0ns] +/-    0ns
^- 33.73.16.84.in-addr.arpa      1   6   377     9    -26ms[  -26ms] +/-  153ms
^+ 139.199.214.202               2   6   377    12  -9920us[-9920us] +/-   61ms
^* 11.12.92.182.in-addr.arpa     2   6   377    12   -833us[-1239us] +/-   13ms

1. M 表示时间源的模式:

  • ^ 表示server。
  • = 表示peer。
  • # 表示local clock,本地时钟。

2. S 表示时间源的状态

  • * 表示current synced,当前同步的
  • + 表示combined,与所选的时间源相结合的可选的时间源。
  • - 表示not combined,被合并算法排除的可接受的时间源。
  • ? 表示unreachable,表示连接不上的、不可达的时间源。
  • x 表示time maybe in error,该时间源的时间与其他时间源的时间不一致。
  • ~ 表示time too variable,表示该时间源的时间变化太大。
  • 3. Name/IP address 时间源的域名、IP地址或Refernce ID。

4. Stratum 时间源的层级。连接有硬件参考时钟(GPS、原子钟等)的计算机是stratum-1,与stratum-1计算机同步的是stratum-2,与stratum-2同步的是stratum-3,依次类推。

5. Poll 表示对时间源进行轮询的频率。Poll 为6,表示每隔2^6=64s(秒)对该时间源轮询,Poll 为9就是每隔2^9=512s(秒)。chronyd会根据情况自动调整轮询频率。

6. Reach 一个8进制数,表示时间源的可达性。每次从时间源收到或丢失数据包时,都会更新该8进制数。值377,表示收到了最后8次传输的所有有效回复。

7. LastRx 表示在多久以前从该时间源收到了最后一个好的时间数据(即Last sample中的时间数据)。通常以秒为单位,字母m、h、d、y分别表示分钟、小时、天、年。

8. Last sample 这一列显示了最后一次测量到的本地时间与时间源之间的偏移量。方括号中的数字表示实际测量的偏移量,可以使用ns(纳秒)、us(微妙)、ms(毫秒)或s(秒)作为后缀。方括号左边的数字显示的是最初的测量值,经过调整后可以应用到本地时钟上。‘+/-’符号后的数字显示的是测量误差。‘+’表示本地时钟比时间源快。

(3)chronyc sourcestats

        sourcestats命令显示关于当前由chronyd检查的每个源的偏移率和预估信息。和sources指令一样,-v参数可以显示额外的行来解释每列的含义。

[root@192 ~]# chronyc sourcestats
210 Number of sources = 4
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
time.cloudflare.com         0   0     0     +0.000   2000.000     +0ns  4000ms
tick.ntp.infomaniak.ch     14   7   843    -47.415    118.180    -24ms    24ms
139.199.214.202            16  10   978     -3.521      6.504  -2061us  2002us
time5.aliyun.com           15   7   977     +0.317      2.954   +489us   988us
[root@192 ~]# chronyc sourcestats -v
210 Number of sources = 4
                             .- Number of sample points in measurement set.
                            /    .- Number of residual runs with same sign.
                           |    /    .- Length of measurement set (time).
                           |   |    /      .- Est. clock freq error (ppm).
                           |   |   |      /           .- Est. error in freq.
                           |   |   |     |           /         .- Est. offset.
                           |   |   |     |          |          |   On the -.
                           |   |   |     |          |          |   samples. \
                           |   |   |     |          |          |             |
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
123.200.159.162.in-addr.>   0   0     0     +0.000   2000.000     +0ns  4000ms
33.73.16.84.in-addr.arpa   15   8   907     -9.388    102.654  -1855us    26ms
139.199.214.202            17  11  1042     -2.538      4.952  -1357us  1836us
11.12.92.182.in-addr.arpa  16   7  1042     +0.537      2.749   +797us   981us
  1. Name/IP address 时间源的域名、IP地址或Refernce ID。
  2. NP 服务器当前保留的样本点的数量。偏移率和偏移值是通过这些样本点进行线性回归计算预估的。
  3. NR 这是最后一次回归计算后,具有相同符号的残差的运行次数。如果这个数字相对于样本的数量开始变得太小,则表明直线不再适合数据。如果运行的次数过低,那么chronyd将丢弃旧的样本并重新运行回归计算,直到运行的次数可以接受为止。
  4. Span 表示最老的样本与最新的样本之前的时间间隔。如果没有显示单位,则单位是s(秒)。
  5. Frequency 估计的时间源的residual frequency。以ppm(百万分之一)为单位。‘+’表示本地时间比时间源快,‘-’表示比时间源慢。
  6. Freq Skew 这是频率的估计误差范围,以ppm(百万分之一)为单位。
  7. Offset 这是估计的时间源的偏移量。
  8. Std Dev 这是估计的样本标准差。

五 配置详解

        Chrony由chronyd与chronyc组成:

  • chronyd: 一个运行在用户空间的守护进程。
  • chronyc: 一个命令行工具,用来监控chronyd的性能,也可以用来在chronyd运行时改变它的运行参数。

        默认情况下chronyd只接受来自本地chronyc实例的命令,但它也可以配置成接受来自远程chronyc实例的命令。远程连接需要被restricted。

1 chronyc安全性,配置chronyd接受远程chronyc指令

        chronyc可以通过以下两种方式访问chronyd:

  • Internet Protocol(IPv4或IPv6);
  • Unix Domain Socket:root和chrony用户可以访问的socket文件。

        默认情况下,chronyc使用第二种方式访问本地的chronyd。socket文件的默认路径为/var/run/chrony/chronyd.sock。假如该方式连接失败时(比如运行chronyc的用户非root或chrony),chronyc会尝试连接127.0.0.1和::1。

        当通过网络连接chronyd时,只有以下这些不影响chronyd运行表现的监控指令允许执行:

  • activity
  • manual list
  • rtcdata
  • smoothing
  • sources
  • sourcestats
  • tracking
  • waitsync

        要使chronyd接受来自远程主机上的chronyc发出的以上指令,需在chronyd配置文件/etc/chrony.conf中配置cmdallow,或在chronyc中使用cmdallow指令配置。默认情况下,chronyd只接受本地chronyc(127.0.0.1和::1)发出的指令。

        chronyc发出的所有其他的指令都只有通过Unix domain socket连接时,才会被chronyd接受。当通过网络发出时(即使是本地127.0.0.1或::1),chronyd会返回Not authorised错误。

# 以下是配置chronyd接受远程主机上的chronyc发出的指令的配置示例

# 修改/etc/chrony.conf配置文件
bindcmdaddress 0.0.0.0    #允许通过IPv4连接
bindcmdaddress ::    #允许通过IPv6连接
cmdallow 192.168.1.0/24    #允许192.168.1.0/24中的主机上的chronyc连接


# 防火墙放通UDP 323端口
firewall-cmd --permanent --zone=public --add-port=323/udp

2 配置文件

        chronyd的默认配置文件为/etc/chrony.conf。chronyd的-f选项可以用来指定一个特殊路径的配置文件。关于chronyd配置文件的所有配置命令,请参考官方文档中的chrony.conf(5)或man 5 chrony.conf。下面介绍一些常用的配置命令。一行中一个指令,这些指令可以在文件中以任何顺序出现,并且有的指令可出现多次。指令不区分大小写。

(1)在配置文件中添加注释

可以在行首添加英文的感叹号’!’,分号’;’,井号’#‘或者百分号’%'来添加注释。

(2) allow

allow指令用来允许一个主机、子网或网络中的ntp客户端来访问该机器,将该机器作为ntp服务器。默认情况下不允许任何ntp客户端访问,也就是说chronyd纯粹作为一个ntp客户端运行。如果使用了allow指令,那么chronyd将既是它的服务器的客户端,也是其他ntp客户端的服务器

# 配置示例allow foo.example.net
allow 1.2    #允许ip为1.2.x.y的客户端访问
allow 3.4.5    #允许ip为3.4.5.x的客户端访问
allow 6.7.8/22    #允许6.7.8.x,6.7.9.x,6.7.10.x和6.7.11.x访问
allow 6.7.8.9/22    #效果同上
allow 2001:db8::/32    #ipv6
allow 0/0    #允许所有ipv4地址访问
allow ::/0    #允许所有ipv6地址访问
allow    #允许所有客户端访问
# 条目顺序执行,配合deny可以进行筛选
# allow指令还有一个特殊用法allow all,它具有更大的效果,这取决于配置文件中指令的顺序。为了说明这一点我们看下面的两个配置示例:

#示例1
allow 1.2.3.4
deny 1.2.3
allow 1.2
# 示例1的配置,表示允许1.2.x.y的客户端访问,阻止其中的1.2.3.x的客户端访问,但是又允许1.2.3.4客户端访问。
#示例2
allow 1.2.3.4
deny 1.2.3
allow all 1.2
# 示例2中的配置,最终会允许1.2.x.y中的所有客户端访问。也就是指令allow all 1.2覆盖了前面deny 1.2.3指令的作用

(3)bindcmdaddress

  • 修改chronyd绑定的用来与chronyc连接的网络接口。默认情况下chronyd与loopback接口绑定(ip为127.0.0.1和::1)
  • 也可用来更改Unix domain command socket文件的路径。这个socket文件必须放置在只有root与chrony用户可访问的文件夹下。如果目录不存在,chronyd启动时会自动创建。默认路径是/var/run/chrony/chronyd.sock。
bindcmdaddress 0.0.0.0
bindcmdaddress ::
bindcmdaddress /var/run/chrony/chronyd.sock

注意:对于ipv4和ipv6两种协议,bindcmdaddress指令各只能使用一次。

(4) cmdallow

与allow指令类似,cmdallow允许控制连接(也就是说允许chronyc连接)而不是NTP客户端连接。语法与allow指令相同。同样的也有一个cmdallow all与allow all类似。

需要注意的是: chronyd必须同时配置bindcmdaddress指令,使chronyd不仅仅监听loopback网卡,来真正允许远程连接。

(5)cmddeny


与cmdallow相反,禁止控制访问。语法与cmdallow相同。同样的,存在cmddeny all。

(6)deny


与allow相反,禁止ntp客户端访问。语法与allow相同。同样的存在deny all。

(7)dumpdir


为了计算时间的增益和损耗率,chronyd必须存储每次使用时间源的测量记录。dumpdir指令用来设定存储测量记录的文件夹。

(8)dumponexit


如果配置了dumponexit,chronyd退出时会保存记录的每个时间源的测量记录。

(9)hwtimestamp


hwtimestamp指令支持硬件时间戳,以实现及其精确的同步。详细信息参考man 5 chrony.conf。

(10) initstepslew

        在正常情况下,当chronyd需要校正系统时钟时,它会通过slew the time的方法来慢慢调整。举例来说:要纠正慢了1秒的系统时钟,chronyd会稍微增加系统时钟在每个时钟中断时前进的时间,直到错误消失为止。注意,使用此方法校正系统时钟,时间不会向后调整。
        在大多数的Unix系统上,都不希望系统时钟步进,因为许多程序依赖于时间单调地向前推进。
        当chronyd启动时,系统时钟可能会出现相当大的错误。试图通过slew the time的方法来纠正错误,可能是非常不明智的,因为通过这种方法纠正可能需要花费数小时。
        initstepslew指令的目的是允许chronyd在启动时快速测量系统时钟的误差,并在正常运行之前通过step the time的方法来纠正误差。因为这通常只在系统启动过程中的特定时间点执行,因此其他应用软件应该不会受到step the time的不利影响。
        如果需要校正的误差小于设定的阀值,就使用slew the time的方法纠正,这使得在系统正常运行时重启chronyd变得更加安全。
        initstepslew指令后的第一个参数就是这个阀值,单位s(秒),后面若干个参数都是ntp服务器列表。列表中的每个服务器都将被快速轮询几次,并使用多数投票机制来查找一个最有可能的系统时钟误差。然后使用step或slew的方式纠正误差。随后chronyd会进入正常工作模式。

initstepslew 30 foo.example.net bar.example.net    
#表示假如系统时钟误差小于30s,就使用slew方法校正;误差大于30s,就使用step方法校正。

        在孤立的LAN局域网络中,选取一台最稳定的计算机作为master timeserver,其他计算机作为master的slave。假如在每个slave上都配置了local指令,那么就可以在master上使用initstepslew指令,并将slave中的某些或全部作为initstepslew指令的参数。如此配置后,当master重启时,slaves可以被依赖,用来在一小段时间内保持时钟,知道master完成重启。
        initstepslew指令的功能类似于makestep指令与server指令加上iburst选项后的组合。主要区别是initstepslew只在正常运行开始之前使用,而前台chronyd进程在退出之前会等待initstepslew完成。这对于防止在chronyd之后启动的进程在时钟步进完成之前读取时钟是很有用的。


(11)local

        local指令用来允许将本地时间作为标准时间授时给其它客户端,即使自己未能通过网络时间服务器同步到真实时间。通常用在独立网络中,在某台作为ntp服务器的主机上配置,为其他需要同步时间的ntp客户端提供时间同步服务。该台主机通过定期手动输入,来保持时间与真实时间一致。

local stratum 10

        值10可以被其他值取代,可选范围为1到15。stratum 1表示计算机具有直接连接的真实时间的参考时间源,例如:GPS、原子钟。这样的计算机的时间与真实时间非常接近。stratum 2表示该计算机有一个stratum 1的计算机作为同步时间源;stratum 3表示该计算机有一个stratum 10的计算机作为同步时间源。选择stratum 10,这个值是比较大的,表示距离具有真实时间的服务器比较远,它的时间是不太可靠的。换句话说,假如该计算机可以连接到一台最终与真实时间同步的计算机,那么该计算机的stratum层级几乎可以肯定比10小。因此,为local命令选取stratum 10这样的大数值,可以防止机器本身的时间与真实时间混淆,可以保证该机器不会将本身的时间授时给那些可以连接同步到真实时间的ntp服务器的ntp客户端。

(12)log

        log指令设定日志记录哪些信息。log 指令有以下几个可选值:

  • measurements 此选项记录原始NTP测量及相关信息到一个名为measurements.log的文件。
  • statistics 此选项记录有关回归处理(regression processing)的信息到一个名为statistics.log的文件。
  • tracking 此选项记录时间的增益或损耗率的变化,以及所做的更改到tracking.log文件。
  • rtc 此选项记录有关系统RTC时钟的信息。
  • refclocks 此选项记录原始的和过滤的参考时钟的测量信息到refclocks.log文件。
  • tempcomp 此选项记录温度测量信息以及系统速率补偿信息到tempcomp.log文件。

        以上日志文件均存储在logdir指令设定的目录下。关于以上日志文件的格式,参看以下文档:

1. Measurements log file format
2. Statistics log file format
3. Tracking log file format
4. Real-time clock log file format
5. Refclocks log file format
6. Tempcomp log file format

log measurements statistics tracking

(13)logdir

设定日志文件的存储路径。

logdir /var/log/chrony

(14)makestep

        通常chronyd会通过减缓或加快时钟来纠正系统的时间偏移。在某些情况下,系统时钟可能会与真实时间偏差很多,此时,修正系统时钟将需要很长的时间。步进时钟(时间挑边)可以快速修正偏差较大的时间误差,但是有可能会导致一些程序异常,因此应当慎用这个选项。makestep指令用来配置步进时钟。

        其后的第一个数值表示允许使用步进时钟的时钟偏差的最小值,单位秒(s)。也就是说当时钟偏差大于该数值时,使用步进时钟来快速调整时间偏差。
        第二个数值表示,允许chronyd在启动后的前几次更新时间中使用步进时钟来修正时间偏差。第二个数值为负,不限制更新次数。

makestep 1000 10   
# 假如时间偏差大于1000s,允许在前10次时钟更新中使用步进时钟来修正偏差

(15)manual

        使得可以在chronyc中使用settime命令手动设置时间。manual指令后没有参数。

(16) maxchange

        maxchange指令后的第一个数值表示,时间更新时可修正的最大时间偏差,单位秒(s)。第二个数值表示不检查前几次时钟更新的偏差值,以允许chronyd初始时可以修正较大的时间偏差。第三个数字,表示当时间偏差查过指定的最大值的情况出现时,忽略时间偏差大于最大偏差值的次数。当出现时间偏差值大于设定最大值情况的次数大于第三个数值时,chronyd会退出并在syslog中记录日志。第三个数值为负表示chronyd永远不退出。

maxchange 1000 1 2    
#时间偏差最大值为1000s,不检查第一次时间更新时的时间偏差
#当出现时间偏差值大于1000s两次后,chronyd退出并在syslog中记录日志

(17)maxupdateskew

        chronyd的任务之一是计算计算机时钟相对于它的参考时间源快多少或慢多少。此外chronyd还计算估计值周围的误差范围。
        如果误差范围太大,可能说明测量还没有确定,估计的增益或损耗率还不是很可靠。
        maxupdateskew参数设定一个阀值来确定估计值是否过于不可靠,以至于不应该使用它。默认情况下,阀值是1000ppm。

maxupdateskew <skew-in-ppm>
# 对于使用电话线拨号连接到服务器的,典型值为100;而LAN网络中的计算机的典型值是5或10。

应当指出的是,这不是防止使用不可靠估计值的唯一方法。在任何时候,chronyd在预估是会同时跟踪估计的增益损耗率以及误差范围。当从多个时间源中的一个测量产生新估计值,加权组合算法会用于更新主估计。因此,如果chronyd具有现有的高度可靠的主估计,并产生一个新的估算值,其具有大的误差范围,那么现有的主估计将主导新的主估计。(水平有限,可参考man 5 chrony.conf或官网文档英文原文)

 (18)minsources

        该参数设置在本地时钟更新之前,时间源选择算法中需要考虑的可选的时间源的最小数量,默认值是1。
        将此选项设置为更大的数值,可用于提高可靠性。更多的时间源将不得不彼此协商一致,并且当只有一个时间源(该时间源提供的时间可能是不正确的)可达时,本地时钟将不会更新。


(19)noclientlog       

        noclientlog指令不带参数,它设置chronyd不记录客户端访问日志。
        通常情况客户端访问日志是被记录的,并且使用chronyc的clients命令可以报告客户端访问的统计数据。

(20)reselectdist

        当chronyd从可用时间源中选择一个同步源时,它会选择距离最短的那一个。但是,为了避免在有相近距离的源中频繁的重新选择,会在当前没有选择的源的距离上增加一个固定距离。这可以使用reselectdist指令设置。默认情况,该指令的值是100ms。

reselectdist <dist-in-seconds>

 (21)stratumweight

        stratumweight指令设置当chronyd从可用时间源中选择同步源时,每一stratum应添加多少同步距离。
        默认情况下,该值是0.001秒。这意味着,在选择同步源的过程中,只有当时间源距离之间的差异以毫秒为单位时,时间源的stratum才有意义。在chronyd选择同步时间源时,即使处于stratum低层次的时间源距离更远,也比另一个处于stratum高层次的时间源更容易被选中。将stratumweight设置为0时,可以使chrongyd选择时间源时忽略stratum层次。

stratumweight <dist-in-seconds>

 (22)rtcfile

        rtcfile指令用来设置保存与跟踪RTC准确性相关的参数的文件名称。

rtcfile /var/lib/chrony/rtc

注意:
        当chronyd退出或chronyc发出writertc命令时,chronyd将信息(RTC错误,RTC错误发生时间以及RTC增益或损耗率)存储入这个文件中。到目前为止对于RTC时钟的支持是有限的,你只能在满足下列条件的系统上使用rtcfile指令以及chronyd命令的-s选项:

  • 操作系统是Linux。
  • 内核编译时包括了扩展RTC时钟支持(即/dev/rtc设备能够够执行有用的东西)。
  • 没有其他应用程序需要使用/dev/rtc。

 (23)rtcsync

        rtcsync指令使得chronyd定期将系统时间复制到RTC时钟,并且不再尝试跟踪RTC时钟的偏移。rtcsync指令无法与rtcfile指令一起使用。
        在Linux系统上,内核每过11分钟复制系统时间到RTC时钟。
        在macOS系统上,当系统时间处于同步状态时,chronyd每过60分钟复制系统时间到RTC时钟。
        在其他系统上rtcsync指令什么也不会做。

转载至Linux ❉ Chronyd时间同步服务器详解_wangjie722703的博客-CSDN博客_chronyd

Logo

更多推荐