Chrony简介
Chrony是一个开源自由的网络时间协议 NTP (Network Time Protocol) 的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器(NTP)同步,因此让你的计算机保持精确的时间,Chrony也可以作为服务端软件为其他计算机提供时间同步服务。
Chrony由两个程序组成,分别是chronyd和chronyc;chronyd是一个后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算机增减时间的比率,并对此进行补偿;chronyc提供了一个用户界面,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计算机上工作,也可以在一台不同的远程计算机上工作。
Chrony服务器搭建
Chrony的配置文件是/etc/chrony.conf
egrep -v "^$|^#" /etc/chrony.conf
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | # 上级时钟源服务器地址server ntp.ntsc.ac.cn  iburst minpoll 4 maxpoll 6 prefer
 server ntp.aliyun.com  iburst minpoll 4 maxpoll 6
 server cn.ntp.org.cn   iburst minpoll 4 maxpoll 6
 server ntp.tencent.com iburst minpoll 4 maxpoll 6
 # iburst 表示当一个运程NTP服务器可用/不可用时,向它发送一系列的并发包进行检测。
 # minpoll 表示最小轮询时间,4表示2^4=16s;
 # maxpoll 表示最大轮询时间 2^6=64s; (默认minpoll 6 maxpoll 10)
 # prefer 表示优先使用该时间服务器。
 
 # 系统时钟频率都有小小的误差,这个就是为什么计算机运行一段时间后时间会不精确。NTP会自动来监测我们时钟的误差值并予以调整,所以它会把记录下来的误差先写入driftfile,重新启动系统后,之前的计算结果也就不会丢失了。
 driftfile /var/lib/chrony/drift
 makestep 1.0 3
 rtcsync
 # 允许客户端访问的地址范围
 allow 192.168.111.0/24
 #允许Linux服务器成为实时NTP服务器,即使server端无法从互联网同步时间,也同步本机时间至client
 local stratum 10
 # Chrony的日志文件
 logdir /var/log/chrony
 
 | 
启动服务&设置开机自启动
| 12
 
 | systemctl start chronydsystemctl enable chronyd
 
 | 
防火墙允许服务
| 12
 
 | firewall-cmd --permanent --add-service=ntpfirewall-cmd --reload
 
 | 
Chrony客户端安装
| 12
 3
 4
 
 | yum -y install chronyecho "server 192.168.111.128 iburst" >> /etc/chrony.conf
 systemctl start chronyd
 systemctl enable chronyd
 
 | 
测试Chrony
手动同步chrony时间
就像ntpdate -u ntpserver命令一样,我们可以使用chronyd手动将Linux服务器的时间与远程NTP服务器进行同步。
| 1
 | chronyd -q ‘server {ntp_server_name} iburst’
 | 
验证 chrony 的同步
用于查看本机和上级时钟源同步的状态
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | [root@s1 ~]# chronyc trackingReference ID    : CB6B0658 (203.107.6.88)	#上级时钟源的ID号(域名或IP)
 Stratum         : 3		#本机所在的层级(1-15)。这里是3,上级时钟源在第2层
 Ref time (UTC)  : Mon Feb 13 11:26:22 2023	#最后一次同步到上级时钟源的时间
 System time     : 0.000001052 seconds fast of NTP time	#由于chrony慢同步导致的时间偏差
 Last offset     : -0.001335315 seconds	#最后一次同步上级时钟源,测出的和上级时钟源的偏差
 RMS offset      : 0.001335315 seconds	#偏移量的长期平均值
 Frequency       : 0.102 ppm slow	#频率。表示本机发生错误的速度,如果chrony服务不纠正时间错误,怎会按照这个速度一直错下去
 Residual freq   : +66.280 ppm
 Skew            : 1.828 ppm				#频率的误差范围
 Root delay      : 0.048356328 seconds	#和一级时钟源的网络延时
 Root dispersion : 0.006139259 seconds	#累计到一级时钟源的色散,用于计算时间误差
 Update interval : 1.4 seconds	#和上级时钟源更新时间的间隔
 Leap status     : Normal	#跳变状态。Normal为正常,其他都不正常
 
 | 
查看和上级时钟源的一些基础信息
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 
 | [root@s1 ~]# chronyc ntpdata
 Remote address  : 114.118.7.163 (727607A3)	#真正同步的商机时钟源ip
 Remote port     : 123	#上级时钟源使用的端口
 Local address   : 192.168.111.128 (C0A86F80)	#本机用于和上级时钟源同步使用的ip
 Leap status     : Normal	#跳跃状态,和tracking一样,normal正常
 Version         : 4		#上级时钟源使用的ntp时钟源版本
 Mode            : Server	#上级时钟源的模式,^表示server,#表示local,=表示peer对端
 Stratum         : 2	#上级时钟源的层级
 Poll interval   : 6 (64 seconds)	#和上级时钟源同步时间的间隔,6表示2^6=64秒
 Precision       : -22 (0.000000238 seconds)
 Root delay      : 0.079330 seconds #到一级时钟源(根时钟源)的网络延迟
 Root dispersion : 0.142868 seconds #累计到根时钟源的色散总和
 Reference ID    : 7B8B2103 ()
 Reference time  : Mon Feb 13 10:37:07 2023	#最后一次和上级时钟源同步到的时间
 Offset          : +0.004998442 seconds	#和上级时钟源的偏移量
 Peer delay      : 0.062938333 seconds	#到对端的延迟
 Peer dispersion : 0.000001180 seconds	#累计到对端的色散
 Response time   : 0.000019070 seconds	#请求包发给上级时钟源,上级时钟源在返回响应包之前等待的时间
 Jitter asymmetry: +0.50	#表示和上级时钟源发送请求包,接收响应包的网络延迟,-号表示发送请求包的延迟,+号表示接收响应包的延迟
 NTP tests       : 111 111 1101
 Interleaved     : No
 Authenticated   : No
 TX timestamping : Kernel
 RX timestamping : Kernel
 Total TX        : 21	#向上级时钟源发送的请求包总数
 Total RX        : 17	#收到的上级时钟源返回的相应包总数
 Total valid RX  : 17	#收到的上级时钟源返回的有效响应包总数
 
 | 
