​​Linux(CentOS)​​同步服务器时间之~​​chrony​​_Linux

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

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

yum命令安装 Chrony

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

sudo yum install chrony -y

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

sudo dnf install chrony -y

Chrony常用命令

启动 Chrony 服务
sudo systemctl start chronyd

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

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

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

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

或使用 journalctl 查看实时日志:

sudo journalctl -u chronyd -f

Chronyc命令行工具

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

查看源状态
chronyc sources -v
命令返回内容
.-- 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. 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

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

立即同步时间

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

chronyc makestep
列出跟踪记录
chronyc tracking
命令返回内容
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. 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

以上就是 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

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

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

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

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

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

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

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

注意事项

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