39 使用 NTP 同步时间 #
NTP(网络时间协议)机制是用于同步网络上的系统时间的协议。首先,计算机从作为可靠时间源的服务器获得时间。然后将此计算机用作网络中其他计算机的时间源。这样做有双重目的,既可维护绝对时间,又可保持网络中所有计算机系统时间的同步。
维护确切的系统时间在许多情况下都非常重要。内置硬件时钟往往不能满足数据库或群集这样的应用程序的要求。手动更正系统时间可能会导致许多严重问题,例如向后调整时间将使关键应用程序出现故障。在网络中,通常需要同步所有计算机上的系统时间,但是手动调整时间是一种不好的方法。NTP 提供了解决这些问题的机制。NTP 服务通过网络中的可靠时间服务器持续调整系统时间。它还支持对本地参考时钟(如无线电控制的时钟)进行管理。
自 SUSE Linux Enterprise Desktop 15 起,采用 chrony
作为 NTP 的默认实施。chrony
包含两个部分:chronyd
守护程序可在系统引导时启动,chronyc
命令行界面程序用于监控 chronyd
的性能,以及在运行时更改操作参数。
从 SUSE Linux Enterprise Desktop 15.2 开始,如果不是配置为以守护程序的形式运行,适用于 NTP 客户端配置的 YaST 模块将配置 systemd-timer 而不是 cron 守护程序来执行 chrony
。
要通过 Active Directory 启用时间同步,请按照过程 7.2 “使用 中的说明操作。 加入 Active Directory 域”
39.1 使用 YaST 配置 NTP 客户端 #
chrony
软件包中附带的 NTP 守护程序 (chronyd
) 预先设置为使用本地计算机硬件时钟作为时间参考。硬件时钟的精确度极大程度上取决于它的时间源。例如,原子时钟或 GPS 接收器是精确的时间源,而通用 RTC 芯片则不是可靠的时间源。YaST 简化了 NTP 客户端的配置。
在 YaST NTP 客户端配置(
› )窗口中,您可以指定启动 NTP 守护程序的时间、配置源的类型,以及添加自定义的时间服务器。39.1.1 NTP 守护程序启动 #
您可以从下面三个选项中选择启动 NTP 守护程序的时间:
选择
可手动启动chrony
守护程序。选择
可定期设置系统时间,而不用永久运行chrony
。您可以设置 。选择
可在系统引导时自动启动chronyd
。建议使用此设置。
39.1.2 配置源的类型 #
在
下拉框中,选择 或 。如果服务器只使用固定的一组(公共)NTP 服务器,请设置 ;如果您的内部网络通过 DHCP 提供 NTP 服务器,则使用 更合适。39.1.3 配置时间服务器 #
供客户端查询的时间服务器列在
窗口的下半部分。使用 、 和 可按需修改此列表。单击
可添加新的时间服务器:在
字段中,键入要与计算机时间同步的时间服务器或时间服务器池的 URL。填写好 URL 后,单击 以校验该 URL 是否指向有效的时间源。激活
,以便在chronyd
守护程序启动时通过发送更多请求来加速时间同步。激活
,以使会自动启动chronyd
守护程序且引导时可能未连接到互联网的系统加快引导速度。例如,对于由 NetworkManager 管理网络连接的笔记本电脑,此选项非常实用。单击
进行确认。
39.2 手动配置网络中的 NTP #
chrony
从 /etc/chrony.conf
文件读取其配置。要让计算机时钟保持同步,您需要告诉 chrony
使用什么时间服务器。您可以使用特定的服务器名称或 IP 地址,例如:
0.suse.pool.ntp.org 1.suse.pool.ntp.org 2.suse.pool.ntp.org 3.suse.pool.ntp.org
还可以指定池名称。池名称会解析为若干个 IP 地址:
pool pool.ntp.org
要同步同一网络中多台计算机的时间,建议不要通过一台外部服务器来同步所有这些计算机。比较好的做法是将其中一台计算机作为时间服务器(它与外部时间服务器同步),其他计算机作为它的客户端。将 local
指令添加至服务器的 /etc/chrony.conf
,以将其与权威时间服务器区分开:
local stratum 10
要启动 chrony
,请运行:
systemctl start chronyd.service
初始化 chronyd
后,系统需要花费一些时间来稳定时间,以及创建用于纠正本地计算机时钟的偏移文件。利用偏移文件,当计算机启动时,可以计算出硬件时钟的系统误差。可以立即使用更正功能,使系统时间保持较高的稳定性。
要启用 chrony
以便该服务在引导时自动启动,请运行:
systemctl enable chronyd.service
yast-timesync.service
服务
除了 chronyd.service
服务外,SLED 中还包含 yast-timesync.service
。计时器每 5 分钟会触发一次 yast-timesync.service
,该服务即会运行 chronyd
(使用 -q
选项)来设置系统时间,之后会退出。由于同一时间只能运行 chronyd
的一个实例,因此请勿同时启用或启动两个 chronyd
相关的服务。
39.3 在运行时使用 chronyc
配置 chronyd
#
在运行时,您可以使用 chronyc
来更改 chronyd
的行为。它会生成有关 chronyd
的操作的状态报告。
您可以采用交互模式或非交互模式运行 chronyc
。要以交互模式运行 chronyc
,请在命令行上输入 chronyc
。如此会显示提示符并等待您输入命令。例如,要检查有多少个 NTP 源联机或脱机,请运行:
#
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
使用 chronyc
进行的更改不是永久性的。当 chronyd
下次重启动时,它们将会丢失。要进行永久更改,请修改 /etc/chrony.conf
。
有关 chronyc
命令的完整列表,请参见其手册页 (man
1 chronyc
)。
39.4 运行时的动态时间同步 #
尽管 chronyd
通常在引导时没有网络连接的系统上启动,但该工具无法解析配置文件中指定的时间服务器的 DNS 名称。
chronyd
会按递增的时间间隔不断尝试解析由 server
、pool
和 peer
指令指定的时间服务器名称,直到成功为止。
如果启动 chronyd
时将无法访问时间服务器,您可以指定 offline
选项:
server server_address offline
如此,chronyd
将不会尝试轮询服务器,除非使用以下命令启用它:
#
chronyc online server_address
如果设置了 auto_offline
选项,在向时间服务器发送了两个请求,但未接收到任何响应时,chronyd
会假设时间服务器已脱机。如果使用此选项,在网络链接断开时,无需从 chronyc
运行 offline
命令。
39.5 设置本地参考时钟 #
软件包 chrony
依赖于其他程序(例如 gpsd
)来通过 SHM 或 SOCK 驱动程序访问计时数据。在 /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
。
39.6 与外部时间参考 (ETR) 的时钟同步 #
支持与外部时间参考 (ETR) 时钟同步。外部时间参照每 2**20(2 的 20 次幂)微秒发出一次振荡器信号和同步信号,以将连接的所有服务器的 TOD 时钟保持同步。
两个 ETR 计算机可以连接到一台计算机。如果时钟偏差超过同步检查容差,将会对所有 CPU 执行一次计算机检查,这表示时钟未同步。如果发生这种情况,在该时钟再次同步前,所有与支持 XRC 的设备进行的 DASD I/O 都将停止。
可通过两个 sysfs
属性激活 ETR 支持;请以 root
身份运行以下命令:
echo 1 > /sys/devices/system/etr/etr0/online echo 1 > /sys/devices/system/etr/etr1/online