Chrony简介
Chrony是一个开源自由的网络时间协议 NTP (Network Time Protocol) 的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器(NTP)同步,因此让你的计算机保持精确的时间,Chrony也可以作为服务端软件为其他计算机提供时间同步服务。
Chrony由两个程序组成,分别是chronyd和chronyc;chronyd是一个后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算机增减时间的比率,并对此进行补偿;chronyc提供了一个用户界面,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计算机上工作,也可以在一台不同的远程计算机上工作。
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
|