Ubuntu时间同步
这几天,服务器的状态自动上报脚本遇到了一些问题,细细排查发现是系统时间不准,比标准时间快了半分钟。于是探索了如何进行时间同步。
背景知识
参考:
NTP(NetworkTimeProtocol)是一种用于同步计算机时钟的协议,基于客户端-服务器模型(Client-Server model),通过交换数据包来保持设备时间的一致性。NTP协议的工作原理是与已知的、精准的时间源同步(如GPS、原子钟或通过互联网获得的时间源),从而调整本地时钟。

NTP协议最早于1985年提出,目前已经发展到了v4版本。它引入了许多新特性和改进,包括更准确的时钟选择算法、更强大的安全性和认证机制、更好的时钟校准算法、更灵活的配置选项等。
NTP协议的具体校时流程如下图所示。考虑到网络传输的延迟问题,NTP同步时并不会直接将服务器提供的时间作为本地时间,而是通过数据包的请求-响应时间推算出网络延迟,并根据服务器返回的时间以及网络延迟的时间校准本地实际。

在旧版本的Linux系统中,NTP服务由 ntpd 进程管理,其配置文件位于 /etc/ntp.conf 。现代Linux引入了systemd管理系统,集成了许多系统底层的服务进程,因此NTP服务由systemd接管,对应的服务进程名称为 systemd-timesyncd 。可以通过下面的方法确定系统中具体使用的是哪一个服务:

下面说一说进行时间同步的具体方法
具体方法
首先检查时间同步状态:
1 | (base) ~$ date |
注意到,其中 System clock synchronized: no ,表示未能开启同步。可能的原因包括:①防火墙/UDP 123 端口被阻止(但是经过检查并没有这个问题)②默认NTP服务器无法响应。
这里我们猜测是后一种原因,因此接下来的步骤就是给NTP服务器换源。
step1. 寻找可用的NTP服务器
在一篇技术博客《国内常用NTP时间源同步服务器汇总》中,作者提到了一系列在国内可用的服务器列表,这里我摘取了一些:
| 服务器地址 | 备注 |
|---|---|
| ntp1.aliyun.com | 阿里云公共 NTP |
| ntp2.aliyun.com | 阿里云公共 NTP |
| ntp3.aliyun.com | 阿里云公共 NTP |
| ntp1.tencent.com | 腾讯云公共 NTP |
| ntp.ntsc.ac.cn | 国家授时中心 |
可以用 ping 指令测试上述服务器的在线状态:

我们保留几个可用的NTP服务器,下一步就是去修改NTP配置文件了。
step2. 修改 NTP配置文件
在Ubuntu系统中,NTP的配置文件存储路径为 /etc/systemd/timesyncd.conf (并非一些博客中提到的 /etc/ntp.conf )。我们将其中的内容修改为:
1 | [Time] |

step3. 重启NTP服务进程
运行下面的指令即可重启
1 | sudo systemctl restart systemd-timesyncd |
之后,可以使用 sudo timedatectl status 检查同步状态:

出现 System clock synchronized: yes 表明修改成功。