“有人真的知道现在几点吗?有人真的在乎吗?”
– 芝加哥乐队,1969 年
也许那个摇滚乐队不在乎几点,但我们的计算机确实需要知道确切的时间。计时对于计算机网络非常重要。在银行、股票市场和其他金融业务中,交易必须按正确的顺序维护,而准确的时间顺序对此至关重要。对于系统管理员和 DevOps 专业人员来说,当相关计算机上保持准确的时间时,更容易追踪一系列服务器中的电子邮件轨迹,或者使用地理上分散的主机上的日志文件确定事件的确切顺序。
我曾经在一个每天接收超过 2000 万封电子邮件的组织工作,并有四台服务器专门用于接收和对涌入的电子邮件进行基本过滤。从那里,电子邮件被发送到其他四台服务器之一,以执行更复杂的反垃圾邮件评估,然后它们被传递到另外几台服务器之一,这些服务器将电子邮件放入正确的收件箱中。在每一层,电子邮件都会被发送到下一级服务器之一,仅通过轮询 DNS 的随机性来选择。有时我们不得不追踪一条新消息通过系统,直到我们可以根据“尖头老板”的说法确定它“丢失”在哪里。我们不得不非常频繁地这样做。
大多数电子邮件最终都变成了垃圾邮件。有些人实际上抱怨说他们[笑话、猫照片、食谱、励志名言或其他奇怪的每日电子邮件]不见了,并要求我们找到它。我们拒绝了这些机会。
我们的电子邮件和其他事务性搜索得益于带有时间戳的日志条目,这些时间戳——今天——即使在最慢的现代 Linux 计算机中也可以解析到纳秒级。在非常高容量的事务环境中,即使系统时钟相差几微秒也可能意味着对数千个事务进行排序以找到正确的事务。
NTP 服务器层次结构
世界各地的计算机都使用网络时间协议 (NTP) 通过 NTP 服务器的层次结构将其时间与互联网标准参考时钟同步。主服务器位于 stratum 1,它们通过卫星、无线电甚至电话线上的调制解调器直接连接到 stratum 0 的各种国家时间服务。stratum 0 的时间服务可以是原子钟、调谐到原子钟广播信号的无线电接收器,或使用 GPS 卫星广播的高度精确的时钟信号的 GPS 接收器。
为了防止来自层次结构中较低的时间服务器(即具有较高 stratum 编号)的时间请求压垮主参考服务器,有数千个公共 NTP stratum 2 服务器是开放的,任何人都可以使用。许多拥有大量需要 NTP 服务器的主机的组织将建立自己的时间服务器,以便只有一个本地主机访问 stratum 2 时间服务器,然后他们配置其余网络主机使用本地时间服务器,在我的例子中,这是一个 stratum 3 服务器。
NTP 选择
原始的 NTP 守护程序 ntpd 已经加入了一个较新的守护程序 chronyd。两者都使本地主机的时间与时间服务器同步。这两种服务都可用,而且我没有看到任何迹象表明这种情况很快会改变。
Chrony 具有使其成为大多数环境更好选择的功能,原因如下:
-
Chrony 可以比 NTP 更快地同步到时间服务器。这对于不经常运行的笔记本电脑或台式机来说非常有用。
-
它可以补偿时钟频率的波动,例如当主机休眠或进入睡眠模式时,或者当负载较低时时钟速度因频率步进而变化时。
-
它可以处理间歇性网络连接和带宽饱和。
-
它可以调整网络延迟和延迟。
-
在初始时间同步之后,Chrony 永远不会步进时钟。这确保了系统服务和应用程序的稳定且一致的时间间隔。
-
即使没有网络连接,Chrony 也可以工作。在这种情况下,可以手动更新本地主机或服务器。
NTP 和 Chrony RPM 软件包可从标准 Fedora 存储库获得。您可以同时安装两者并在它们之间切换,但现代 Fedora、CentOS 和 RHEL 版本已从 NTP 转向 Chrony 作为其默认计时实现。我发现 Chrony 运行良好,为系统管理员提供了更好的界面,提供了更多信息,并增加了控制。
为了明确起见,NTP 是一种协议,可以使用 NTP 或 Chrony 来实现。如果您想了解更多信息,请阅读此 NTP 和 Chrony 作为 NTP 协议实现的比较。
本文解释了如何在 Fedora 主机上配置 Chrony 客户端和服务器,但 CentOS 和 RHEL 当前版本的配置方式相同。
Chrony 结构
Chrony 守护程序 chronyd 在后台运行,并监视 chrony.conf 文件中指定的时间服务器的时间和状态。如果需要调整本地时间,chronyd 会平稳地进行调整,而不会像时钟立即重置为新时间时那样发生程序性创伤。
Chrony 的 chronyc 工具允许某人监视 Chrony 的当前状态并在必要时进行更改。chronyc 实用程序可以用作接受子命令的命令,也可以用作交互式文本模式程序。本文将解释这两种用法。
客户端配置
NTP 客户端配置很简单,几乎不需要或根本不需要干预。NTP 服务器可以在 Linux 安装期间定义,也可以由 DHCP 服务器在启动时提供。默认的 /etc/chrony.conf 文件(完整显示如下)无需干预即可作为客户端正常工作。对于 Fedora,Chrony 使用 Fedora NTP 池,而 CentOS 和 RHEL 有自己的 NTP 服务器池。与许多基于 Red Hat 的发行版一样,配置文件也得到了很好的注释。
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool 2.fedora.pool.ntp.org iburst
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3
# Enable kernel synchronization of the real-time clock (RTC).
# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *
# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2
# Allow NTP client access from local network.
#allow 192.168.0.0/16
# Serve time even if not synchronized to a time source.
#local stratum 10
# Specify file containing keys for NTP authentication.
keyfile /etc/chrony.keys
# Get TAI-UTC offset and leap seconds from the system tz database.
leapsectz right/UTC
# Specify directory for log files.
logdir /var/log/chrony
# Select which information is logged.
#log measurements statistics tracking
让我们看一下我在测试中使用的虚拟机上 NTP 的当前状态。当 chronyc 命令与 tracking 子命令一起使用时,会提供统计信息,报告本地系统与参考服务器的偏差程度。
[root@studentvm1 ~]# chronyc tracking
Reference ID : 23ABED4D (ec2-35-171-237-77.compute-1.amazonaws.com)
Stratum : 3
Ref time (UTC) : Fri Nov 16 16:21:30 2018
System time : 0.000645622 seconds slow of NTP time
Last offset : -0.000308577 seconds
RMS offset : 0.000786140 seconds
Frequency : 0.147 ppm slow
Residual freq : -0.073 ppm
Skew : 0.062 ppm
Root delay : 0.041452706 seconds
Root dispersion : 0.022665167 seconds
Update interval : 1044.2 seconds
Leap status : Normal
[root@studentvm1 ~]#
结果第一行的参考 ID 是主机同步到的服务器——在本例中,是一个 stratum 3 参考服务器,主机上次联系它的时间是 2018 年 16:21:30。其他行在 chronyc(1) 手册页中进行了描述。
sources 子命令也很有用,因为它提供了有关 chrony.conf 中配置的时间源的信息。
[root@studentvm1 ~]# chronyc sources
210 Number of sources = 5
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^+ 192.168.0.51 3 6 377 0 -2613us[-2613us] +/- 63ms
^+ dev.smatwebdesign.com 3 10 377 28m -2961us[-3534us] +/- 113ms
^+ propjet.latt.net 2 10 377 465 -1097us[-1085us] +/- 77ms
^* ec2-35-171-237-77.comput> 2 10 377 83 +2388us[+2395us] +/- 95ms
^+ PBX.cytranet.net 3 10 377 507 -1602us[-1589us] +/- 96ms
[root@studentvm1 ~]#
列表中的第一个来源是我为我的个人网络设置的时间服务器。其他的由池提供。即使我的 NTP 服务器没有出现在上面的 Chrony 配置文件中,我的 DHCP 服务器也会为其 NTP 服务器提供 IP 地址。“S”列——源状态——用星号 (*) 表示我们的主机同步到的服务器。这与来自 tracking 子命令的数据一致。
-v 选项提供了此输出中字段的详细描述。
[root@studentvm1 ~]# chronyc sources -v
210 Number of sources = 5
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^+ 192.168.0.51 3 7 377 28 -2156us[-2156us] +/- 63ms
^+ triton.ellipse.net 2 10 377 24 +5716us[+5716us] +/- 62ms
^+ lithium.constant.com 2 10 377 351 -820us[ -820us] +/- 64ms
^* t2.time.bf1.yahoo.com 2 10 377 453 -992us[ -965us] +/- 46ms
^- ntp.idealab.com 2 10 377 799 +3653us[+3674us] +/- 87ms
[root@studentvm1 ~]#
如果我希望我的服务器成为此主机的首选参考时间源,我将在 /etc/chrony.conf 文件中添加以下行。
server 192.168.0.51 iburst prefer
我通常将此行放在文件顶部的第一个池服务器语句的上方。除了我喜欢将服务器语句放在一起之外,没有其他特殊原因。它在文件底部也能正常工作,而且我在多台主机上都这样做过。此配置文件对顺序不敏感。
prefer 选项将其标记为首选参考源。因此,只要此参考源可用,此主机将始终与此参考源同步。我们还可以对远程参考服务器使用完全限定的主机名,或者对本地参考时间源仅使用主机名(不带域名),只要在 /etc/resolv.conf 文件中设置了搜索语句即可。我更喜欢 IP 地址,以确保即使 DNS 无法工作,也可以访问时间源。在大多数环境中,服务器名称可能是更好的选择,因为即使服务器的 IP 地址发生更改,NTP 仍将继续工作。
如果您没有要同步到的特定参考源,则可以使用默认值。
使用 Chrony 配置 NTP 服务器
Chrony 配置文件的好处在于,这单个文件将主机配置为客户端和服务器。要向我们的主机添加服务器功能——它将始终是客户端,从参考服务器获取其时间——我们只需要对 Chrony 配置进行一些更改,然后配置主机的防火墙以接受 NTP 请求。
在您喜欢的文本编辑器中打开 /etc/chrony.conf 文件,并取消注释 local stratum 10 行。这使 Chrony NTP 服务器在互联网连接失败时继续表现得好像它已连接到远程参考服务器;这使主机能够继续充当本地网络上其他主机的 NTP 服务器。
让我们重新启动 chronyd 并跟踪该服务运行几分钟的情况。在我们启用主机作为 NTP 服务器之前,我们想先测试一下。
[root@studentvm1 ~]# systemctl restart chronyd ; watch chronyc tracking
结果应如下所示。watch 命令每两秒运行一次 chronyc tracking 命令,以便我们可以观察随着时间推移发生的变化。
Every 2.0s: chronyc tracking studentvm1: Fri Nov 16 20:59:31 2018
Reference ID : C0A80033 (192.168.0.51)
Stratum : 4
Ref time (UTC) : Sat Nov 17 01:58:51 2018
System time : 0.001598277 seconds fast of NTP time
Last offset : +0.001791533 seconds
RMS offset : 0.001791533 seconds
Frequency : 0.546 ppm slow
Residual freq : -0.175 ppm
Skew : 0.168 ppm
Root delay : 0.094823152 seconds
Root dispersion : 0.021242738 seconds
Update interval : 65.0 seconds
Leap status : Normal
请注意,我的 NTP 服务器 studentvm1 主机同步到 192.168.0.51 的主机,这是我的内部网络 NTP 服务器,位于 stratum 4。直接同步到 Fedora 池机器将导致在 stratum 3 进行同步。另请注意,错误量会随着时间推移而减少。最终,它应该稳定下来,在相当小的误差范围内出现微小的变化。误差的大小取决于 stratum 和其他网络因素。几分钟后,使用 Ctrl+C 退出 watch 循环。
要将我们的主机变成 NTP 服务器,我们需要允许它在本地网络上侦听。取消注释以下行以允许本地网络上的主机访问我们的 NTP 服务器。
# Allow NTP client access from local network.
allow 192.168.0.0/16
请注意,服务器可以侦听它连接到的任何本地网络上的请求。“allow”行中的 IP 地址仅用于说明目的。请务必更改该行中的 IP 网络和子网掩码以匹配您的本地网络。
重新启动 chronyd。
[root@studentvm1 ~]# systemctl restart chronyd
要允许网络上的其他主机访问此服务器,请配置防火墙以允许端口 123 上的入站 UDP 数据包。请查看防火墙的文档以了解如何执行此操作。
测试
您的主机现在是 NTP 服务器。您可以使用另一个主机或可以访问 NTP 服务器正在侦听的网络的 VM 对其进行测试。配置客户端以在 /etc/chrony.conf 文件中使用新的 NTP 服务器作为首选服务器,然后使用我们上面使用的 chronyc 工具监视该客户端。
Chronyc 作为交互式工具
正如我之前提到的,chronyc 可以用作交互式命令工具。只需在不带子命令的情况下运行该命令,您就会得到一个 chronyc 命令提示符。
[root@studentvm1 ~]# chronyc
chrony version 3.4
Copyright (C) 1997-2003, 2007, 2009-2018 Richard P. Curnow and others
chrony comes with ABSOLUTELY NO WARRANTY. This is free software, and
you are welcome to redistribute it under certain conditions. See the
GNU General Public License version 2 for details.
chronyc>
您可以在此提示符下仅输入子命令。尝试使用 tracking、ntpdata 和 sources 命令。chronyc 命令行允许命令调用和编辑 chronyc 子命令。您可以使用 help 子命令获取可能的命令及其语法的列表。
结论
Chrony 是一个强大的工具,用于同步客户端主机的时间,无论它们是在本地网络上还是分散在全球各地。它易于配置,因为尽管有大量可用选项,但在大多数情况下只需要少量配置。
在我的客户端计算机与 NTP 服务器同步后,我喜欢使用以下命令从系统 (OS) 时间设置系统硬件时钟:
/sbin/hwclock --systohc
可以将此命令作为 cron 作业或 cron.daily 中的脚本添加,以使硬件时钟与系统时间同步。
Chrony 和 NTP(服务)都使用相同的配置,并且文件的内容可以互换。chronyd、chronyc 和 chrony.conf 的手册页包含大量信息,可以帮助您入门或了解深奥的配置选项。
您是否运行自己的 NTP 服务器?请在评论中告诉我们,并务必告诉我们您正在使用哪种实现:NTP 或 Chrony。
1 条评论