Chrony 时间同步服务完全指南

目录

  1. Chrony 简介
  2. Chrony 架构与组件
  3. 配置文件详解
  4. 常用命令与操作
  5. 常见问题与排查
  6. 性能优化与最佳实践
  7. 故障案例实战

Chrony 简介

什么是 Chrony

Chrony 是一个用于保持系统时间与 NTP(Network Time Protocol)服务器同步的服务。它是传统 ntpd 的现代替代品,特别适合:

  • 不总是联网的系统(如笔记本电脑、物联网设备)
  • 虚拟机和云环境(时间容易漂移)
  • 需要快速同步的系统(启动后几秒内完成同步)

Chrony vs NTPd 对比

特性ChronyNTPd
启动速度快(几秒同步)慢(需几分钟)
网络中断适应优秀(自动补偿)一般
虚拟化支持优秀(检测漂移)一般
资源占用低(内存约 1MB)较高
配置复杂度简单复杂
时钟调整方式支持步进和微调仅微调

Chrony 架构与组件

核心组件

组件作用进程名配置文件
chronyd守护进程,核心服务chronyd/etc/chrony/chrony.conf
chronyc命令行客户端,监控和管理chronyc-

工作流程

NTP 服务器池 (pool.ntp.org)
        ↓
    chronyd 守护进程
        ↓
    ├─→ 系统时钟同步
    ├─→ 硬件时钟 (RTC) 同步
    └─→ 时间漂移补偿
        ↓
    chronyc 监控工具

数据存储位置

# 配置文件
/etc/chrony/chrony.conf        # 主配置文件
/etc/chrony/chrony.keys        # 认证密钥文件
/var/lib/chrony/chrony.drift   # 时钟漂移文件
/var/lib/chrony/chrony.sock    # 命令套接字

# 日志文件
/var/log/chrony.log            # 日志(需配置)
journalctl -u chrony            # systemd 日志

配置文件详解

主配置文件结构

cat /etc/chrony/chrony.conf

1. NTP 服务器配置

# 使用公共 NTP 服务器池
pool 0.pool.ntp.org iburst
pool 1.pool.ntp.org iburst
pool 2.pool.ntp.org iburst

# 或使用特定服务器
server ntp.aliyun.com iburst
server time.google.com iburst

# 参数说明:
# pool   - 服务器池(自动轮询)
# server - 指定服务器
# iburst - 初始快速同步(发送4-8个包)

2. 时间同步策略

# 允许系统时钟步进(快进/后退)
# 前3次同步如果偏差超过1秒,立即步进
makestep 1 3

# 启用硬件时钟同步
rtcsync

# 时钟漂移文件位置
driftfile /var/lib/chrony/chrony.drift

3. 访问控制

# 允许本机查询
allow 127.0.0.1
allow ::1

# 允许局域网客户端(Chrony 可作为服务器)
allow 192.168.1.0/24

# 拒绝所有
deny all

4. 日志配置

# 日志文件
logdir /var/log/chrony

# 记录测量统计
log measurements statistics tracking

完整配置示例

# /etc/chrony/chrony.conf 完整示例

# NTP 服务器
pool time.google.com iburst
pool ntp.aliyun.com iburst

# 初始步进设置
makestep 0.1 3

# 硬件时钟
rtcsync

# 漂移文件
driftfile /var/lib/chrony/chrony.drift

# 命令套接字
cmdport 323
bindcmdaddress 127.0.0.1
bindcmdaddress ::1

# 本地访问控制
allow 127.0.0.1
allow ::1

# 日志
logdir /var/log/chrony
log measurements statistics tracking

# 密钥认证(如需要)
# keyfile /etc/chrony/chrony.keys

常用命令与操作

服务管理

# systemd 管理
systemctl start chronyd       # 启动服务
systemctl stop chronyd        # 停止服务
systemctl restart chronyd     # 重启服务
systemctl status chronyd      # 查看状态
systemctl enable chronyd      # 开机自启
systemctl disable chronyd     # 禁用自启

# 查看日志
journalctl -u chronyd -n 50   # 最近50条日志
journalctl -u chronyd -f      # 实时跟踪

chronyc 命令详解

