3、NTP客户端配置:Linux下NTP客户端安装、ntpdate命令使用、ntpd服务配置、chrony替代方案

时间同步这件事,说大不大,说小不小。我见过不少线上故障,最后追根溯源,都是因为服务器时间偏差了几秒钟。日志对不上、证书验证失败、分布式节点数据冲突……嗯,这些坑我都踩过。

这一章,我们就把Linux下的NTP客户端配置彻底讲透。从最基础的安装,到ntpdate手动同步,再到ntpd服务化运行,最后聊聊chrony这个更现代的替代方案。

3.1 安装NTP客户端

不同发行版的包管理工具不一样,但安装过程大同小异。我个人习惯在CentOS上用yum,在Ubuntu上用apt,记住这两个就够了。

# CentOS / RHEL
sudo yum install ntp ntpdate -y

# Ubuntu / Debian
sudo apt update
sudo apt install ntp ntpdate -y

安装完成后,可以用 ntpq -p 检查一下服务是否启动。如果提示“No association ID's returned”,别慌,说明ntpd还没配置好,或者还没开始同步。

小提示: 生产环境中,我建议安装完成后先不要急着启动服务,先把配置文件调好再说。

3.2 ntpdate命令:手动同步的利器

ntpdate是一个一次性同步工具。说白了,就是“我现在就要把时间调准,不管别的”。

用法很简单:

sudo ntpdate -u ntp.aliyun.com

-u 参数的意思是使用非特权端口(1024以上),这个在防火墙严格的环境下特别有用。我曾经在一家金融公司调试时,发现ntpdate总是超时,折腾了半天才发现是防火墙只放行了非特权端口。

手动同步后,可以用 date 命令确认时间是否更新:

date
Thu Mar 14 10:25:33 CST 2025
注意: ntpdate 和 ntpd 不能同时运行。如果ntpd已经在后台运行,再执行ntpdate会报错“the NTP socket is in use”。必须先停掉ntpd服务。

3.3 ntpd服务配置

ntpd是长期运行的后台守护进程。它会持续监控系统时间,并通过微调来保持同步,而不是像ntpdate那样“猛调”。

核心配置文件是 /etc/ntp.conf。我一般会这样配置:

# 使用阿里云NTP服务器
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst

# 限制访问权限
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1

# 本地时钟作为备用
server 127.127.1.0
fudge 127.127.1.0 stratum 10

几个关键参数说明:

参数 含义 我的建议
iburst 启动时快速发送4个包,加速首次同步 必加,否则首次同步可能要等很久
restrict 访问控制,限制谁可以查询或修改 默认配置够用,别乱改
fudge 调整本地时钟的层级 当所有外部服务器都不可用时,本地时钟作为最后手段

配置完成后,启动服务:

sudo systemctl start ntpd
sudo systemctl enable ntpd
sudo systemctl status ntpd

查看同步状态:

ntpq -p

输出示例:

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp.aliyun.com  10.137.38.86     2 u   23   64  377   28.123   -2.345   0.678

看到 * 号了吗?那表示当前同步源。如果显示的是 + 号,表示候选源。如果全是空白,说明还没同步上。

核心要点: ntpd的同步策略是“慢调”,每次调整幅度很小。如果系统时间偏差太大(比如超过1000秒),ntpd默认会拒绝同步。这时候需要先用ntpdate手动拉回来,再启动ntpd。

3.4 chrony:更现代的替代方案

chrony是ntpd的现代替代品。说实话,我现在新部署的服务器,基本都用chrony。为什么?

  • 同步速度更快:chrony能在几秒内完成首次同步,ntpd可能要几分钟
  • 网络波动适应性强:即使网络间歇性中断,chrony也能保持较好的时间精度
  • 配置更简洁:配置文件只有几行,不像ntp.conf那么啰嗦

安装chrony:

# CentOS 7+ / RHEL 7+
sudo yum install chrony -y

# Ubuntu 16.04+
sudo apt install chrony -y

配置文件 /etc/chrony.conf 示例:

# 使用阿里云NTP服务器
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst

# 允许本地客户端查询
allow 127.0.0.1

# 本地时钟备用
local stratum 10

启动chronyd:

sudo systemctl start chronyd
sudo systemctl enable chronyd

查看同步状态:

chronyc sources -v

输出示例:

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
|   '             '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp.aliyun.com               2   6   377    42   -3.123ms   +/-   28ms
^- ntp1.aliyun.com              2   6   377    43   +1.456ms   +/-   32ms

^* 表示当前同步源,和ntpq的 * 是一个意思。

我的经验: 如果你在容器或云环境中部署,chrony是更好的选择。它占用的资源更少,启动更快,而且对虚拟化时钟的支持更好。我在Kubernetes节点上全部用chrony,从来没出过问题。

3.5 知识体系图

下面这张图,把NTP客户端配置的核心逻辑串起来了:

NTP客户端配置知识体系 NTP客户端配置核心逻辑 NTP时间源服务器 ntpdate 手动同步 ntpd 服务化同步 chrony 替代方案 一次性同步 适合首次校准 持续微调同步 适合长期运行 快速同步+抗波动 现代推荐方案 无配置文件 /etc/ntp.conf /etc/chrony.conf date / ntpdate -q ntpq -p chronyc sources 核心原则:ntpdate与ntpd/chronyd不能同时运行,先手动校准,再启动服务

3.6 避坑指南

最后,分享几个我踩过的坑:

  • 防火墙拦截:NTP使用UDP 123端口。我曾经在云服务器上忘了开安全组规则,结果ntpdate一直超时。检查一下防火墙,别在这种小事上浪费时间。
  • 时区问题:NTP只同步时间,不同步时区。如果你发现时间对了但显示不对,用 timedatectl set-timezone Asia/Shanghai 设置时区。
  • 虚拟化环境:VMware或KVM虚拟机中,建议启用主机时间同步,否则虚拟机时钟漂移会很快。我见过一台VM一天漂了30秒。
  • ntpd启动失败:检查 /var/log/messages 或 journalctl -u ntpd。大部分情况是配置文件语法错误,或者端口被占用。
重要提醒: 不要在生产环境中同时运行ntpd和chronyd。它们会互相冲突,导致时间同步混乱。选一个用就行,我个人推荐chrony。