精确时间同步对日志一致性、安全审计、分布式协调至关重要;RHEL 8 起用 Chrony 替代传统 NTP 守护进程,更快更准。
一、Chrony 概述
1.1 为什么精确计时很重要
网络中需要准确的数据包与日志时间戳。Linux 下 NTP 由用户空间的守护进程实现,它负责更新内核中的系统时钟。
系统时钟通常基于时间戳计数器(TSC):一个 CPU 寄存器,统计自上次重置以来的循环数,速度极快、分辨率高、不被中断。
RHEL 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 日志文件
日志保存在 /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(仅客户端)