检查 chrony 来源
列出有关chronyd使用的当前时间源的信息
| 12
 3
 4
 5
 6
 7
 8
 
 | [root@s1 ~]# chronyc sources 210 Number of sources = 4
 MS Name/IP address         Stratum Poll Reach LastRx Last sample
 ===============================================================================
 ^- 114.118.7.163                 2   6   277    29    -12ms[  -12ms] +/-  168ms
 ^+ 203.107.6.88                  2   6   377    32  -1364us[-1364us] +/-   25ms
 ^* 49.7.178.213                  2   6   107    72   +105us[  -73us] +/-   18ms
 ^+ 106.55.184.199                2   6   377    90  +4271us[+4108us] +/-   29ms
 
 | 
列出有关chronyd使用的每个源的漂移速度和偏移估计的信息
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | [root@s1 ~]# chronyc sources -v210 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
 ===============================================================================
 ^- 114.118.7.163                 2   6   277    45    -12ms[  -12ms] +/-  168ms
 ^+ 203.107.6.88                  2   6   377    48  -1364us[-1364us] +/-   25ms
 ^* 49.7.178.213                  2   6   107    88   +105us[  -73us] +/-   18ms
 ^+ 106.55.184.199                2   6   377   106  +4271us[+4108us] +/-   29ms
 
 | 
输出信息详解:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 
 | 第一列M:这表示信号源的模式。
 ^表示服务器;
 =表示对等方;
 #表示本地连接的参考时钟。
 
 第二列S:
 \*号:表示和上级时钟源同步正常;
 +号:备用的、网络正常可达的、被 chrony 算法认可的上级时钟源,*号的时钟源同步异常,首选+号的时钟源;
 -号:网络正常可达的、但是不被 chrony 算法认可的上级时钟源。*号的时钟源有问题,不会选择-号的;
 ?号:表示网络不可达、同步异常的上级时钟源。出问题就是?号。
 x 号:网络正常可达,但是被 chrony 认为时间错误的上级时钟源。一般多个时钟源出现脑裂,客户端看到就是 x 号;
 
 第三列Name/IP address:
 这显示了源的名称或IP地址,或参考时钟的参考ID。
 
 第四列 Stratum:
 这显示了来源的层,如其最近收到的样本中所报告的那样。层1表示一台具有本地连接的参考时钟的计算机。与第1层计算机同步的计算机位于第2层。与第2层计算机同步的计算机位于第3层,依此类推。
 
 第五列 Poll:
 这显示轮询源的速率,以秒为单位的时间间隔的以2为底的对数。因此,值为6表示每64秒进行一次测量。chronyd会根据当前情况自动更改轮询速率。
 
 第六列 Reach:
 这显示了源的可达性寄存器以八进制数字打印。寄存器有8位,并在每个从源接收或丢失的数据包上更新。值377表示从最后八次传输中收到了对所有用户的有效答复。
 
 第七列 LastRx:
 此列显示多长时间前从来源接收到了最后一个好的样本(在下一列中显示)。未通过某些测试的测量将被忽略。通常以秒为单位。字母m,h,d或y表示分钟,小时,天或年。
 
 第八列 Last sample:
 此列显示上次测量时本地时钟与源之间的偏移。方括号中的数字表示实际测得的偏移量。可以用ns(表示纳秒),us (表示微秒),ms(表示毫秒)或s(表示秒)作为后缀。方括号左侧的数字表示原始测量值,已调整为允许此后施加于本地时钟的任何摆度。
 
 +/-指示器后面的数字表示测量中的误差范围。正偏移表示本地时钟位于源时钟之前。
 
 | 
批量服务器时间同步
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | #!/bin/bash#不连续ip地址可以使用数组的方式生成
 #list=(50 60 70 80)
 #for i in ${list[@]};
 #连续的ip地址可以使用seq列表的方式生成
 for i in `seq 1 254`
 do
 ip=192.168.111.$i
 ping -c1 $ip &> /dev/null
 if [ $? -eq 0 ]; then
 echo "$ip is up~"
 sshpass -p password ssh -o StrictHostKeyChecking=no root@$ip "yum -y install chrony && sed -i '/server / s/^\(.*\)$/#\1/g' /etc/chrony.conf && echo 'server 192.168.111.128 iburst' >> /etc/chrony.conf && systemctl restart chronyd && systemctl enable chronyd"
 else
 echo "$ip is down."
 fi
 done
 
 |