Red Hat Training

A Red Hat training course is available for RHEL 8

第 15 章 配置时间同步

在 IT 环境中保持准确的时间非常重要。所有跨网络设备的一致的时间提高了日志文件的可追溯性,以及某些依赖同步时钟的协议。例如,Kerberos 使用时间戳来防止重播攻击。

15.1. 使用 Chrony 套件配置 NTP

准确的计时在 IT 中很重要,原因有多个。例如在网络中,需要准确的数据包和日志的时间戳。在 Linux 系统中,NTP 协议是由在用户空间运行的守护进程实现的。

用户空间守护进程更新内核中运行的系统时钟。系统时钟可以通过使用不同的时钟源来维护系统的时间。通常, 使用 时间戳计数器TSC)。TSC 是一个 CPU 寄存器,它计算从上次重置的循环数。它非常快,分辨率很高,且不会被中断。

从 Red Hat Enterprise Linux 8 开始,NTP 协议由 chronyd 守护进程实现,它可从 chrony 软件包中的存储库中获得。

以下章节描述了如何使用 chrony 套件来配置 NTP。

15.1.1. chrony 套件介绍

chrony网络时间协议(NTP) 的一种实现。您可以使用 chrony:

  • 将系统时钟与 NTP 服务器同步
  • 将系统时钟与参考时钟同步,如 GPS 接收器
  • 将系统时钟与手动时间输入同步
  • 作为 NTPv4(RFC 5905) 服务器或对等服务器,为网络中的其他计算机提供时间服务

在多数条件下,chrony 都会表现良好,包括时断时续的网络连接、有大量网络数据的网络、温度不稳定(普通计算机时钟对温度敏感)以及不持续运行或在虚拟机上运行的系统。

通过互联网镜像同步的两天机器之间的准确性通常在几毫秒之内,而对于 LAN 中的机器则为几十微秒。硬件时间戳或硬件参考时钟可以将两台计算机之间的准确性提高到子微秒级。

chrony 包括 chronyd(一个在用户空间运行的守护进程)和 chronyc(可用来监控 chronyd 性能并在运行时更改各种操作参数的命令行程序)。

chrony 守护进程(chronyd) 可以由命令行工具 chronyc 监控和控制。这个工具提供了一个命令提示,允许输入大量命令来查询 chronyd 的当前状态并修改其配置。在默认情况下,chronyd 只接受来自本地 chronyc 实例的命令,但它也可以被配置为接受来自远程主机的监控命令。应该限制远程访问。

15.1.2. 使用 chronyc 来控制 chronyd

您可以使用 chronyc 命令行工具控制 chronyd

流程

  1. 要在互动模式中使用命令行工具 chronyc 来更改本地 chronyd 实例,以用户身份输入以下命令:

    # chronyc

    如果要使用某些受限命令,chronyc 需要以 root 运行。

    chronyc 命令提示符如下所示:

    chronyc>
  2. 要列出所有的命令,请输入 help
  3. 或者,如果与以下命令一同调用,该工具也可以在非交互命令模式下调用:

    chronyc command
注意

使用 chronyc 所做的更改不具有持久性,它们会在 chronyd 重启后丢失。要使更改有持久性,修改 /etc/chrony.conf

15.1.3. 迁移到 chrony

在 Red Hat Enterprise Linux 7 中,用户可以在 ntpchrony 之间进行选择,以确保准确计时。有关 ntpchronyntpdchronyd 之间的区别,请参阅 ntpd 和 chronyd 之间的差别

从 Red Hat Enterprise Linux 8 开始,不再支持 ntpchrony 默认启用。因此,您可能需要从 ntp 迁移到 chrony

在大多数情况下,从 ntp 迁移到 chrony 是非常直接的。程序、配置文件和服务的相应名称为:

表 15.1. 从 ntp 迁移到 chrony 时的程序、配置文件和服务对应的名称

ntp 名称chrony 名称

/etc/ntp.conf

/etc/chrony.conf

/etc/ntp/keys

/etc/chrony.keys

ntpd

chronyd

ntpq

chronyc

ntpd.service

chronyd.service

ntp-wait.service

chrony-wait.service

通过使用 -q 选项或 -t 选项,chronyd 可以替代 ntpdatesntp 程序(包含在 ntp 发布中)。可在命令行中指定配置以避免读取 /etc/chrony.conf。例如:如下所示运行 chronyd 可以替代运行 ntpdate ntp.example.com

# chronyd -q 'server ntp.example.com iburst'
2018-05-18T12:37:43Z chronyd version 3.3 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +SECHASH +IPV6 +DEBUG)
2018-05-18T12:37:43Z Initial frequency -2.630 ppm
2018-05-18T12:37:48Z System clock wrong by 0.003159 seconds (step)
2018-05-18T12:37:48Z chronyd exiting

ntpstat 工具程序之前包含在 ntp 软件包中,且只支持 ntpd。现在它支持 ntpdchronyd。它现在包括在 ntpstat 软件包中。

15.1.3.1. 迁移脚本

名为 ntp2chrony.py 的 Python 脚本包含在 chrony 软件包文档中(/usr/share/doc/chrony)。这个脚本会自动将现有的 ntp 配置转换为 chrony。它支持 ntp.conf 文件中最常用的指令和选项。所有在转换中忽略的行都会作为注释包含在生成的 chrony.conf 文件中以便用户进行核查。在 ntp 密钥文件中指定但未在 ntp.conf 中被标记为可信密钥的密钥会作为注释出现在生成的 chrony.keys 文件中。

默认情况下,该脚本不会覆盖任何文件。如果 /etc/chrony.conf/etc/chrony.keys 已经存在,使用 -b 选项可以重新命名文件以作为备份。这个脚本支持其他选项。--help 选项输出所有支持选项。

ntp 软件包中提供了一个默认 ntp.conf 调用脚本示例:

# python3 /usr/share/doc/chrony/ntp2chrony.py -b -v
Reading /etc/ntp.conf
Reading /etc/ntp/crypto/pw
Reading /etc/ntp/keys
Writing /etc/chrony.conf
Writing /etc/chrony.keys

本例中唯一忽略的指令是 disable monitor,它在 noclientlog 指令中有一个等同的 chrony 项。它包括在默认 ntp.conf 中只是用于缓解一个安全工具。

生成的 chrony.conf 文件通常包含大量与 ntp.conf 中限制行对应的 allow 指令。如果您不想使用 chronyd 作为 NTP 服务器,从 chrony.conf 中删除所有 allow 指令。