1. 查看时间同步状态

# 查看时间源状态
chronyc sources -v

# 输出示例:
# MS Name/IP address         Stratum Poll Reach LastRx Last sample
# ^* time.google.com               1   6   377    11  +34us[ +88us] +/- 11ms
# ^+ ntp.aliyun.com                2   6   377    12  -12ms[ -11ms] +/- 38ms

# 字段说明:
# MS: ^* 当前同步源, ^+ 候选源, ^- 备用源
# Stratum: 层级(1最精确)
# Reach: 可达性(377=100%)
# Last sample: 时间偏差
# 查看详细跟踪信息
chronyc tracking

# 输出示例:
# Reference ID    : 78747236 (time.google.com)
# Stratum         : 2
# Ref time (UTC)  : Thu Apr 02 05:30:15 2026
# System time     : 0.000123456 seconds fast of NTP time
# Last offset     : -0.000045678 seconds
# RMS offset      : 0.000234567 seconds
# Frequency       : 12.345 ppm fast
# Residual freq   : -0.001 ppm
# Skew            : 0.123 ppm
# Root delay      : 0.012345 seconds
# Root dispersion : 0.003456 seconds
# Update interval : 64.2 seconds
# Leap status     : Normal

# 关键字段:
# System time    : 系统时间与NTP的偏差
# Frequency      : 时钟频率漂移(ppm)
# Leap status    : 闰秒状态

2. 查看时间源统计

# 查看所有时间源
chronyc sources -v

# 查看源统计信息
chronyc sourcestats -v

# 查看当前同步源
chronyc ntpdata

3. 手动操作

# 强制立即同步
chronyc -a makestep

# 手动触发时间更新
chronyc -a update

# 等待同步完成
chronyc -a waitsync

# 重启服务
chronyc -a restart

# 查看活动服务器
chronyc activity

4. 诊断命令

# 检查时间偏移
chronyc tracking | grep "System time"

# 查看最近调整
chronyc ntpdata

# 查看服务器可达性
chronyc sources | grep -E "^\^"

# 查看客户端(如果 Chrony 作为服务器)
chronyc clients

常见问题与排查

问题1:无法打开命令套接字

错误信息

Could not open command socket on [::1]:323

原因分析

  • IPv6 未启用但配置监听 IPv6
  • 套接字文件权限问题
  • chronyd 未正常启动

排查步骤

# 1. 检查 IPv6 是否启用
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
# 返回 1 = 禁用, 0 = 启用

# 2. 检查 chronyd 是否运行
systemctl status chronyd

# 3. 检查端口监听
ss -tlnp | grep 323
netstat -tlnp | grep chronyd

# 4. 查看套接字文件
ls -la /var/lib/chrony/chrony.sock

解决方案

# 方案1:禁用 IPv6 命令套接字
cat >> /etc/chrony/chrony.conf << 'EOF'
# 只监听 IPv4
bindcmdaddress 127.0.0.1
# bindcmdaddress ::1  # 注释掉 IPv6
EOF

systemctl restart chronyd

# 方案2:启用 IPv6(如果系统支持)
# 编辑 /etc/sysctl.conf
echo "net.ipv6.conf.all.disable_ipv6 = 0" >> /etc/sysctl.conf
sysctl -p
systemctl restart chronyd

问题2:时间同步失败

症状

  • chronyc sources 显示 ? 符号
  • Reach 值不是 377

排查步骤

# 1. 检查网络连通性
ping -c 4 time.google.com

# 2. 检查防火墙
iptables -L -n | grep 123
ufw status

# 3. 测试 NTP 端口
nc -vuz time.google.com 123
# 或
ntpdate -q time.google.com

# 4. 查看详细日志
journalctl -u chronyd -n 50

# 5. 检查 DNS 解析
nslookup pool.ntp.org

解决方案

# 方案1:更换 NTP 服务器
# 使用国内 NTP 服务器
cat > /etc/chrony/chrony.conf << 'EOF'
pool ntp.aliyun.com iburst
pool ntp.tencent.com iburst
pool cn.pool.ntp.org iburst
rtcsync
makestep 1 3
driftfile /var/lib/chrony/chrony.drift
EOF

