0%

搭建Chrony时间同步服务器

Chrony简介

Chrony是一个开源自由的网络时间协议 NTP (Network Time Protocol) 的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器(NTP)同步,因此让你的计算机保持精确的时间,Chrony也可以作为服务端软件为其他计算机提供时间同步服务。

Chrony由两个程序组成,分别是chronyd和chronyc;chronyd是一个后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算机增减时间的比率,并对此进行补偿;chronyc提供了一个用户界面,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计算机上工作,也可以在一台不同的远程计算机上工作。

Chrony服务器搭建

1
yum -y install chrony

Chrony的配置文件是/etc/chrony.conf

egrep -v "^$|^#" /etc/chrony.conf

1
2
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

启动服务&设置开机自启动

1
2
systemctl start chronyd
systemctl enable chronyd

防火墙允许服务

1
2
firewall-cmd --permanent --add-service=ntp
firewall-cmd --reload

Chrony客户端安装

1
2
3
4
yum -y install chrony
echo "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 的同步

用于查看本机和上级时钟源同步的状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@s1 ~]# chronyc tracking
Reference 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为正常,其他都不正常

查看和上级时钟源的一些基础信息

1
2
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使用的当前时间源的信息

1
2
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使用的每个源的漂移速度和偏移估计的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@s1 ~]# 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
===============================================================================
^- 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

输出信息详解:

1
2
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(表示秒)作为后缀。方括号左侧的数字表示原始测量值,已调整为允许此后施加于本地时钟的任何摆度。

+/-指示器后面的数字表示测量中的误差范围。正偏移表示本地时钟位于源时钟之前。

批量服务器时间同步

1
2
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