chronyc是chrony时间同步服务的控制工具,用于监控和管理chronyd守护进程。chrony是现代Linux系统中推荐的NTP客户端/服务器软件,比传统的ntpdate和ntpd更优秀。
# CentOS / RHEL / Fedora
sudo yum install chrony
# 或(较新版本)
sudo dnf install chrony
# Ubuntu / Debian
sudo apt-get update
sudo apt-get install chrony
# Arch Linux
sudo pacman -S chrony
# 启动并启用服务
sudo systemctl start chronyd
sudo systemctl enable chronyd
# 检查服务状态
sudo systemctl status chronyd
# 检查chronyc版本
chronyc --version
chronyc [选项] [命令]
# 常用选项
-h, --help # 显示帮助信息
-v, --verbose # 详细输出
-n, --no-dns # 不解析主机名(显示IP地址)
-c, --csv # CSV格式输出
-f, --config-file # 指定配置文件
-p, --port # 指定端口(默认323)
进入交互模式后,可以输入各种命令来监控和管理chrony:
# 进入交互模式
chronyc
# 交互模式示例
chronyc> help # 显示可用命令
chronyc> quit # 退出交互模式
chronyc> exit # 退出交互模式
# 或直接执行单个命令
chronyc tracking
chronyc sources
提示:按Tab键可以自动补全命令。
| 命令 | 说明 | 示例 |
|---|---|---|
tracking |
显示时间同步状态信息 | chronyc tracking |
sources |
显示所有时间源的状态 | chronyc sources |
sources -v |
显示详细的时间源信息 | chronyc sources -v |
sourcestats |
显示时间源统计信息 | chronyc sourcestats |
activity |
显示活跃时间源数量 | chronyc activity |
serverstats |
显示服务器统计信息 | chronyc serverstats |
waitsync |
等待同步完成 | chronyc waitsync |
ntpdata |
显示NTP数据统计 | chronyc ntpdata |
# 1. 查看时间同步状态(最重要)
chronyc tracking
# 输出包含:
# Reference ID : 引用的时间源ID
# Stratum : 层级(1表示一级时间服务器)
# Ref time : 最后一次更新时间
# System time : 系统时间偏移量
# Last offset : 最后一次偏移量
# RMS offset : 均方根偏移量
# Frequency : 时钟频率误差
# Residual freq : 剩余频率误差
# Skew : 频率误差界限
# Root delay : 根延迟
# Root dispersion : 根离散度
# Leap status : 闰秒状态
# 2. 查看所有时间源状态
chronyc sources
# 输出字段说明:
# M - 模式:^=服务器,#=对等,*=当前最佳
# S - 状态:*=同步,+=候选,-=备用,?=不可达
# Name/IP - 服务器名称或IP
# Stratum - 层级
# Poll - 轮询间隔
# Reach - 可达性(八进制)
# LastRx - 最后接收时间
# Last sample - 最后样本
# 3. 查看详细时间源信息
chronyc sources -v
# 4. 查看时间源统计
chronyc sourcestats
# 输出字段说明:
# Name/IP - 服务器名称或IP
# NP - 样本数量
# NR - 残差点数量
# Span - 时间跨度
# Frequency - 频率误差
# Freq Skew - 频率偏斜
# Offset - 偏移量
# Std Dev - 标准偏差
# 5. 查看服务器统计
chronyc serverstats
# NTP packets received : 接收的NTP包数量
# NTP packets dropped : 丢弃的NTP包数量
# Command packets : 接收的命令包数量
# Client log records : 客户端日志记录数量
| 命令 | 说明 | 示例 |
|---|---|---|
add server |
添加新的时间服务器 | chronyc add server ntp.aliyun.com |
delete |
删除时间服务器 | chronyc delete ntp.aliyun.com |
online |
使时间源上线 | chronyc online ntp.aliyun.com |
offline |
使时间源下线 | chronyc offline ntp.aliyun.com |
burst |
快速获取时间样本 | chronyc burst 3/4 |
maxupdateskew |
设置最大更新偏斜 | chronyc maxupdateskew 1000 |
makestep |
强制时间步进调整 | chronyc makestep 1 3 |
maxdistance |
设置最大距离 | chronyc maxdistance 16 |
# 1. 添加时间服务器(临时生效)
chronyc add server ntp.aliyun.com iburst
chronyc add server time.google.com iburst
chronyc add server pool.ntp.org iburst
# 2. 删除时间服务器
chronyc delete ntp.aliyun.com
# 3. 手动强制同步(当时间偏差较大时)
chronyc makestep 1 3
# 参数说明:1秒以上的偏差立即调整,最多调整3秒
# 4. 快速获取样本(用于初始同步)
chronyc burst 3/4
# 获取3个好样本(4个样本中)
# 5. 使时间源上线/下线
chronyc online ntp.aliyun.com
chronyc offline time.google.com
# 6. 设置平滑调整阈值
chronyc maxupdateskew 1000.0
# 设置最大更新偏斜为1000ppm
# 7. 重新扫描网络接口
chronyc rekey
chronyc rekey -c
# 8. 重置统计信息
chronyc reset
chronyc reset sources
chronyc reset serverstats
| 命令 | 说明 | 示例 |
|---|---|---|
reselect |
重新选择时间源 | chronyc reselect |
manual list |
列出手动时间设置 | chronyc manual list |
manual on/off |
启用/禁用手动时间设置 | chronyc manual on |
manual set |
手动设置时间 | chronyc manual set 1630000000 |
manual reset |
重置手动时间设置 | chronyc manual reset |
local |
显示本地时钟状态 | chronyc local |
settime |
直接设置系统时间 | chronyc settime 1630000000 |
trimrtc |
调整RTC时间 | chronyc trimrtc |
rtcdata |
显示RTC数据 | chronyc rtcdata |
#!/bin/bash
# chrony状态监控脚本
# 文件名:monitor_chrony.sh
echo "========== Chrony时间同步状态 =========="
echo
echo "1. 系统时间:"
date
echo
echo "2. chronyd服务状态:"
systemctl status chronyd --no-pager | head -10
echo
echo "3. 时间同步状态:"
chronyc tracking
echo
echo "4. 时间源状态:"
chronyc sources
echo
echo "5. 时间源统计:"
chronyc sourcestats
echo
echo "6. 服务器统计:"
chronyc serverstats
echo
echo "7. 活跃时间源:"
chronyc activity
echo
echo "8. 检查是否同步:"
chronyc waitsync 3 0.01 2>/dev/null && echo "已同步" || echo "未同步"
echo
echo "========== 监控完成 =========="
使用说明:
# 添加执行权限
chmod +x monitor_chrony.sh
# 运行脚本
sudo ./monitor_chrony.sh
# 定时运行(每5分钟)
echo "*/5 * * * * root /path/to/monitor_chrony.sh >> /var/log/chrony-monitor.log" | sudo tee /etc/cron.d/chrony-monitor
#!/bin/bash
# chrony问题诊断脚本
# 文件名:diagnose_chrony.sh
LOG_FILE="/var/log/chrony-diagnose.log"
echo "开始诊断chrony时间同步..." | tee -a "$LOG_FILE"
# 检查chronyd是否运行
if ! systemctl is-active --quiet chronyd; then
echo "错误:chronyd服务未运行" | tee -a "$LOG_FILE"
echo "尝试启动服务..." | tee -a "$LOG_FILE"
sudo systemctl start chronyd
sleep 2
fi
echo "1. 检查网络连接..." | tee -a "$LOG_FILE"
ping -c 3 ntp.aliyun.com 2>&1 | tee -a "$LOG_FILE"
echo "2. 检查NTP端口..." | tee -a "$LOG_FILE"
nc -z -u ntp.aliyun.com 123 2>&1 | tee -a "$LOG_FILE"
echo "3. 检查防火墙..." | tee -a "$LOG_FILE"
if command -v firewall-cmd &> /dev/null; then
firewall-cmd --list-all | grep -E "(ntp|123)" | tee -a "$LOG_FILE"
elif command -v ufw &> /dev/null; then
ufw status | tee -a "$LOG_FILE"
fi
echo "4. 检查chrony状态..." | tee -a "$LOG_FILE"
chronyc tracking 2>&1 | tee -a "$LOG_FILE"
echo "5. 检查时间源..." | tee -a "$LOG_FILE"
chronyc sources 2>&1 | tee -a "$LOG_FILE"
echo "6. 检查配置文件..." | tee -a "$LOG_FILE"
grep -E "^server|^pool" /etc/chrony.conf | tee -a "$LOG_FILE"
echo "7. 尝试强制同步..." | tee -a "$LOG_FILE"
chronyc makestep 1 3 2>&1 | tee -a "$LOG_FILE"
echo "8. 查看系统日志..." | tee -a "$LOG_FILE"
journalctl -u chronyd --since "1 hour ago" --no-pager | tail -20 | tee -a "$LOG_FILE"
echo "诊断完成。详细日志请查看:$LOG_FILE" | tee -a "$LOG_FILE"
#!/bin/bash
# 自动修复chrony时间同步
# 文件名:fix_chrony.sh
LOG_FILE="/var/log/chrony-fix.log"
MAX_OFFSET=1.0 # 最大允许偏移量(秒)
echo "开始检查并修复时间同步..." | tee -a "$LOG_FILE"
# 获取当前偏移量
OFFSET=$(chronyc tracking | grep "System time" | awk '{print $4}')
# 转换为绝对值
OFFSET_ABS=$(echo "$OFFSET" | sed 's/^-//')
echo "当前时间偏移:${OFFSET}秒" | tee -a "$LOG_FILE"
# 检查偏移量是否过大
if (( $(echo "$OFFSET_ABS > $MAX_OFFSET" | bc -l) )); then
echo "偏移量过大(${OFFSET_ABS}秒 > ${MAX_OFFSET}秒),尝试修复..." | tee -a "$LOG_FILE"
# 停止chronyd服务
sudo systemctl stop chronyd
# 使用ntpdate进行快速同步
echo "使用ntpdate进行快速同步..." | tee -a "$LOG_FILE"
if command -v ntpdate &> /dev/null; then
sudo ntpdate -b ntp.aliyun.com 2>&1 | tee -a "$LOG_FILE"
else
echo "安装ntpdate..." | tee -a "$LOG_FILE"
sudo yum install -y ntpdate 2>&1 | tee -a "$LOG_FILE"
sudo ntpdate -b ntp.aliyun.com 2>&1 | tee -a "$LOG_FILE"
fi
# 启动chronyd服务
sudo systemctl start chronyd
# 等待服务启动
sleep 3
# 强制chrony步进
echo "强制chrony步进调整..." | tee -a "$LOG_FILE"
chronyc makestep 1 3 2>&1 | tee -a "$LOG_FILE"
# 检查修复结果
NEW_OFFSET=$(chronyc tracking | grep "System time" | awk '{print $4}')
echo "修复后时间偏移:${NEW_OFFSET}秒" | tee -a "$LOG_FILE"
# 同步硬件时钟
echo "同步硬件时钟..." | tee -a "$LOG_FILE"
sudo hwclock --systohc 2>&1 | tee -a "$LOG_FILE"
else
echo "时间偏移正常,无需修复。" | tee -a "$LOG_FILE"
fi
echo "修复完成。" | tee -a "$LOG_FILE"
# 错误:506 Cannot talk to daemon
# 原因:chronyd服务未运行或配置错误
# 解决方案:
# 1. 检查服务状态
sudo systemctl status chronyd
# 2. 启动服务
sudo systemctl start chronyd
sudo systemctl enable chronyd
# 3. 检查配置文件
sudo chronyd -d -f /etc/chrony.conf
# 4. 检查端口(默认323)
sudo netstat -tulpn | grep 323
# 5. 检查权限
ls -la /run/chrony/
ls -la /var/lib/chrony/
# 错误:所有时间源都显示为"?"
# 原因:网络问题或防火墙阻止
# 解决方案:
# 1. 检查网络连接
ping ntp.aliyun.com
# 2. 检查NTP端口访问
nc -z -u ntp.aliyun.com 123
# 3. 检查防火墙
sudo firewall-cmd --list-all | grep ntp
# 添加规则(如果需要)
sudo firewall-cmd --add-service=ntp --permanent
sudo firewall-cmd --reload
# 4. 检查DNS解析
dig ntp.aliyun.com
# 5. 尝试使用IP地址
chronyc add server 203.107.6.88 iburst
# 问题:系统时间持续漂移
# 原因:硬件时钟不稳定或配置不当
# 解决方案:
# 1. 检查硬件时钟
sudo hwclock --show
# 2. 启用硬件时间戳(如果支持)
# 编辑/etc/chrony.conf,添加:
# hwtimestamp eth0
# hwtimestamp eth1
# 3. 调整平滑参数
chronyc maxupdateskew 100.0
chronyc maxdistance 1.0
# 4. 强制步进调整
chronyc makestep 0.1 3
# 5. 检查时间源质量
chronyc sourcestats -v
# 6. 增加轮询间隔
# 编辑/etc/chrony.conf,修改:
# minsources 3
# maxsamples 8
# 1. 优化配置文件
sudo vi /etc/chrony.conf
# 添加以下内容:
# 使用iburst加速初始同步
server ntp.aliyun.com iburst
server time.google.com iburst
# 启用硬件时间戳(如果网卡支持)
hwtimestamp eth0
# 设置层级限制(只信任层级1-3的服务器)
stratumweight 0
stratum10weight 0
stratum11weight 0
stratum12weight 0
# 2. 调整内核参数
# 编辑/etc/sysctl.conf,添加:
# 减少时间抖动
net.core.default_qdisc=fq_codel
net.ipv4.tcp_congestion_control=bbr
# 3. 监控chrony性能
# 创建监控脚本定期检查
# 关注指标:offset, jitter, frequency error
# 4. 使用本地参考时钟(如果有)
# refclock SHM 0 offset 0.5 delay 0.2 refid GPS
chronyc tracking - 同步状态chronyc sources - 时间源状态chronyc sourcestats - 时间源统计chronyc activity - 活跃源数量chronyc serverstats - 服务器统计chronyc add server - 添加服务器chronyc delete - 删除服务器chronyc makestep - 强制步进chronyc burst - 快速获取样本chronyc reselect - 重新选择源iburst选项加速初始同步chronyc tracking输出makestep强制调整