systemctl restart chronyd

# 方案2:手动同步一次
chronyc -a makestep

# 方案3:检查并开放防火墙
iptables -A INPUT -p udp --dport 123 -j ACCEPT

问题3:时间跳跃过大

症状

  • 日志显示时间突然跳跃
  • 应用日志时间顺序错乱

排查步骤

# 1. 查看时间跳跃历史
grep "step" /var/log/chrony.log
journalctl -u chronyd | grep -i step

# 2. 检查硬件时钟
hwclock --show
hwclock --compare

# 3. 检查 RTC 漂移
cat /var/lib/chrony/chrony.drift

解决方案

# 方案1:调整 makestep 参数
# 允许更大步进但次数限制
makestep 0.1 3  # 前3次同步允许步进

# 方案2:禁用步进,仅微调
# makestep 0.1 -1  # 禁用步进

# 方案3:重新校准 RTC
hwclock --systohc --update-drift

问题4:虚拟化环境时间漂移

症状

  • chronyc tracking 显示频率很高
  • 时间持续缓慢漂移

解决方案

# 1. 启用虚拟化支持
cat >> /etc/chrony/chrony.conf << 'EOF'
# 启用虚拟化感知
tempcomp 1000  # 温度补偿
EOF

# 2. 增加同步频率
cat >> /etc/chrony/chrony.conf << 'EOF'
# 最小轮询间隔(2^4=16秒)
minpoll 4
maxpoll 6
EOF

systemctl restart chronyd

# 3. 对于 VMware
echo "kvm-clock" >> /etc/modules-load.d/kvm-clock.conf

问题5:Chrony 与系统时间冲突

症状

  • 系统时间被其他服务修改
  • timedatectl 显示不同状态

排查步骤

# 1. 检查时间同步状态
timedatectl status

# 2. 查看 NTP 服务
timedatectl show-timesync

# 3. 检查是否有冲突服务
systemctl list-units | grep -E "ntp|timesync"

解决方案

# 1. 确保 chrony 是唯一时间服务
systemctl stop ntp ntpdate systemd-timesyncd 2>/dev/null
systemctl disable ntp ntpdate systemd-timesyncd 2>/dev/null

# 2. 启用 chrony
systemctl enable --now chronyd

# 3. 配置 timedatectl
timedatectl set-ntp true
timedatectl set-local-rtc false

性能优化与最佳实践

1. 生产环境推荐配置

# /etc/chrony/chrony.conf
# 使用多个可靠 NTP 源
pool time.google.com iburst
pool ntp.aliyun.com iburst
pool ntp.tencent.com iburst

# 初始同步步进
makestep 0.1 3

# 硬件同步
rtcsync

# 漂移文件
driftfile /var/lib/chrony/chrony.drift

# 命令控制
cmdport 323
bindcmdaddress 127.0.0.1

# 日志
logdir /var/log/chrony
log measurements statistics tracking

# 性能优化
maxsources 4          # 最多使用4个源
maxupdateskew 100.0   # 最大更新偏差

2. 监控脚本

#!/bin/bash
# /usr/local/bin/chrony_monitor.sh

THRESHOLD=0.1  # 时间偏差阈值(秒)

# 获取当前偏移
OFFSET=$(chronyc tracking | grep "System time" | awk '{print $4}' | sed 's/seconds//')

# 检查绝对值是否超限
if (( $(echo "$OFFSET > $THRESHOLD" | bc -l) )); then
    echo "WARNING: Time offset is $OFFSET seconds"
    chronyc -a makestep
fi

# 检查同步源
SOURCES=$(chronyc sources | grep -c "^\^[*+]")
if [ $SOURCES -eq 0 ]; then
    echo "CRITICAL: No NTP source available"
    systemctl restart chronyd
fi

3. 告警配置

# 添加到 crontab
echo "*/5 * * * * /usr/local/bin/chrony_monitor.sh >> /var/log/chrony_monitor.log 2>&1" | crontab -

4. 性能调优参数

参数默认值推荐值说明
minpoll64最小轮询间隔(2^4=16秒)
maxpoll108最大轮询间隔(2^8=256秒)
maxupdateskew1000100最大更新偏差(秒)
maxsources43-5最多使用的源数量

