pbsbc01h3-Chrony时间同步服务
Chrony 时间同步服务完全指南
目录
Chrony 简介
什么是 Chrony
Chrony 是一个用于保持系统时间与 NTP(Network Time Protocol)服务器同步的服务。它是传统 ntpd 的现代替代品,特别适合:
- 不总是联网的系统(如笔记本电脑、物联网设备)
- 虚拟机和云环境(时间容易漂移)
- 需要快速同步的系统(启动后几秒内完成同步)
Chrony vs NTPd 对比
| 特性 | Chrony | NTPd |
|---|---|---|
| 启动速度 | 快(几秒同步) | 慢(需几分钟) |
| 网络中断适应 | 优秀(自动补偿) | 一般 |
| 虚拟化支持 | 优秀(检测漂移) | 一般 |
| 资源占用 | 低(内存约 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.conf1. 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.drift3. 访问控制
# 允许本机查询
allow 127.0.0.1
allow ::1
# 允许局域网客户端(Chrony 可作为服务器)
allow 192.168.1.0/24
# 拒绝所有
deny all4. 日志配置
# 日志文件
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 ntpdata3. 手动操作
# 强制立即同步
chronyc -a makestep
# 手动触发时间更新
chronyc -a update
# 等待同步完成
chronyc -a waitsync
# 重启服务
chronyc -a restart
# 查看活动服务器
chronyc activity4. 诊断命令
# 检查时间偏移
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
fi3. 告警配置
# 添加到 crontab
echo "*/5 * * * * /usr/local/bin/chrony_monitor.sh >> /var/log/chrony_monitor.log 2>&1" | crontab -4. 性能调优参数
| 参数 | 默认值 | 推荐值 | 说明 |
|---|---|---|---|
minpoll | 6 | 4 | 最小轮询间隔(2^4=16秒) |
maxpoll | 10 | 8 | 最大轮询间隔(2^8=256秒) |
maxupdateskew | 1000 | 100 | 最大更新偏差(秒) |
maxsources | 4 | 3-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 | 查看系统时间状态 |
总结
关键要点
- Chrony 是现代 NTP 客户端,比 ntpd 更快更轻量
- IPv6 配置是常见问题源,按需禁用或启用
- 防火墙必须放行 UDP 123 端口
- makestep 参数控制时间跳跃行为
- 定期监控偏移量,防止时间漂移过大
最佳实践
- ✅ 使用多个 NTP 源(至少3个)
- ✅ 配置
iburst选项加速初始同步 - ✅ 定期检查
chronyc sources确保 Reach 值为 377 - ✅ 在生产环境设置时间偏移告警
- ✅ 虚拟化环境启用更频繁的同步
故障排查流程
- 检查服务状态:
systemctl status chronyd - 验证配置:
cat /etc/chrony/chrony.conf - 查看时间源:
chronyc sources -v - 检查网络:
ping NTP_SERVER和防火墙 - 分析日志:
journalctl -u chronyd -n 50 - 手动同步:
chronyc -a makestep
本文档基于实际生产环境问题排查经验整理