documentation.suse.com / SUSE Linux Enterprise Desktop 文档 / 管理指南 / 服务 / 使用 NTP 同步时间
适用范围 SUSE Linux Enterprise Desktop 15 SP7

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 启用时间同步,请按照Procedure 7.2, “Joining an Active Directory domain using Windows domain membership中的说明操作。

39.1 使用 YaST 配置 NTP 客户端

chrony 软件包中附带的 NTP 守护程序 (chronyd) 预先设置为使用本地计算机硬件时钟作为时间参考。硬件时钟的精确度极大程度上取决于它的时间源。例如,原子时钟或 GPS 接收器是精确的时间源,而通用 RTC 芯片则不是可靠的时间源。YaST 简化了 NTP 客户端的配置。

在 YaST NTP 客户端配置(网络服务 › NTP 配置)窗口中,您可以指定启动 NTP 守护程序的时间、配置源的类型,以及添加自定义的时间服务器。

NTP 配置窗口
图 39.1︰ NTP 配置窗口

39.1.1 NTP 守护程序启动

您可以从下面三个选项中选择启动 NTP 守护程序的时间:

仅手动

选择仅手动可手动启动 chrony 守护程序。

不用守护程序同步

选择不用守护进程同步可定期设置系统时间,而无需永久运行 chrony。您可以设置同步间隔(以分钟计)

立即和在引导时

选择立即和在引导时可在系统引导时自动启动chronyd。建议使用此设置。

39.1.2 配置源的类型

配置源下拉框中,选择动态静态。如果服务器只使用固定的一组(公共)NTP 服务器,请设置静态;如果您的内部网络通过 DHCP 提供 NTP 服务器,则使用动态更合适。

39.1.3 配置时间服务器

供客户端查询的时间服务器列在 NTP 配置窗口的下半部分。根据需要使用添加编辑删除修改此列表。

单击添加可添加新的时间服务器:

添加时间服务器
图 39.2︰ 添加时间服务器
  1. 地址字段中,键入要与计算机时间同步的时间服务器或时间服务器池的 URL。填写好 URL 后,单击测试以校验该 URL 是否指向有效的时间源。

  2. 激活快速初始同步,以便在 chronyd 守护程序启动时通过发送更多请求来加速时间同步。

  3. 激活离线启动,使自动启动 chronyd 守护程序且引导时可能未连接到互联网的系统加快引导速度。例如,对于由 NetworkManager 管理网络连接的笔记本电脑,此选项非常实用。

  4. 单击确定进行确认。

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 配置 NTS

网络时间协议 (NTP) 是一种协议,用于同步网络中一台或多台主机的系统时间并保持其准确性。本文介绍如何使用网络时间安全 (NTS) 保护 NTP。

NTP 协议不引入任何安全机制来对时间服务器和客户端之间的通信进行身份验证和加密。网络时间安全 (NTS) 是一种提高 NTP 安全性的扩展。chrony 支持 NTS,可以验证时间源并防御某些网络攻击。

以下过程概述了如何配置时间服务器和客户端计算机,以实现安全的时间同步。

