​​Linux(CentOS)​​同步服务器时间之~​​chrony​​_系统时钟

Chrony 是一款开源的网络时间协议(NTP)客户端和服务端软件,旨在提供高精度的时间同步功能。相较于传统的 NTP 实现如 ntpdChrony 提供了一些改进和优势,包括更快的同步速度、低延迟、低CPU占用和低内存消耗。以下是 Chrony 的几个关键特性和使用场景:

Chrony的组成
  • chronyd:这是一个后台守护进程,负责与时间服务器通信,根据网络条件和系统时钟特性动态调整内核中的系统时钟,以最小化时间和频率误差。它能够智能地应对网络延迟、间歇性连接、时钟漂移以及虚拟环境中的不稳定性。
  • chronyc:这是一个命令行工具,为用户提供了一个界面来监控Chrony的性能、查看同步状态、调整配置参数以及手动执行某些操作,如立即同步或查看时间源的状态。
Chrony 的特点:
  1. 快速同步Chrony 使用特殊算法能快速减少系统时钟的偏移和频率误差,非常适合那些非24小时运行的系统,如虚拟机。
  2. 频率调整:能够更有效地应对时钟频率的快速变化,适合于拥有不稳定时钟的虚拟环境或受节能技术影响的系统。
  3. 节能技术兼容性:即使在节能技术导致CPU频率变化的系统中也能保持良好的时间同步。
  4. 灵活配置:支持多种同步源,包括NTP服务器、GPS接收器或其他参考时钟,以及手动时间输入。
Chrony 使用场景:
  1. 企业服务器:确保数据中心内的所有服务器保持时间同步,这对于日志记录、交易时间戳、数据一致性等至关重要。
  2. 桌面系统:提高个人电脑的时间精度,尤其是对于依赖精确时间的应用,如开发环境、金融交易软件或科学计算。
  3. 嵌入式系统和物联网设备:在资源有限的设备上,Chrony的低资源消耗特性使其成为理想的选择。
  4. 虚拟环境:在云服务器或虚拟机中,Chrony能有效应对由于虚拟化带来的时钟漂移问题。
  5. 高精度应用:科研机构、天文观测、卫星通信等领域,需要高度精确时间同步的应用场景。

综上,Chrony是一个强大且灵活的时间同步工具,适用于各种需要精确时间同步的环境,尤其在面对现代计算挑战如虚拟化、节能技术和网络波动时表现出色。

yum命令查看Chrony是否安装

要使用 yum 命令查看 Chrony 是否已经安装,可以执行以下命令:

yum list installed chrony
  • 1.

这条命令会列出所有已安装的软件包,并在结果中查找是否有 chrony。如果 chrony 出现在输出列表中,那么就意味着 Chrony 已经安装在你的系统上。如果没有找到 chrony,则表示它尚未安装。

yum命令安装 Chrony

对于 CentOS 7 及更高版本,Chrony 很可能是预装的。如果不是,或者你需要在较旧的 CentOS 版本上安装,可以使用 YUM 包管理器来安装 Chrony

sudo yum install chrony -y
  • 1.

对于 CentOS 8 及更高版本,使用 DNF(DNF 是 YUM 的替代品):

sudo dnf install chrony -y
  • 1.
Chrony常用命令
启动 Chrony 服务
sudo systemctl start chronyd
  • 1.

对于较老的系统,可能需要使用 service 命令:

sudo service chronyd start
  • 1.
停止 Chrony 服务
sudo systemctl stop chronyd
  • 1.
重启 Chrony服务
sudo systemctl restart chronyd
  • 1.
设置 Chrony 开机启动
sudo systemctl enable chronyd
  • 1.
禁用 Chrony开机启动
sudo systemctl disable chronyd
  • 1.
查看 Chrony 状态
sudo systemctl status chronyd
  • 1.
查看 Chrony 日志

默认的日志路径可能在 /var/log/chrony/chronyd.log,你可以使用如下命令查看:

sudo cat /var/log/chrony/chronyd.log
  • 1.

或使用 journalctl 查看实时日志:

sudo journalctl -u chronyd -f
  • 1.
Chronyc命令行工具

