时间同步:chrony 配置与时间不准引发的那些怪事

时间不准带来的问题都很诡异:证书突然报「尚未生效」、定时任务不执行、日志顺序错乱、分布式系统数据不一致。配置只要两分钟,值得做对。

一、时间不准会怎样

现象原因
HTTPS 证书报错「not yet valid」本地时间比真实时间慢
证书突然过期本地时间快了
cron 任务不跑时间跳变导致错过窗口
日志时间对不上多台机器时间不一致
make 反复重新编译文件 mtime 在未来
数据库主从异常时钟漂移超过阈值

二、chrony 还是 ntp

工具状态特点
chrony推荐,主流发行版默认同步快、虚拟机和断网环境表现好
ntpd传统稳定但收敛慢
systemd-timesyncd轻量只做客户端,精度一般
bash
# 看看系统上装了哪个
systemctl status chrony 2>/dev/null || systemctl status systemd-timesyncd
timedatectl

三、安装与配置

bash
sudo apt install -y chrony
sudo systemctl enable --now chrony

配置文件 /etc/chrony/chrony.conf

nginx
# 上游时间源,用 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/chrony

iburst 很重要:启动时连发几个包,让同步在几秒内完成,而不是等几分钟。

bash
sudo systemctl restart chrony

四、验证

bash
# 看同步源状态(* 表示当前在用,? 表示不可达)
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

五、时区 ≠ 时间同步

两件独立的事:

bash
# UTC 是系统内部时钟(推荐保持 UTC)
# 时区只影响显示

timedatectl list-timezones | grep Shanghai
sudo timedatectl set-timezone Asia/Shanghai

# 看当前时间(本地 + UTC)
date
date -u

服务器保持 UTC 是个好习惯:日志时间戳不受夏令时影响,多机房对比也方便。需要本地时间时再在应用层转换。

六、手动改时间(谨慎)

bash
# 关掉自动同步才能手动改
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)而不是跳变。

七、容器里的时间

容器共享宿主机的内核时钟,无法独立设置时区以外的东西。

bash
# 容器内改时区
docker run -e TZ=Asia/Shanghai ...
# 或挂载
docker run -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro ...
yaml
# compose 写法
services:
  app:
    image: myapp
    environment:
      - TZ=Asia/Shanghai

所以容器时间准不准,取决于宿主机的 chrony

八、虚拟机特别要注意

虚拟机时钟容易漂移(CPU 调度、快照恢复都会影响):

bash
# 看漂移率,超过 100ppm 要留意
chronyc tracking | grep "Frequency"

# VMware/KVM 建议开启时钟同步辅助
# 云厂商的镜像一般已经配好

九、检查清单

bash
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 显示已同步
  • 时区设置正确

时间同步配置只要五分钟,但能避免一大类「莫名其妙」的故障。新机初始化时就该做掉。