过程 39.1︰ 配置 NTS 时间服务器
  1. (可选) 建议将时间服务器配置为通过 NTS 更新时间。这样可以确保从同步链的一开始就实现安全的时间同步。注释掉 /etc/chrony.conf 中所有不支持 NTS 的现有时间源,并添加至少一个支持 NTS 的时间源,例如:

    server time.cloudflare.com iburst nts
    提示
    提示

    nts 选项会请求 NTS 连接(如果可用),如果 NTS 不可用,则会回退到 NTP。

  2. 重启 chronyd 服务。

    > sudo systemctl restart chronyd.srvice
  3. 校验配置的时间源。

    > chronyc sources -v
    MS Name/IP address      Stratum Poll Reach LastRx Last sample               
    ============================================================================
    ^? time.cloudflare.com        3   6     1     2   -947ms[ -947ms] +/-   12ms
    ^? pyrrha.fi.muni.cz          2   6     1     1   -948ms[ -948ms] +/-   39ms
    ^* whitesoft-intex16.c.cbsn>  1   6     1     2   -948ms[ -948ms] +/- 5444us
    ^? mail.combatostrich.dev     2   6     1     1   -948ms[ -948ms] +/-   28ms
    注意
    注意

    ^* 开头的行包括被选为最佳选择的时间源。

    校验配置的时间源是否使用 NTS 模式。

    > chronyc -N authdata
    Name/IP address             Mode KeyID Type KLen Last Atmp  NAK Cook CLen
    =========================================================================
    [...]
    time.cloudflare.com          NTS     1   15  256    3    0    0    8   96
  4. 校验服务器配置是否包含指定哪些客户端可以与时间服务器同步时间的 allow 选项,例如:

    allow 192.168.1.0/24
  5. (可选) 如果时间服务器在防火墙之后运行,则允许 NTP 和 NTS 所用端口的通信。默认端口为 123 和 4460。

  6. 获取 TLS 证书和相应的私用密钥并将其复制到 /var/lib/chrony/。校验 chrony 是否可读取它们,例如:

    > sudo install -m 0440 -o chrony -g chrony nts.key /var/lib/chrony/
    > sudo install -m 0440 -o chrony -g chrony nts.crt /var/lib/chrony/
    提示
    提示

    有关 TLS 证书的详细信息,可参见专门的文章

  7. 编辑 /etc/chrony.conf 并验证该 ntsdumpdir /var/lib/chrony 选项是否处于活动状态。然后添加 TLS 密钥和证书的路径。

    ntsdumpdir /var/lib/chrony
    ntsserverkey /var/lib/chrony/nts.key
    ntsservercert /var/lib/chrony/nts.crt
  8. 重启 chronyd 服务。

    > sudo systemctl restart chronyd.service
过程 39.2︰ 配置 NTS 客户端
  1. 禁用现有的 NTP 源,例如:

    #server 192.168.1.1 iburst

    源配置包含在 /etc/chrony.conf 中或 /etc/chrony.d/ 下的文件中。

  2. 客户端主机需要信任签署 TLS 证书的根 CA。有关如何管理 CA 证书存储区的详细信息,可参见专门的文章

  3. 将您在过程 39.1 “配置 NTS 时间服务器”中配置的 NTS 时间服务器源添加到 /etc/chrony.conf 的客户端 chrony 配置中,例如:

    server nts1.example.com iburst nts
  4. 重启 chronyd 服务。

    > sudo systemctl restart chronyd.service
  5. 校验客户端上配置的时间源并确认连接已通过身份验证。

    > sudo chronyc sources -v
    > sudo chronyc -N authdata
  6. 在 NTS 时间服务器上,校验每个客户端有关 NTS 连接的统计信息。

    > sudo chronyc -N clients -k

39.4 在运行时使用 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 的提示符,请输入 quitexit

如果您不需要使用交互提示符,请直接输入命令:

# chronyc activity
注意
注意:临时更改

使用 chronyc 进行的更改不是永久性的。当 chronyd 下次重启动时,它们将会丢失。要进行永久更改,请修改 /etc/chrony.conf

有关 chronyc 命令的完整列表,请参见其手册页 (man 1 chronyc)。

39.5 运行时的动态时间同步

尽管 chronyd 通常在引导时没有网络连接的系统上启动,但该工具无法解析配置文件中指定的时间服务器的 DNS 名称。

chronyd 会按递增的时间间隔不断尝试解析由 serverpoolpeer 指令指定的时间服务器名称,直到成功为止。

如果启动 chronyd 时将无法访问时间服务器,您可以指定 offline 选项:

server server_address offline

chronyd 不会尝试轮询服务器,除非使用以下命令启用这种轮询:

# chronyc online server_address

如果设置了 auto_offline 选项,在向时间服务器发送了两个请求,但未接收到任何响应时,chronyd 会假设时间服务器已脱机。如果使用此选项,在网络链接断开时,无需从 chronyc 运行 offline 命令。

39.6 设置本地参考时钟

软件包 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.7 与外部时间参考 (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
Documentation survey