故障案例实战

案例1:IPv6 导致的命令套接字错误

现象

chronyd[823]: Could not open command socket on [::1]:323

环境

  • 系统禁用 IPv6
  • Chrony 默认监听 IPv6

排查过程

# 1. 确认 IPv6 状态
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
# 输出: 1 (禁用)

# 2. 查看 chrony 配置
grep bindcmdaddress /etc/chrony/chrony.conf
# 输出: bindcmdaddress 127.0.0.1
#       bindcmdaddress ::1

# 3. 检查错误日志
journalctl -u chronyd -n 20 | grep "command socket"

解决方案

# 编辑配置,注释 IPv6
sed -i 's/^bindcmdaddress ::1/# bindcmdaddress ::1/' /etc/chrony/chrony.conf

# 重启服务
systemctl restart chronyd

# 验证
systemctl status chronyd

案例2:防火墙阻止 NTP 流量

现象

chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample
^? time.google.com               0   6     0     -     +0ns[   +0ns] +/-    0ns

排查过程

# 1. 测试 NTP 端口连通性
timeout 5 ntpdate -q time.google.com
# 输出: timeout, nothing received

# 2. 检查防火墙规则
iptables -L -n -v | grep 123
# 输出为空(未放行)

# 3. 临时测试(关闭防火墙)
systemctl stop ufw  # 或 iptables -F

解决方案

# 放行 NTP 端口
iptables -A INPUT -p udp --dport 123 -j ACCEPT
iptables -A OUTPUT -p udp --sport 123 -j ACCEPT

# 保存规则
iptables-save > /etc/iptables/rules.v4

# 验证
chronyc -a makestep
chronyc sources

案例3:时间频繁跳跃

现象

chronyc tracking
System time     : 0.123456789 seconds fast of NTP time
# 几分钟后
System time     : -0.098765432 seconds fast of NTP time

排查过程

# 1. 查看漂移文件
cat /var/lib/chrony/chrony.drift
# 输出: 123.456  (频率漂移过高)

# 2. 检查硬件
dmesg | grep -i "clock\|rtc"

# 3. 查看系统负载
uptime
top -bn1 | head -5

解决方案

# 1. 重置漂移文件
systemctl stop chronyd
rm /var/lib/chrony/chrony.drift
systemctl start chronyd

# 2. 增加同步频率
cat >> /etc/chrony/chrony.conf << 'EOF'
# 更频繁的同步
minpoll 4
maxpoll 6
EOF

systemctl restart chronyd

# 3. 监控稳定性
watch -n 5 'chronyc tracking | grep "System time"'

命令速查表

命令说明
systemctl status chronyd查看服务状态
chronyc sources -v查看时间源
chronyc tracking查看同步详情
chronyc sourcestats -v查看源统计
chronyc -a makestep强制同步
chronyc activity查看活动源
chronyc ntpdata查看 NTP 数据
chronyc waitsync等待同步完成
timedatectl status查看系统时间状态

总结

关键要点

  1. Chrony 是现代 NTP 客户端,比 ntpd 更快更轻量
  2. IPv6 配置是常见问题源,按需禁用或启用
  3. 防火墙必须放行 UDP 123 端口
  4. makestep 参数控制时间跳跃行为
  5. 定期监控偏移量,防止时间漂移过大

最佳实践

  • ✅ 使用多个 NTP 源(至少3个)
  • ✅ 配置 iburst 选项加速初始同步
  • ✅ 定期检查 chronyc sources 确保 Reach 值为 377
  • ✅ 在生产环境设置时间偏移告警
  • ✅ 虚拟化环境启用更频繁的同步

故障排查流程

  1. 检查服务状态:systemctl status chronyd
  2. 验证配置:cat /etc/chrony/chrony.conf
  3. 查看时间源:chronyc sources -v
  4. 检查网络:ping NTP_SERVER 和防火墙
  5. 分析日志:journalctl -u chronyd -n 50
  6. 手动同步:chronyc -a makestep

本文档基于实际生产环境问题排查经验整理

标签: none

添加新评论