使用 NTP/NTS 同步时间
- 内容
本文介绍什么是时间同步,以及如何配置时间同步。
- 原因
通过网络与其他团队成员共享任务和资源时,保持系统时间同步至关重要。
- 工作量
阅读本文并在计算机上执行时间同步基本配置最多需要 60 分钟。
- 要求
需要具备 Linux 系统管理方面的基本知识。特定任务需要
root
特权。与内部网络或互联网建立了有效网络连接,以便能够访问源时间服务器。
1 简介 #
在计算机上保持系统时间准确且同步对于团队协作至关重要。应用程序规划和日程安排依赖于准确且同步的时间来正确跟踪时间,并及时通知用户有关约会的安排。对于群集应用程序,各个主机通常依赖于同步的系统时间来实现相互通讯。
内置硬件时钟并不是可靠的时间源。手动校正系统时间可能会因突然的时间跳跃而导致关键应用程序出现故障。因此,需要通过网络对照外部可靠时间源来同步系统时间。
1.1 什么是 NTP? #
网络时间协议 (NTP) 旨在通过网络同步系统时间。它的目标是维护绝对时间,并使用绝对时间来同步网络中所有计算机的系统时间。
1.2 什么是 NTS? #
网络时间安全 (NTS) 是 NTP 的安全扩展。NTS 提供了对 NTP 消息进行身份验证和加密的机制,从而确保接收到的时间数据安全且真实。NTS 设计为向后兼容现有的 NTP 基础架构。这样,您便可以进行逐步部署,而无需更改不支持 NTS 的现有 NTP 服务器。
1.3 NTP 的工作原理是怎样的? #
正确配置 NTP 服务后,它会不断地向可靠时间服务器查询时间并调整系统时间。通常,连接到互联网的家用计算机和其他设备配置为向互联网上的公共时间服务器发出查询。
相反,位于企业子网内的台式计算机和服务器则是配置为向本地网络内的专用时间服务器发出查询。时间服务器本身将其时间与公共时间服务器同步。
1.3.1 实现 #
chrony
是 SUSE Linux Micro 中 NTP 的默认实现。chrony
由两个部分组成:
chronyd
是可以在引导时启动的systemd
服务。chronyc
是一个命令行界面程序,用于监控chronyd
的性能,并在运行时更改特定的操作参数。
1.4 优势 #
使用 NTP 维护准确的时间可获得以下好处:
用户可以依赖于自己的时钟来遵循安排的日程。
应用程序可以准确地触发已安排好的桌面或系统操作。
群集节点可以将其数据保持同步和最新状态。
在互联网访问受限的网络中,使用内部时间服务器有助于保持系统时间同步。
该协议通过 NTS 将安全措施集成到 NTP 中,增强了 NTP 的稳健性,并解决了与不安全的时间同步相关的漏洞。
2 通过调整 /etc/chrony.conf
来配置 NTP #
chronyd
在启动时,将从 /etc/chrony.conf
文件读取其配置。以下部分列出了可能影响 chronyd
行为的重要参数。
2.1 指定时间源 #
要让计算机时钟保持同步,您需要告知 chronyd
使用哪些时间源。为此,请使用 server
、pool
和 peer
指令。可以多次使用其中的每个指令。
server
指令告知 chronyd
按照名称或 IP 地址使用特定的主机作为时间服务器。
server 0.europe.pool.ntp.org offline1 server 1.europe.pool.ntp.org offline prefer2 server 192.168.2.254
| |
|
pool
指令可让您指定一个网络名称,该名称解析为随时间变化的多个 IP 地址。
pool pool.ntp.org iburst1 maxsources 32
peer
指令指定 NTP 对等主机而不是时间服务器。对等节点之间的系统时间同步使用对称体系结构,而不是 server
和 pool
选项调用的客户端/服务器模式。您可以多次使用 peer
来指定多个对等节点。
peer 192.168.1.116 peer ntp.example.com
2.2 将 chronyd
作为 NTP 服务器运行 #
默认情况下,chronyd
作为指定的 NTP 服务器的客户端运行。要使其同时作为 NTP 服务器运行,请将 allow
指令添加到 /etc/chrony.conf
文件中。该指令会打开 NTP 服务器端口(默认为 123)并响应客户端请求。
您可以指定 NTP 客户端的单个 IP,也可以指定子网以包含多个客户端。您可以多次使用 allow
指令:
allow 1.2.3.4 allow 3.4.5.0/24
如果您不指定 IP 地址或子网,则独立的 allow
指令会允许来自所有 IPv4 和 IPv6 地址的访问请求。
要限制上述 allow
指令的访问权限,请使用 deny
指令:
allow 1.2.3.4 deny 1.2.3.0/24 allow 1.2.0.0/16
在上面的示例中,无论三个指令的顺序如何,效果都是相同的。在此示例中,允许访问 1.2.0.0/16
子网,但拒绝访问 1.2.3.0/24
子网。但是,允许访问主机 1.2.3.4
。
2.3 配置本地参考时钟 #
chronyd
依赖使用其他程序(例如 gpsd
)通过特定驱动程序来访问计时数据。在 /etc/chrony.conf
中使用 refclock
指令可指定要用作时间源的硬件参考时钟。它有两个必填参数:驱动程序名称和驱动程序特定的参数。这两个参数后面跟着零个或多个 refclock
选项。chronyd
包含以下驱动程序:
- PPS
内核 pulse per second API 的驱动程序。例如:
refclock PPS /dev/pps0 lock NMEA refid GPS
- SHM
NTP 共享内存驱动程序。例如:
refclock SHM 0 poll 3 refid GPS1 refclock SHM 1:perm=0644 refid GPS2
- SOCK
Unix 域套接字驱动程序。例如:
refclock SOCK /var/run/chrony.ttyS0.sock
- PHC
PTP 硬件时钟驱动程序。例如:
refclock PHC /dev/ptp0 poll 0 dpoll -2 offset -37 refclock PHC /dev/ptp1:nocrossts poll 3 pps
有关各个驱动程序的选项的详细信息,请参见 man 8
chrony.conf
。
2.4 激活脱机时间源 #
尽管 chronyd
在引导时没有网络连接的系统上可以正常启动,但它无法访问 /etc/chrony.conf
中指定的时间服务器。要防止 chronyd
尝试向不可访问的时间服务器发出查询,请在时间源指令的旁边使用 offline
选项,例如:
server ntp.example.org offline
这样,chronyd
将不会尝试轮询服务器,除非使用以下命令启用这种轮询:
#
chronyc online ntp.example.org
如果设置了 auto_offline
选项而不是 offline
选项,在向时间服务器发送了两个请求,但未接收到任何响应时,chronyd
会假设时间服务器已脱机。如果使用此选项,在网络链接断开时,无需从 chronyc
运行 offline
命令。
3 管理 chronyd
在运行时的行为 #
3.1 什么是 chronyc
? #
chronyc
是 chrony
NTP 实现的客户端部分。您可以使用 chronyc
命令来更改 chronyd
服务在运行时的行为。它会生成有关 chronyd
的操作的状态报告。
使用 chronyc
进行的更改不是永久性的。在 chronyd
下次重启动后,这些更改将会丢失。要进行永久性更改,请按照第 2 节 “通过调整 /etc/chrony.conf
来配置 NTP”中所述修改 /etc/chrony.conf
。
3.2 chronyc
的工作原理是怎样的? #
您可以在交互模式或非交互模式下运行 chronyc
。要以交互方式运行 chronyc
,请在命令行中输入 chronyc
并按 Enter。如此会显示提示符并等待您输入命令。例如,要检查有多少个 NTP 源联机或脱机,请运行 activity
命令:
#
chronyc
chronyc> activity
200 OK
4 sources online
2 sources offline
1 sources doing burst (return to online)
1 sources doing burst (return to offline)
0 sources with unknown address
要退出 chronyc
的提示符,请输入 quit
或 exit
。
如果您不需要使用交互提示符,请直接输入命令,例如:
#
chronyc
activity
4 chronyd
systemd
服务 #
chrony
的主要组成部分是 chronyd
systemd
服务,它在后台运行,可将系统时间与选定时间服务器保持同步。您可以使用以下 systemd
命令来操作 chronyd
服务:
-
systemctl status chronyd.service
列显有关
chronyd
服务当前状态的扩展信息。-
systemctl is-enabled chronyd.service
检查是否启用了在系统引导时自动启动
chronyd
服务的设置。-
systemctl enabled chronyd.service
启用在系统引导时自动启动
chronyd
服务的设置。-
systemctl disable chronyd.service
禁用在系统引导时自动启动
chronyd
服务的设置。-
systemctl is-active chronyd.service
检查
chronyd
服务是否已启动并正在运行。-
systemctl start chronyd.service
启动
chronyd
服务。-
systemctl stop chronyd.service
停止
chronyd
服务。-
systemctl restart chronyd.service
重启动
chronyd
服务并重新加载/etc/chronyd.conf
。
5 查错 #
如果出现错误,请检查以下事项。
校验您的计算机是否已连接到网络并且已正确配置该网络:
>
sudo
systemctl status network.service ● NetworkManager.service - Network Manager Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2021-08-07 20:09:44 CEST; 4 days ago [...]校验您作为时间源输入的时间服务器是否存在,并且可通过网络访问它们。例如:
>
ping pool.ntp.org PING pool.ntp.org (85.199.214.101) 56(84) bytes of data. 64 bytes from 85.199.214.101 (85.199.214.101): icmp_seq=1 ttl=37 time=29.9 ms [...]如果您计算机上的
firewalld
服务处于活动状态,请校验是否允许 NTP 服务。校验
chronyd
服务是否正在运行:>
sudo
systemctl status chronyd.service ● chronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2021-08-07 20:09:44 CEST; 4 days ago [...]如果虚拟化 Guest 上的系统时间与确切时间有偏差,请确保 VM 主机服务器系统时间与有效的时间服务器同步,并且 Guest 与主机使用相同的时间源进行同步。
如果 NTP 服务在系统引导期间无法正常启动,则原因可能是网络交换机配置为使用
Spanning Tree Protocol
,但端口未配置为Edge Ports
,而是配置为Portfast
。在这种情况下,最多可能需要等待一分钟才能建立网络连接。如果在使用 NetworkManager 的情况下,NTP 服务在系统引导期间无法启动,请编辑
/etc/sysconfig/network/config
文件并将NM_ONLINE_TIMEOUT
值更改为 30。如果问题仍然存在,请将超时值增加 15,然后重试。如果无法访问 NTP 源,请使用以下命令识别这些源:
>
chronyc sources -v [...] MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* time.mydomain.com 3 10 377 81 -5354us[-8257us] +/- 191ms ^? ntp1.example.com 0 10 0 - +0ns[ +0ns] +/- 0ns ^? 77.177.77.177 0 10 0 - +0ns[ +0ns] +/- 0ns ^? ntp3.example.com 0 10 0 - +0ns[ +0ns] +/- 0ns ^? ntp4.example.net 0 10 0 - +0ns[ +0ns] +/- 0ns ^? 2a02:3d8:1::1:1 0 6 0 - +0ns[ +0ns] +/- 0ns ^? ntp2.example.org 0 10 0 - +0ns[ +0ns] +/- 0ns在本例中,只有
time.mydomain.com
服务器在真正提供时间。有必要对无法访问的远程 NTP 时间源的网络连接进行一般性查错。
6 更多信息 #
https://documentation.suse.com/sles/html/SLES-all/cha-security-firewall.html#sec-security-firewall-firewalld 中介绍了如何使用
firewalld
保护您的计算机。https://susedoc.github.io/doc-modular/main/html/reference-systemctl-enable-disable-services/ 中列出了用于操作
systemd
服务的命令。有关完整参考,请参见相关的手册页:
如需配置指令的完整列表,请运行
man 1 chrony.conf
。如需
chronyc
命令的完整列表,请运行man 1 chronyc
。如需
chronyd
命令行选项的完整列表,请运行man 8 chronyd
。
7 法律声明 #
版权所有 © 2006–2025 SUSE LLC 和贡献者。保留所有权利。
根据 GNU 自由文档许可证 (GNU Free Documentation License) 版本 1.2 或(根据您的选择)版本 1.3 中的条款,在此授予您复制、分发和/或修改本文档的权限;本版权声明和许可证附带不可变部分。许可版本 1.2 的副本包含在题为“GNU Free Documentation License”的部分。
有关 SUSE 商标,请参见 https://www.suse.com/company/legal/。所有其他第三方商标分别为相应所有者的财产。商标符号(®、™ 等)代表 SUSE 及其关联公司的商标。星号 (*) 代表第三方商标。
本指南力求涵盖所有细节,但这不能确保本指南准确无误。SUSE LLC 及其关联公司、作者和译者对于可能出现的错误或由此造成的后果皆不承担责任。