当前环境
Rocky Linux 9.1 x86-64
chrony version 4.2
chrony 是网络时间协议 NTP (Network Time Protocol) 的改进,提供更快、更精准的时钟同步服务且兼容ntp,自RHEL7开始提供,从 RHEL8 开始,NTP 协议由 chronyd 守护进程实现,不再支持ntpdate。
chrony 包括 chronyd
(一个在用户空间运行的守护进程)和 chronyc(可用来监控 chronyd
性能并在运行时更改各种操作参数的命令行程序)。
chrony 守护进程(chronyd
) 可以由命令行工具 chronyc 监控和控制。这个工具提供了一个命令提示,允许输入大量命令来查询 chronyd
的当前状态并修改其配置。在默认情况下,chronyd
只接受来自本地 chronyc 实例的命令,但它也可以被配置为接受来自远程主机的监控命令。应该限制远程访问。
chronyd 运行于 UDP323 端口,ntp运行于 UDP123 端口,使用chrony服务可以同时为chrony客户端和ntp客户端提供服务。
服务unit文件: /usr/lib/systemd/system/chronyd.service
相关命令
查看日期时间、时区及 NTP 状态
# timedatectl
Local time: Tue 2023-01-31 10:08:26 CST
Universal time: Tue 2023-01-31 02:08:26 UTC
RTC time: Tue 2023-01-31 02:08:29
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
Local time: 本地时间,初始值来自于RTC,由内核维护,系统启动之后和RTC就没有关系,通常等于RTC+时区值(如本地时间= RTC + 8小时)
Universal time: 系统时间永远是UTC,在应用程序使用的时候转换为本地时间
RTC(real-time clock)time: 指硬件时间,一般是主板上的特殊电路,专用于记录时间,有电池供电,不受服务器和操作系统的开启关闭影响。也称作BIOS时间。
Time zone: 本地时区,即服务器所在的时区,在中国通常使用 Asia/Shanghai
。
RTC in local TZ: 设置RTC时间,为"no"表示未设置
# 默认情况下,系统配置为使用UTC,也可使用本地时间
timedatectl set-local-rtc true # 将RTC设置为本地时间
timedatectl set-local-rtc false # 将RTC设置为UTC
NTP service: active 状态为“active”,表示开启系统时钟与远程ntp服务器同步,相关命令(打开/关闭):
timedatectl set-ntp true/flase
System clock synchronized: yes
为“yes”,表示同步外部NTP服务时间完成。
使用 chronyc 命令行工具控制 chronyd
使用 chronyc 所做的更改会在 chronyd
重启后丢失。要永久更改,请修改 /etc/chrony.conf
。
查看帮助
chronyc help
检查是否同步 chrony
检查 chrony 跟踪
chronyc tracking
查看服务器时间和NTP server偏差
# chronyc tracking |grep System
System time : 0.000116025 seconds slow of NTP time
查看时间同步源,使用可选参数 -v 来包括详细信息。
chronyc sources
chronyc sources -v
检查的每个源的偏移率和误差估算过程的信息。要检查 chrony 源的统计信息,请运行以下命令:
chronyc sourcestats
chronyc sourcestats -v
显示有多少NTP源在线/离线
chronyc activity
立即手动同步时间(需要chronyd服务运行)
chronyc makestep
或
chronyc -a makestep
像 ntpdate 一样手动同步时间
使用参数 -q (运行服务执行后停止服务)
chronyd -q 'pool time.windows.com iburst'
临时添加一台时间同步服务地址(不会写入配置中),chronyc sources
chronyc add server time.windows.com
最后一步,将当前时间和日期写入BIOS,避免重启后失效
hwclock -w
显示 BIOS 中实际的时间
hwclock --localtime
设置时区
查看时区列表
timedatectl list-timezones
timedatectl list-timezones | grep -E “Asia/Sh.*”
修改时区为上海
timedatectl set-timezone Asia/Shanghai
修改日期时间(可以只修改其中一个)
timedatectl set-time “2023-01-31 10:00:20”
更改当前日期 timedatectl set-time YYYY-MM-DD
更改当前时间 timedatectl set-time HH:MM:SS
启动chrony服务
systemctl start chronyd.service
设置开机启动
systemctl enable chronyd.service
如果需要作为NTP Server提供给其它服务器作为时间同步务,则需要开放123/UDP端口。如:
firewall-cmd --add-service=ntp --permanent
firewall-cmd --reload
# 如果需要从远程系统连接,开启端口 323
firewall-cmd --permanent --add-port=323/udp
查看已访问本机NTP服务的客户端列表
chronyc clients
chrony 配置说明
server :指明时间服务器地址,可以添加多个
ibust 会在 chrony 启动的2秒内,去快速poll服务器4次来快速矫正当前系统时间。 prefer 优先使用指定的服务器 minpoll 6,缺省是6,意思是2的6次方,也就是64秒,最小轮询时间服务器的时间间隔是64秒 maxpoll 10,缺省是10,同上,2的10次方,也就是1024秒,最大轮询时间间隔是1024秒 通常情况下一过minpoll的时间周期,就会触发一次时间同步询问。
pool :新版本出现,可能是代表一组 server 的意思,就是不用写多个server配置。 by jetlam 理解补充
rtcsync :把系统时钟同步到主板的硬件时钟(RTC)去,缺省情况下是11分钟同步一次。
makestep : 正常情况下如果系统时钟跟时间服务器不一致,chrony调整的方式是慢慢增加,或慢慢减少,不会一步到位,直接去跟时间服务器对齐。
例如:makestep 1.0 3
,意思就是如果时间服务器跟系统时间相差1秒,那么就在下3个时钟更新中追上时间服务器。
这样就会立刻快速追平了,这样会带来时间跳跃。
logchange
例如:logchange 0.5
,意思是如果chrony调整的系统时间,超过了0.5秒的时长,就会发一条消息到syslog,这样我们就能在/var/log/messages里看到这条消息了。
driftfile : 根据实际时间计算出计算机增减时间的比率,将它记录到一个文件中,会在重启后为系统时钟作出补偿。 allow NETADD/NETMASK 自己作为ntp服务器,让客户端来同步自己的时间。 allow all:允许所有客户端主机; deny NETADDR/NETMASK deny all:拒绝所有客户端; cmdallow / cmddeny : 可以指定哪台主机可以通过chronyd使用控制命令。 bindcmdaddress : 允许chronyd监听哪个接口来接收由chronyc执行的命令。 local stratum 10 :即使server指令中时间服务器不可用,也允许将本地时间作为标准时间授时给其它客户端。
配置示例:/etc/chrony.conf
## 例如:添加两个时间源,分别是阿里云和东北大学、微软的时间同步服务器,iburst表示加急
server time1.aliyun.com iburst prefer minpoll 6 maxpoll 10
server time.neu.edu.cn iburst
server time.windows.com 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.
# chronyd根据需求减慢或加速时间调整,
# 在某些情况下系统时钟可能漂移过快,导致时间调整用时过长。
# 该指令强制chronyd调整时期,大于某个阀值时(例如1秒)步进调整系统时钟。
# 只有在因chronyd启动时间超过指定的限制时(可使用负值来禁用限制)没有更多时钟更新时才生效。
makestep 1.0 3
# Enable kernel synchronization of the real-time clock (RTC).
# 将启用一个内核模式,在该模式中,系统时间每11分钟会拷贝到实时时钟(RTC)。
rtcsync
# Enable hardware timestamping on all interfaces that support it.
# 通过使用hwtimestamp指令启用硬件时间戳
#hwtimestamp *
# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2
# Allow NTP client access from local network.
# 指定一台主机、子网,或者网络以允许或拒绝NTP连接到扮演时钟服务器的机器
#allow 192.168.0.0/16
allow all
# Serve time even if not synchronized to a time source.
#local stratum 10
# Specify file containing keys for NTP authentication.
# 指定包含NTP验证密钥的文件。
#keyfile /etc/chrony.keys
# Specify directory for log files.
# 指定日志文件的目录。
logdir /var/log/chrony
# Select which information is logged.
# 选择日志文件要记录的信息
#log measurements statistics tracking
如果chrony仅是作为NTP client,那最小配置 chrony.conf 只需要配置如下:
What is the minimum recommended configuration for an NTP client?
如仅配置为NTP client方式,同步外部NTP Server。
pool 2.rocky.pool.ntp.org iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
一些解释:
示例: chronyc sourcestats -v
# chronyc sourcestats -v
.- 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
==============================================================================
stratum2-1.ntp.mow01.ru.> 4 3 7 +109.899 2154.711 +4293us 233us
ntp.wdc2.us.leaseweb.net 4 4 9 +1351.895 55584.047 +64ms 9147us
sv1.ggsrv.de 4 3 7 +633.265 15331.828 -1639us 1955us
119.28.206.193 4 3 6 +965.101 32095.979 +51ms 4542us
- Name/IP address 时间源的域名、IP地址或Refernce ID。
- NP 服务器当前保留的样本点的数量。偏移率和偏移值是通过这些样本点进行线性回归计算预估的。
- NR 这是最后一次回归计算后,具有相同符号的残差的运行次数。如果这个数字相对于样本的数量开始变得太小,则表明直线不再适合数据。如果运行的次数过低,那么chronyd将丢弃旧的样本并重新运行回归计算,直到运行的次数可以接受为止。
- Span 表示最老的样本与最新的样本之前的时间间隔。如果没有显示单位,则单位是s(秒)。
- Frequency 估计的时间源的residual frequency。以ppm(百万分之一)为单位。‘+’表示本地时间比时间源快,‘-’表示比时间源慢。
- Freq Skew 这是频率的估计误差范围,以ppm(百万分之一)为单位。
- Offset 这是估计的时间源的偏移量。
- Std Dev 这是估计的样本标准差。
示例:chronyc tracking
# chronyc tracking
Reference ID : 78197314 (120.25.115.20)
Stratum : 3
Ref time (UTC) : Fri Feb 03 03:07:49 2023
System time : 0.000027453 seconds slow of NTP time
Last offset : -0.000000803 seconds
RMS offset : 0.000131008 seconds
Frequency : 3.193 ppm slow
Residual freq : -0.000 ppm
Skew : 0.034 ppm
Root delay : 0.005342438 seconds
Root dispersion : 0.001951937 seconds
Update interval : 1027.7 seconds
Leap status : Normal
- Reference ID: 与之进行同步的ntp服务器的参考ID(一串16进制数字)和名称(或ip地址)
- Stratum: 与附加硬件参考时钟的计算机(stratum-1)的距离。本机是stratum-3,也就是说139.199.215.251是stratum-2。
- Ref time (UTC): 来自参考时间源的最后测量的UTC时间
- System time: 正常情况下,chronyd默认不会步进调整时钟,因为时间的跳跃会有对某些应用程序造成不良后果的风险。相反,系统时钟的偏差是通过略微加快或减慢系统时钟的方式来调整,知道消除偏差,然后返回系统时钟的正常速度。这样做的结果是,将会有一段时间,系统时钟(由其他程序读取的)会和chronyd估计的当前真实时间(当chronyd作为ntp服务器时,报告给其他ntp客户端的时间)不一样。这一行显示的值是这两个时间的差值。
- Last offset: 最后一次时钟更新时估计的本地偏移量
- RMS offset: 偏移量的长期平均值
- Frequency: 如果chronyd不进行校正,系统时钟出错的频率。它以ppm表示(百万分之几)。例如:1ppm表示当系统时钟认为前进了1秒时,它实际上相对于真实时间前进了1.000001秒。
- Residual freq: 当前选择的参考时间源的‘residual frequency’。表示从参考时间源测量到的频率与当前使用的频率之间的差值。
- Skew: 频率上的估计误差范围
- Root delay: 本计算机到最终同步的stratum-1计算机的网络路径延迟的总和。
- Root dispersion: 通过所有经过的计算机,回到最终同步的stratum-1计算机累积的总弥散。
- Update interval: 最后两次时钟更新的时间间隔
- Leap status: 可能值为Normal、Insert second、Delete second、Not synchronized
- UTC
整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。 - GMT
格林威治标准时间 (Greenwich Mean Time)指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。(UTC与GMT时间基本相同) - CST
中国标准时间 (China Standard Time) - DST
夏令时(Daylight Saving Time) 指在夏天太阳升起的比较早时,将时间拨快一小时,以提早日光的使用。(中国不使用) - RTC
(Real-Time Clock)或CMOS时间,硬件时间,一般在主板上靠电池供电,服务器断电后也会继续运行。仅保存日期时间数值,无法保存时区和夏令时设置。