跳转到内容

时间同步 (chrony)

精准的系统时间对于日志记录、证书验证、分布式系统协调等场景至关重要。EL 系发行版默认使用 chrony 作为 NTP 客户端和服务端,取代了传统的 ntpd。本文将介绍 chrony 的安装配置、NTP 源管理、时区设置以及硬件时钟同步。

特性chronyntpd
同步速度快速收敛,适合间歇性网络收敛较慢,需要持续连接
资源占用低内存、低 CPU相对较高
虚拟机支持优秀,适应时钟漂移一般
EL 默认EL 7+ 默认EL 6 默认,EL 8+ 已移除
精度微秒级毫秒级

在 EL 8/9 中,ntpd 已从默认仓库移除,chrony 是唯一推荐的 NTP 实现

EL 系发行版通常默认已安装 chrony。如果没有,可以手动安装:

安装 chrony
sudo dnf install chrony -y
启动并设为开机自启
sudo systemctl start chronyd
sudo systemctl enable chronyd
确认服务状态
sudo systemctl status chronyd
查看当前 NTP 源列表
chronyc sources -v

输出中各列含义:

  • ^* — 当前正在使用的源(已同步)
  • ^+ — 合格的备选源
  • ^- — 不合格的源
  • ^? — 连接中或状态未知
查看时间同步详细状态
chronyc tracking

关注以下字段:

  • System time — 系统时钟与 NTP 的偏移量
  • Last offset — 上一次调整的偏移量
  • RMS offset — 偏移的均方根值
  • Frequency — 时钟频率偏差 (ppm)
查看 NTP 源统计数据
chronyc sourcestats -v

chrony 的主配置文件位于 /etc/chrony.conf

查看当前配置
cat /etc/chrony.conf

默认配置通常指向发行版的 NTP 池。可以根据需要修改为其他服务器:

备份原配置
sudo cp /etc/chrony.conf /etc/chrony.conf.bak
编辑 chrony 配置文件
sudo vi /etc/chrony.conf

常见的 NTP 服务器配置示例:

/etc/chrony.conf 示例
# 使用国内 NTP 服务器
server ntp.aliyun.com iburst
server ntp.tencent.com iburst
server ntp.ntsc.ac.cn iburst
# 或使用全球 NTP 池
pool 2.pool.ntp.org iburst
# 记录时钟漂移
driftfile /var/lib/chrony/drift
# 允许系统时钟在前三次更新时大幅跳跃
makestep 1.0 3
# 启用内核时钟同步
rtcsync
# 日志目录
logdir /var/log/chrony

关键指令说明:

  • server — 指定单个 NTP 服务器
  • pool — 指定 NTP 服务器池(自动解析多个地址)
  • iburst — 初始同步时发送突发请求,加快同步速度
  • makestep — 允许在指定条件下大幅调整时间(参数:阈值秒数 + 允许次数)
  • rtcsync — 每 11 分钟将系统时间写入硬件时钟
修改后重启 chronyd
sudo systemctl restart chronyd
验证新的 NTP 源是否生效
chronyc sources

如果需要让本机为内网其他主机提供时间同步服务:

在 chrony.conf 中添加允许的客户端网段
echo 'allow 192.168.1.0/24' | sudo tee -a /etc/chrony.conf
重启服务并放行防火墙
sudo systemctl restart chronyd
sudo firewall-cmd --permanent --add-service=ntp
sudo firewall-cmd --reload

timedatectl 是 systemd 提供的时间和时区管理工具。

查看系统时间和时区状态
timedatectl status
列出所有可用时区
timedatectl list-timezones
筛选亚洲时区
timedatectl list-timezones | grep Asia
设置时区为中国标准时间
sudo timedatectl set-timezone Asia/Shanghai
设置为 UTC 时区
sudo timedatectl set-timezone UTC
启用 NTP 自动同步
sudo timedatectl set-ntp true
禁用 NTP 同步(用于手动设置时间)
sudo timedatectl set-ntp false

在禁用 NTP 同步后,可以手动设置系统时间:

手动设置日期和时间
sudo timedatectl set-time '2026-03-25 14:30:00'

硬件时钟(RTC)是主板上的独立时钟,系统关机后仍然运行。

查看硬件时钟时间
sudo hwclock --show
将系统时间写入硬件时钟
sudo hwclock --systohc
将硬件时钟写入系统时间
sudo hwclock --hctosys
设置硬件时钟为 UTC
sudo hwclock --systohc --utc

在配置了 rtcsync 指令后,chrony 会自动每 11 分钟将系统时间同步到硬件时钟,通常不需要手动操作。

如果系统时间偏差较大,需要立即校正:

强制立即同步时间
sudo chronyc makestep

该命令会立刻将系统时间调整为 NTP 源的时间,无论偏差大小。

检查 chronyd 是否在运行
systemctl is-active chronyd
检查防火墙是否放行 NTP (UDP 123)
sudo firewall-cmd --list-services | grep ntp
检查网络连通性
chronyc activity
查看 chronyd 的 journal 日志
journalctl -u chronyd --no-pager -n 50
查看系统时间偏移
chronyc tracking | grep "System time"

偏移量(offset)应该在毫秒或微秒级别。如果偏移量过大(超过数秒),可以使用 chronyc makestep 强制同步。

  1. 保持 chrony 为默认时间服务:不要在 EL 8/9 上安装 ntpd
  2. 使用地理位置较近的 NTP 源:减少网络延迟,提高同步精度
  3. 配置多个 NTP 源:至少配置 3-4 个源以确保冗余
  4. 使用 iburst 选项:加快初始同步速度
  5. 保留 makestep 配置:允许启动时进行大幅时间调整
  6. 启用 rtcsync:保持硬件时钟同步
  7. 监控时间偏移:将 chronyc tracking 纳入监控系统