26
10月
2023
Linux 中的时间同步:使用 SNTP 服务
15:45

Linux 中的时间同步:使用 SNTP 服务

26 10月 2023 15:45

在某些情况下,常规 NTP 客户端服务的功能是不够的:在没有 CMOS 电池的情况下重新启动 PC 就是一个例子。 互联网质量差 - 时间同步不频繁导致 NTP 服务无法充分发挥作用。 为了解决这个问题,发明了 systemd-timesyncd 服务,它使用简化的 SNTP 协议 - Simple NTP 进行工作。

设置时区

(可选)文章中讨论了时区 《Linux 时间》

sudo timedatectl set-timezone 欧洲/莫斯科

时间同步方式

1)使用客户端 NTP 中讨论了什么 文章- 完整的 NTP 客户端。

2)使用systemd-timesyncd服务——一个简单的客户端 网络时间协议 使用 systemd 进行同步。
3)其他方法(我不考虑)。

安装 systemd-timesyncd 服务

sudo apt install systemd-timesyncd

启动systemd-timesyncd服务

sudo systemctl enable systemd-timesyncd.service
sudo systemctl start systemd-timesyncd.service

通过 systemd-timesyncd 服务启用时间同步

允许通过网络进行时间同步:

sudo timedatectl set-ntp true

<a名称=“自动”>

设置自动时间同步

为了按照指定的时间间隔自动进行时间校正,您需要更正配置文件 /etc/systemd/timesyncd.conf:

sudo nano /etc/systemd/timesyncd.conf

<代码>[时间]
NTP=2.ru.pool.ntp.org
FallbackNTP=3.ru.pool.ntp.org
根距离最大秒=5
轮询间隔最小秒=32
PollIntervalMaxSec=2048

在此示例中,NTP 服务器轮询间隔范围为 32 秒到 34 分钟。

重新启动 systemd-timesyncd 服务:

sudo systemctl restart systemd-timesyncd.service

检查时间同步状态

timedatectl status

如果一切顺利,输出将是:

系统时钟同步:是
NTP service: active

注意事项

两种方法是互斥的:
*网络时间协议:* 安装 ntp/sntp 软件包将自动删除 systemd-timesyncd 软件包。
SNTP:** systemd-timesyncd 的工作不需要 ntp 包。

看来第二种方法SNTP更适合现场环境和嵌入式系统。 由于它在特殊文件中维护重新启动之间的时间并借助修正,因此考虑了时钟漂移。

MAN - SYSTEMD-TIMESYNCD.SERVICE 服务的用户手册

SYSTEMD-TIMESYNCD.SERVICE(8) systemd-timesyncd.service SYSTEMD-TIMESYNCD.SERVICE(8)

姓名
systemd-timesyncd.service, systemd-timesyncd — синхронизация времени по сети

概要
systemd-timesyncd.service
/lib/systemd/systemd-timesyncd

描述
systemd-timesyncd 是一项系统服务,可用于将本地系统时钟与远程网络时间协议 (NTP) 服务器同步。

每次时钟同步时,它还会将本地时间保存到磁盘,并使用它来可能在后续重新启动时提前系统实时时钟,以确保它(大致)单调地提前,即使系统缺少电池缓冲 RTC 芯片也是如此。

systemd-timesyncd 服务仅实现 SNTP。 这种极简服务将增加系统时钟以获得较大的偏移量,或缓慢地调整它以获得较小的偏移量。 systemd-timesyncd 不涵盖需要完整 NTP 支持(以及 SNTP 不足)的复杂用例。

对 NTP 服务器的访问取决于 timesyncd.conf(5) 中的全局设置、.network 文件中的静态每通道设置以及通过附加信息中的 DHCP 获取的动态每通道设置 - 请参阅 systemd.network(5)。

团队 timedatectl 设置 ntp true 可用于启用和启动或禁用和停止此服务。

团队 timedatectl 时间同步状态timedatectl 显示时间同步 可用于显示该服务的当前状态。

