介绍在Rocky Linux上使用chrony服务与外部NTP服务器进行时间同步的方法。NTP(NetworkTimeProtocol)的标准端口为123(UDP)。
时间同步(NTP)是使整个系统正常工作的一个基本功能。假设软件(例如PostgreSQL等数据库)的正常运行基于系统时间的正确性,如果系统时间不正确,系统将会无法正常运行。时间同步非常重要,系统工程师需要掌握NTP的工作原理。
Rocky Linux上采用的chrony是实现NTP客户端与NTP服务器端软件。采用与ntpd不同的时间同步算法,提供更有效和准确的时间同步。详细信息参照chrony官网。
chronyd与ntpd
- NTP的版本不同
chronyd为NTP版本3(RFC 1305),ntpd为版本4(RFC 5905)。 -
硬件时钟的同步
chronyd可与硬件时钟进行同步,而ntpd无法与硬件时间同步。 -
slew模式与slew rate
ntpd与chronyd同样有2个运行模式,step模式和slew模式。(chronyd的默认模式为step模式)
ntpd的slew rate为500(msec/sec)的固定rate,而chronyd的slew rate(默认83333.333(msec/sec))可进行变更。 -
使用端口
ntpd使用端口123是固定的,而chronyd可以修改默认端口123。
安装chrony
Rocky Linux默认已安装chrony服务,如果没有安装的话,使用dnf命令进行安装。
首先rpm -qa | grep chrony命令确认chrony是否安装,下面的结果是已安装chrony。
如果没有安装chrony执行 dnf install chrony 命令进行安装。
# dnf install chrony
/etc/chrony.conf文件
/etc/chrony.conf是chrony的配置文件,chrony.conf的默认设定如下。
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool 2.pool.ntp.org iburst
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3
# Enable kernel synchronization of the real-time clock (RTC).
rtcsync
# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *
# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2
# Allow NTP client access from local network.
#allow 192.168.0.0/16
# Serve time even if not synchronized to a time source.
#local stratum 10
# Specify file containing keys for NTP authentication.
keyfile /etc/chrony.keys
# Get TAI-UTC offset and leap seconds from the system tz database.
leapsectz right/UTC
# Specify directory for log files.
logdir /var/log/chrony
# Select which information is logged.
#log measurements statistics tracking
如下修改/etc/chrony.conf文件的内容。
# vi /etc/chrony.conf
pool ntp.aliyun.com iburst
pool ntp1.aliyun.com iburst
driftfile /var/lib/chrony/drift
#makestep 1.0 3
rtcsync
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /var/log/chrony
leapsecmode slew
maxslewrate 1000
smoothtime 400 0.001024 leaponly
- pool
指定时间同步的NTP服务器,chrony的默认设定指定了外部的NTP服务器,不进行修改也能正常运行。企业内部通常会搭建DNS服务器,当NDS解析器(DNS Resolver)使用。近年来DNS使用DNSSEC(使用SSL)的企业越来越多,这就要求DNS服务器自身的时间必须是正确的(使用SSL的原因)。外部的NTP服务器通常会指定FQDN,假设因时间未同步导致DNS解析失败,进一步导致整个系统的时间同步失败。可以的话,NTP推荐指定IP地址而非FQDN。外部的NTP服务器在这里指定阿里云对外公开的NTP服务 阿里云NTP服务器
iburst(Initial Burst)是chrony启动时,将在短时间内向NTP服务器连续进行4次查询,收集尽可能多的样本用于统计信息。
-
driftfile
全路径的形式指定driftfile,drift是评估硬件时钟存在的固有偏差,并自动对此进行修补。 -
makestep
chrony启动后,如果在前3次的查询种检测到与NTP服务器的时间差异在1秒以上,运行于STEP模式,立即纠正时间。上述以外会运行于SLEW模式渐进式进行时间纠正。当运行PostgreSQL/Oracle等数据库时需要注意,STEP模式下立即纠正时间(服务器的时间为10:00,NTP时间为09:55,服务器时间将会被同步到09:55)可能会导致数据库无法正常运行。在这里注释makestep。 -
rtcsync
RTC将会每隔11分钟更新real-time clock(硬件时钟),推荐设定。 -
keyfile
NTP版本3以后可用的用于NTP认证的秘钥文件,NTP认证时由客户端向服务器端进行。 -
leapsecmode
关于闰秒的设定,chrony的推荐值。 -
logdir
指定保存NTP日志的目录。 -
maxslewrate
与leapsecmode一样。 -
leapsecmode
与leapsecmode一样。
chronyd服务
systemctl命令重启chronyd服务,执行 systemctl restart chronyd 命令。
确认chronyd服务是否设定为开机自动启动,执行 systemctl is-enabled chronyd 命令,如下图显示 enabled 为已设定为开机自动启动。
如果没有被设定为开机自动启动,执行 systemctl enable chronyd 命令设定为开机自动启动。
chrony相关命令
chronyc sources命令,显示与NTP服务器的时间同步状态
chronyc sources命令是替代ntpd的 nptq -p 命令。
MS列的第一个M列的 ^ 表示NTP服务器,第二个S列的 * 表示现在正在进行同步的NTP服务器, + 表示同步备选NTP服务器, – 表示非备选NTP服务器。通过以上信息可确认到当前的时间同步情况。输出了关于自身状态的信息。
chronyc tracking
“chronyc sources”命令可查看与NTP服务器的时间同步状态,而”chronyc tracking”可跟踪服务器自身的状态。”chronyc tracking”执行结果如下,
手动执行时间同步
chrony设定为slew模式,但是有可以强制与系统时钟进行同步(step模式)。执行 chronyc -a makestep 命令。
轮询(polling)间隔
默认的轮询间隔为minpoll 6,maxpoll 10,与NTP一样这个值为 2n,既minpool为64秒,maxpoll为1024秒。
通过修改/etc/chrony.conf文件修改轮询间隔,如果修改默认设定的话,为了保持时间精度,推荐设定比默认的值更小的值。
server <NTP server address> minpoll 5 maxpoll 9
介绍了Rocky Linux上设定chrony服务的方法。在Cloud(通常Cloud服务提供商的镜像已设定时间同步)上没有存在感的时间同步服务,在VMware Workstation或者Onpre上运行的系统来说是必须设定的重要服务。