时间同步:chrony 配置与时间不准引发的那些怪事
时间不准带来的问题都很诡异:证书突然报「尚未生效」、定时任务不执行、日志顺序错乱、分布式系统数据不一致。配置只要两分钟,值得做对。
一、时间不准会怎样
| 现象 | 原因 |
|---|---|
| HTTPS 证书报错「not yet valid」 | 本地时间比真实时间慢 |
| 证书突然过期 | 本地时间快了 |
| cron 任务不跑 | 时间跳变导致错过窗口 |
| 日志时间对不上 | 多台机器时间不一致 |
make 反复重新编译 | 文件 mtime 在未来 |
| 数据库主从异常 | 时钟漂移超过阈值 |
二、chrony 还是 ntp
| 工具 | 状态 | 特点 |
|---|---|---|
| chrony | 推荐,主流发行版默认 | 同步快、虚拟机和断网环境表现好 |
| ntpd | 传统 | 稳定但收敛慢 |
| systemd-timesyncd | 轻量 | 只做客户端,精度一般 |
# 看看系统上装了哪个
systemctl status chrony 2>/dev/null || systemctl status systemd-timesyncd
timedatectl三、安装与配置
sudo apt install -y chrony
sudo systemctl enable --now chrony配置文件 /etc/chrony/chrony.conf:
# 上游时间源,用 pool 更可靠
pool ntp.aliyun.com iburst
pool time.cloudflare.com iburst
pool 2.debian.pool.ntp.org iburst
# 允许同步的网段(本机当服务器给别人用时才需要)
# allow 10.0.0.0/8
# 启动时如果时钟偏差极大,允许步进调整(前 3 次)
makestep 1.0 3
# 记录漂移率,重启后能更快收敛
driftfile /var/lib/chrony/chrony.drift
# 日志
logdir /var/log/chronyiburst 很重要:启动时连发几个包,让同步在几秒内完成,而不是等几分钟。
sudo systemctl restart chrony四、验证
# 看同步源状态(* 表示当前在用,? 表示不可达)
chronyc sources -v
# 看是否真正同步
chronyc tracking
# Leap status : Normal
# Reference ID : ...
# Last offset : +0.000123 seconds
# 概览
timedatectl status
# System clock synchronized: yes
# NTP service: active
# 手动立即同步
sudo chronyc -a makestep五、时区 ≠ 时间同步
两件独立的事:
# UTC 是系统内部时钟(推荐保持 UTC)
# 时区只影响显示
timedatectl list-timezones | grep Shanghai
sudo timedatectl set-timezone Asia/Shanghai
# 看当前时间(本地 + UTC)
date
date -u服务器保持 UTC 是个好习惯:日志时间戳不受夏令时影响,多机房对比也方便。需要本地时间时再在应用层转换。
六、手动改时间(谨慎)
# 关掉自动同步才能手动改
sudo timedatectl set-ntp false
sudo date -s "2026-04-16 10:00:00"
sudo timedatectl set-ntp true
# 或者直接步进
sudo chronyc -a makestep时间跳变有风险:数据库、定时任务、分布式锁都可能出问题。除非偏差极大,一般让 chrony 平滑调整(slew)而不是跳变。
七、容器里的时间
容器共享宿主机的内核时钟,无法独立设置时区以外的东西。
# 容器内改时区
docker run -e TZ=Asia/Shanghai ...
# 或挂载
docker run -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro ...# compose 写法
services:
app:
image: myapp
environment:
- TZ=Asia/Shanghai所以容器时间准不准,取决于宿主机的 chrony。
八、虚拟机特别要注意
虚拟机时钟容易漂移(CPU 调度、快照恢复都会影响):
# 看漂移率,超过 100ppm 要留意
chronyc tracking | grep "Frequency"
# VMware/KVM 建议开启时钟同步辅助
# 云厂商的镜像一般已经配好九、检查清单
timedatectl
# ✓ System clock synchronized: yes
# ✓ NTP service: active
# ✓ Time zone: Asia/Shanghai (或 UTC)
chronyc tracking | grep -E "Leap|Last offset"
# ✓ Leap status: Normal
# ✓ Last offset 在毫秒级- chrony 已安装并开机自启
- 至少配 2~3 个上游源
timedatectl显示已同步- 时区设置正确
时间同步配置只要五分钟,但能避免一大类「莫名其妙」的故障。新机初始化时就该做掉。