Systemd-timesyncd 初始化会延迟启动在 time-set.target 之后订购的模块(有关详细信息,请参阅 systemd.special(7)),直到从 /var/lib/systemd/timesync/lock 更新本地时间(请参阅下文)。 )使其变得近似单调。 它不会延迟其他设备,直到与准确的时间参考源实现同步。 为此,请使用 systemd-time-wait-sync.service(8),这将延迟启动在 time-sync.target 之后订购的模块,直到与准确的参考时钟实现同步。

文件
/var/lib/systemd/timesync/时钟
该文件的修改时间(“mtime”)表示上次成功同步的时间戳(如果无法同步,则至少是 systemd 构建日期)。 它用于确保在没有本地实时时钟的情况下系统时钟在重新启动后保持大致单调。

/运行/systemd/timesync/同步
每次成功同步时都会涉及的文件,以帮助 systemd-time-wait-sync 和其他应用程序检测与准确参考时钟的同步。

如何找出上次成功时间同步的日期和时间?

ls -l /var/lib/systemd/timesync/clock

手动启动时间同步

如果配置了则无需手动同步时间 通过互联网自动同步时间

手动时间同步命令:

sudo systemctl restart systemd-timesyncd

 

为了方便手动时间同步,可以创建一个shell脚本,名为 “时间同步.sh”:

<代码>#!/bin/sh
sudo systemctl 重新启动 systemd-timesyncd.service
查找 /var/lib/systemd/timesync/clock -printf "文件: %f: 日期: %TY-%Tm-%Td - 时间: %TT\n" -exec tail -n5 {} \;
timedatectl 状态 | grep -e“同步”-e“NTP"

以下是 ZIP 存档中的文件:
时间同步.sh.zip

保存到当前目录并使其可执行

sudo chmod +x timesync.sh

手动启动时间同步:

./timesync.sh

(为避免每次都要求输入密码: usermod -aG sudo ваше_имя )。

注意: :如果 PC 时钟已高精度同步,则无论向 NTP 服务器发出请求时是否存在网络连接,该服务都会写入:“系统时钟已同步:是”。

使用 SNTP 时的时间误差(偏差)是多少?

系统时钟相对于准确时间的偏差为5-6毫秒:

sudo apt-get update
sudo apt install iputils-clockdiff
sudo clockdiff 3.ru.pool.ntp.org

技术细节

时间同步时采用UDP协议,远程端口123,NTP Version 4协议。
有效负载为 48 字节。

帧 xxxx:传输 90 字节(720 位),在接口 enp1s10 上捕获 90 字节(720 位),id 0
以太网 II,源:PERIPHER_0c(),目标:路由器()
Internet 协议版本 4,源:xx.xx.xx.xx,目标:91.209.94.10
用户数据报协议,源端口:xxxxx,目标端口:123
Source Port: xxxxx
Destination Port: 123
Length: 56
Checksum: 0x7b13 [unverified]
[Checksum Status: Unverified]
[Stream index: 1059]
[Timestamps]
UDP payload (48 bytes)
网络时间协议(NTP 版本 4,客户端)
Flags: 0x23, Leap Indicator: no warning, Version number: NTP Version 4, Mode: client
Peer Clock Stratum: unspecified or invalid (0)
对等轮询间隔:无效 (0)
Peer Clock Precision: 1,000000 seconds
Root Delay: 0,000000 seconds
Root Dispersion: 0,000000 seconds
Reference ID: NULL
Reference Timestamp: (0)Jan 1, 1970 00:00:00.000000000 UTC
Origin Timestamp: (0)Jan 1, 1970 00:00:00.000000000 UTC
Receive Timestamp: (0)Jan 1, 1970 00:00:00.000000000 UTC
Transmit Timestamp: Oct 26, 2023 13:10:05.053581346 UTC

实验

如果您的电脑一夜之间没有互联网,时钟偏差会是多少?

如果您将电脑关闭过夜,然后在没有网络的情况下启动它,则时间误差将增加 114-168 毫秒。

打开互联网后,系统时间借助SNTP协议和SystemD服务独立回归准确——计算机系统时钟的误差为负14毫秒。

有用的链接:
*使用 Systemd Timesyncd 在 Linux 上配置时间同步