Linux chronyc命令 详解

chronyc是chrony时间同步服务的控制工具,用于监控和管理chronyd守护进程。chrony是现代Linux系统中推荐的NTP客户端/服务器软件,比传统的ntpdate和ntpd更优秀。

Chrony简介

Chrony优势
  • 更快的同步速度
  • 更好的网络中断处理
  • 支持间歇性网络连接
  • 无需频繁轮询NTP服务器
  • 支持硬件时间戳
  • 更好的安全性
主要组件
  • chronyd - 守护进程
  • chronyc - 命令行客户端
  • /etc/chrony.conf - 配置文件
  • /var/lib/chrony - 状态文件目录

安装chrony

# 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

实战示例

示例1:完整的时间同步监控脚本
#!/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
示例2:时间同步问题诊断脚本
#!/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"
示例3:自动修复时间同步脚本
#!/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命令速查表
监控命令:
  • chronyc tracking - 同步状态
  • chronyc sources - 时间源状态
  • chronyc sourcestats - 时间源统计
  • chronyc activity - 活跃源数量
  • chronyc serverstats - 服务器统计
控制命令:
  • chronyc add server - 添加服务器
  • chronyc delete - 删除服务器
  • chronyc makestep - 强制步进
  • chronyc burst - 快速获取样本
  • chronyc reselect - 重新选择源
最佳实践
  • 至少配置3个时间源以提高可靠性
  • 使用iburst选项加速初始同步
  • 定期监控chronyc tracking输出
  • 对于虚拟机,启用与宿主机的时间同步
  • 考虑部署本地NTP服务器作为中继
  • 生产环境避免使用makestep强制调整
重要提醒
  • 时间同步对集群、数据库、日志系统至关重要
  • 错误的系统时间可能导致证书验证失败
  • 避免频繁手动调整时间
  • 配置防火墙允许NTP流量(UDP 123)
  • chrony修改是临时的,重启后会丢失,永久修改需编辑配置文件
  • 对于关键业务系统,考虑使用GPS或原子钟作为时间源