chronycChrony 的用户界面,用于监视和控制 Chrony 守护进程。一些常用的 chronyc 命令包括:

查看源状态
chronyc sources -v
  • 1.
命令返回内容
.-- 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               
===============================================================================
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
返回参数解析
  1. Source mode:
  • ^: 表示此源是作为服务器(server)模式工作,意味着它是一个上游时间服务器。
  • =: 表示此源是作为对等体(peer)模式工作,意味着它与其他NTP服务器相互同步。
  • #: 表示本地时钟,即系统自身的时钟。
  1. Source state:
  • *: 当前已同步(current synced),表明此源正在被用来同步系统时间。
  • +: 组合使用(combined),意味着虽然此源未直接用于同步,但它对最终的时间调整有贡献。
  • -: 未组合使用(not combined),此源的信息未被合并进系统时间的计算中。
  • ?: 不可达(unreachable),表示网络不可达或通信失败。
  • x: 时间可能有误(time may be in error),可能是因为多次连续的测量不一致。
  • ~: 时间变化过大(time too variable),源的时间跳跃或变动太大,不适宜作为同步源。
  1. Reachability register (octal): 到达性寄存器,用八进制表示,反映了Chrony与时间源之间连接的稳定性。
  2. Log2(Polling interval): 轮询间隔的对数(以2为底)。这个值表示Chrony与时间源之间通信的频率,值越大表示轮询间隔越长。

接下来,具体到每行数据的结构:

  • MS: Mode and State,模式和状态,结合上述的Source mode和Source state。
  • Name/IP address: 时间源的名称或IP地址。
  • Stratum: 层级,表示此源在NTP层次结构中的位置。
  • Poll: 当前的轮询间隔,单位为秒。
  • Reach: 到达性,八进制表示的位图,展示了最近八次轮询的成功情况。
  • LastRx: 最后一次接收到响应的时间。
  • Last sample: 最后一个样本的时间戳及偏移量信息,格式为:
  • xxxx: 调整后的偏移量(offset),即系统时钟调整后与该源的差异,单位为毫秒。
  • [yyyy]: 测量到的偏移量,未经过Chrony调整的原始偏移量。
  • +/- zzzz: 估算的误差范围,即系统时钟与该源时间的可能偏差范围,单位为毫秒。
.xxxx [yyyy] +/- zzzz
  • 1.

根据以上信息,你可以判断每个时间源的健康状况、系统与之同步的情况,以及时间同步的整体质量。

立即同步时间

(使系统时钟尽快与参考时间源同步,而非平滑调整):

chronyc makestep
  • 1.
列出跟踪记录
chronyc tracking
  • 1.
命令返回内容
Reference ID    : CA701FC5 (dns2.synet.edu.cn)
Stratum         : 2
Ref time (UTC)  : Sat Jun 01 08:28:26 2024
System time     : 0.000122217 seconds fast of NTP time
Last offset     : +0.000072612 seconds
RMS offset      : 212.469070435 seconds
Frequency       : 3.279 ppm slow
Residual freq   : +0.003 ppm
Skew            : 0.157 ppm
Root delay      : 0.016848214 seconds
Root dispersion : 0.001658257 seconds
Update interval : 1026.4 seconds
Leap status     : Normal
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
返回参数解析
  1. Reference ID: 这是跟踪的参考时钟标识符,通常是一个IP地址或域名的一部分,这里是 CA701FC5 (dns2.synet.edu.cn),表明您的系统通过DNS名为 dns2.synet.edu.cn 的服务器进行时间同步。
  2. Stratum: 表示系统的NTP层级,这里是2,意味着您的系统是第二层时钟,直接与第一层(通常是原子钟或GPS时钟作为参考源的服务器)同步。
  3. Ref time (UTC): 参考时间,即Chrony最后一次成功同步时参考时钟的时间,这里是 "Sat Jun 01 08:28:26 2024"(注意:日期可能不正确,需确认)。
  4. System time: 系统时间与NTP时间的偏差,这里是 "+0.000122217 seconds fast",表明系统时间比NTP标准时间快了约0.000122秒。
  5. Last offset: 上一次测量的偏移量,这里是 "+0.000072612 seconds",即上次检查时系统时间比NTP时间快了约0.000073秒。
  6. RMS offset: 偏移量的均方根(Root Mean Square),长时间内的平均偏移量的波动大小,这里是 "212.469070435 seconds",这个值异常大,通常应接近0且远小于1秒,表明之前可能存在严重的时间同步问题或配置不当。
  7. Frequency: 频率偏差,这里是 "3.279 ppm slow",表示系统时钟比理想频率慢了3.279 parts per million(每百万分之3.279),通常Chrony会自动调整此频率。
  8. Residual freq: 残余频率偏差,即最近的频率调整后剩余的偏差,这里是 "+0.003 ppm",意味着最近调整后略有加速。
  9. Skew: 频率偏差的趋势,这里是 "0.157 ppm",若此值接近0表示系统时钟频率相对稳定。
  10. Root delay: 到参考时钟的总往返延迟,这里是 "0.016848214 seconds",表明网络延迟较小。
  11. Root dispersion: 时间分散度,即参考时钟不确定性加上网络传输过程中的不确定度,这里是 "0.001658257 seconds",也相对较低,表示时间同步质量较好。
  12. Update interval: Chrony与参考源更新时间间隔,这里是 "1026.4 seconds",表示大约每17分钟轮询一次时间源。
  13. Leap status: 跳秒状态,这里是 "Normal",表明没有即将发生的闰秒调整。

