Chronyd 时间同步
在网络环境中,精确的时间同步对于日志一致性、安全审计、分布式系统协调至关重要。RHEL 从 8 开始使用 Chrony 替代传统 NTP 守护进程,提供更快、更准确的时间同步。
一、Chrony 概述
1.1 为什么精确计时很重要
在网络中,需要准确的数据包和日志的时间戳。在 Linux 系统中,NTP 协议由在用户空间运行的守护进程实现,用户空间守护进程更新内核中运行的系统时钟。
系统时钟通常使用时间戳计数器(TSC),TSC 是一个 CPU 寄存器,计算从上次重置的循环数,速度极快、分辨率高,且不会被中断。
从 Red Hat Enterprise Linux 8 开始,NTP 协议由 chronyd 守护进程实现,它可从 chrony 软件包获得。
1.2 Chrony 功能
| 功能 | 说明 |
|---|---|
| 与 NTP 服务器同步 | 将系统时钟与远程 NTP 服务器同步 |
| 与参考时钟同步 | 支持 GPS 接收器等硬件参考时钟 |
| 手动时间输入同步 | 支持手动输入时间进行同步 |
| 作为 NTPv4 服务器 | 为网络中其他计算机提供时间服务 |
| 作为对等服务器 | 与同级服务器互相同步 |
在多数条件下 Chrony 都表现良好,包括:
- 时断时续的网络连接
- 有大量网络拥塞的网络
- 温度不稳定的环境(普通计算机时钟对温度敏感)
- 不持续运行或在虚拟机上运行的系统
1.3 精度
- 通过互联网同步:准确性在几毫秒之内
- LAN 中机器:准确性在几十微秒之内
- 硬件时间戳或硬件参考时钟:可以达到子微秒级
二、Chrony 组件
Chrony 包括两个主要组件:
| 组件 | 说明 |
|---|---|
chronyd | 在用户空间运行的守护进程,负责时间同步 |
chronyc | 命令行工具,用于监控 chronyd 性能并在运行时更改参数 |
在默认情况下,chronyd 只接受来自本地 chronyc 实例的命令,但也可以配置为接受远程监控命令(应限制远程访问)。
三、安装与状态检查
3.1 安装
Chrony 在 RHEL 上默认安装。如果未安装,可使用以下命令:
# 安装 chrony
dnf install chrony -y
chronyd 守护进程的默认位置为 /usr/sbin/chronyd,命令行工具安装在 /usr/bin/chronyc。
3.2 服务管理
# 启动并设置开机自启
systemctl enable --now chronyd
# 查看服务状态
systemctl status chronyd
# 重启服务(修改配置后)
systemctl restart chronyd
四、使用 chronyc 交互模式
4.1 进入交互模式
# 以 root 身份进入交互模式
chronyc
# chrony version 4.2
# Copyright (C) 1997-2003, 2007, 2009-2021 Richard P. Curnow and others
# chronyc>
在交互模式下输入 help 可查看所有可用命令:
chronyc> help
System clock:
tracking Display system time information
makestep Correct clock by stepping immediately
......
exit|quit Leave the program
help Generate this help
4.2 非交互模式
也可以在命令行直接指定命令:
# 非交互命令模式
chronyc tracking
chronyc sources
chronyc sourcestats
使用
chronyc所做的更改不具有持久性,会在chronyd重启后丢失。要持久化更改,需修改/etc/chrony.conf。
五、检查同步状态
5.1 tracking 命令
chronyc tracking
输出示例及关键字段:
| 字段 | 说明 | 示例值 |
|---|---|---|
Reference ID | 当前参考时钟源 | 771CB7B8 (119.28.183.184) |
Stratum | 时钟层级(越小越准确) | 3 |
Ref time (UTC) | 上次同步的 UTC 时间 | Wed Mar 08 11:36:38 2023 |
System time | 系统时钟与 NTP 时间的偏差 | 0.000400987 seconds slow |
Last offset | 上次测量的偏移量 | -0.000400063 seconds |
RMS offset | 长期偏移平均值 | 0.000868900 seconds |
Frequency | 时钟频率误差 | 5.757 ppm slow |
Residual freq | 残余频率误差 | -0.006 ppm |
Skew | 频率估计的误差范围 | 0.335 ppm |
Root delay | 到参考时钟的总延迟 | 0.058458306 seconds |
Root dispersion | 最大误差范围 | 0.007332922 seconds |
Update interval | 更新间隔 | 1033.4 seconds |
Leap status | 闰秒状态 | Normal |
5.2 sources 命令
sources 命令显示 chronyd 正在访问的当前时间源信息:
chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^- stratum2-1.ntp.mow01.ru.> 2 10 377 671 +12ms[ +11ms] +/- 108ms
^- ntp8.flashdance.cx 2 10 363 393 -46ms[ -46ms] +/- 183ms
^- tick.ntp.infomaniak.ch 1 10 377 690 -8219us[-8615us] +/- 100ms
^* 119.28.183.184 2 10 377 543 -2120us[-2520us] +/- 70ms
状态符号说明:
| 符号 | 含义 |
|---|---|
* | 当前最佳时间源(正在使用) |
+ | 可合并的候选源 |
- | 未合并的候选源 |
x | 可能出错的源 |
~ | 变动太大的源 |
? | 不可用的源 |
^ | 服务器 |
= | 对等服务器 |
# | 本地时钟 |
5.3 使用 -v 查看详细信息
chronyc sources -v
chronyc sourcestats -v
5.4 sourcestats 命令
sourcestats 命令显示每个源的偏移率和误差估算过程:
chronyc sourcestats
Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev
==============================================================================
stratum2-1.ntp.mow01.ru.> 44 24 328m +0.423 0.416 +19ms 4537us
ntp8.flashdance.cx 32 16 317m +0.098 0.769 -46ms 6952us
tick.ntp.infomaniak.ch 47 27 345m +0.398 0.236 -9923us 2774us
119.28.183.184 30 19 273m -0.005 0.264 -4615ns 1847us
| 字段 | 说明 |
|---|---|
NP | 测量集中的采样点数 |
NR | 同符号的残余运行次数 |
Span | 测量集的时长 |
Frequency | 估计的时钟频率误差 (ppm) |
Freq Skew | 频率估计的误差 |
Offset | 估计的偏移量 |
Std Dev | 标准偏差 |
六、配置 Chrony 服务器
6.1 服务器端配置
编辑 /etc/chrony.conf 配置文件:
vim /etc/chrony.conf
关键配置项:
# 允许来自本地网络的 NTP 客户端访问
allow 192.168.0.0/16
# 指定上级 NTP 服务器
server ntp.example.com iburst
# 选择记录哪些日志
log measurements statistics tracking
allow 格式:
| 格式 | 说明 |
|---|---|
allow 192.168.0.0/16 | 允许整个子网访问 |
allow 10.0.0.1 | 允许单个主机访问 |
allow all | 允许所有主机(慎用) |
修改配置后需要重启服务:
systemctl restart chronyd
6.2 防火墙配置
# Chronyd 使用 UDP 端口 123
firewall-cmd --permanent --add-service=ntp
firewall-cmd --reload
# 或者直接关闭防火墙(测试环境)
systemctl stop firewalld
七、配置 Chrony 客户端
7.1 客户端配置
编辑客户端的 /etc/chrony.conf:
vim /etc/chrony.conf
将默认的 NTP 池替换为指定的服务器:
# 注释掉默认的 pool
#pool 2.rhel.pool.ntp.org iburst
# 指定自定义时间服务器
server 192.168.115.128 iburst
# 记录日志
log measurements statistics tracking
iburst 选项的作用:如果服务器无法访问,发送 8 个包而不是通常的 1 个包,加快初始同步速度。
7.2 验证客户端同步
# 重启 chronyd
systemctl restart chronyd
# 查看时间源
chronyc sources
chronyc sources -v
八、日志管理
8.1 日志文件
Chrony 的日志文件保存在 /var/log/chrony/ 目录下:
ll /var/log/chrony/
# -rw-r--r--. 1 chrony chrony 3699 Mar 8 21:06 measurements.log
# -rw-r--r--. 1 chrony chrony 2925 Mar 8 21:06 statistics.log
# -rw-r--r--. 1 chrony chrony 3432 Mar 8 21:06 tracking.log
| 日志文件 | 内容 |
|---|---|
measurements.log | 每次测量的详细数据 |
statistics.log | 统计信息汇总 |
tracking.log | 系统时钟跟踪变化记录 |
九、关键 chronyc 命令速查表
| 命令 | 功能 |
|---|---|
chronyc tracking | 查看系统时钟同步状态 |
chronyc sources | 查看时间源列表 |
chronyc sources -v | 查看时间源详细信息 |
chronyc sourcestats | 查看时间源统计信息 |
chronyc sourcestats -v | 查看时间源详细统计 |
chronyc makestep | 立即修正时钟(大步跳跃) |
chronyc add server <host> | 运行时添加新时间源 |
chronyc delete <host> | 运行时删除时间源 |
chronyc activity | 查看 NTP 源的活动状态 |
chronyc clients | 查看连接的客户端 |
chronyc serverstats | 查看服务器统计信息 |
十、最佳实践
- 使用多个 NTP 源:至少配置 3-4 个时间源以提高可靠性和准确性
- 限制访问范围:使用
allow指令限制客户端的 IP 范围,不要开放allow all - 配置日志:开启
log measurements statistics tracking便于排查时间同步问题 - 防火墙放行:NTP 使用 UDP 端口 123,确保防火墙正确配置
- 配合 systemd-timesyncd:若不需要服务器功能,可考虑更轻量的
systemd-timesyncd(仅客户端)