从上述输出看,特别需要注意的是 RMS offset 值异常大,这通常意味着在过去有一段时间系统时间与NTP时间之间存在巨大差异,或者可能是测量误差。如果这个问题持续存在,应检查网络连接、时间源的可靠性以及Chrony的配置。

查看帮助信息
chronyc help
  • 1.

以上就是 ChronyCentOS 上的基本安装方法和一些常用命令。根据实际情况和需求,可能还需要对 /etc/chrony.conf 配置文件进行适当的调整。

内网环境下的Chrony 服务配置

在无法联网的服务器集群中,要使集群中的机器通过一台中心节点进行时间同步,这样只需要定期更新中心节点的服务器时间,即可完成整个集群的时间同步,可以采用如下步骤,设置Chrony来实现内部时间同步:

设置中心节点(时间服务器)

首先确保在充当时间服务器的中心节点上安装Chrony

配置Chrony

编辑Chrony的配置文件 /etc/chrony.conf,使其作为本地时间源而非外部NTP服务器。可以注释掉所有外部时间服务器的行,并添加本地作为时间源的声明。

server 127.127.1.0         # Local clock
fudge 127.127.1.0 stratum 10
  • 1.
  • 2.

这里,127.127.1.0 是本地时钟的表示,fudge 命令设置了该时钟的层级为10,意味着它是不太可靠的时间源,但在没有其他外部源的情况下是必要的。

启动并启用Chrony服务
sudo systemctl start chronyd
sudo systemctl enable chronyd
  • 1.
  • 2.
手动校准时间

如果中心节点的时间不准确,首先需要手动将其调整到尽可能准确的时间,可以使用 date 命令或 ntpdate(如果安装了)从一个已知准确的时间源临时同步。

设置集群中其他节点
  1. 安装Chrony:在集群中的每台机器上安装Chrony
  2. 配置Chrony:编辑每台机器上的 /etc/chrony.conf 文件,添加中心节点作为时间源,假设中心节点的IP地址为 192.168.1.100,则添加:
server 192.168.1.100 iburst
  • 1.

iburst 参数告诉Chrony在启动时迅速进行多次查询以快速同步时间。

  1. 重启Chrony服务:在每台机器上重启Chrony服务以应用配置。
sudo systemctl restart chronyd
  • 1.
验证时间同步

在所有节点上,使用 chronyc sources -v 查看时间源状态,确保它们都指向了中心节点,并且状态为 * 表示已同步。

注意事项
  • 确保集群内网络通信畅通,防火墙规则允许NTP(UDP 123端口)通信。
  • 定期手动检查中心节点的时间准确性,并必要时进行调整,因为所有集群节点都将依赖于此时间源。
  • 在高度敏感的环境中,可能还需要考虑物理时钟源(如GPS接收器)接入中心节点,以提高时间同步的准确性。