Linux 时间同步:NTP、Chrony 和 systemd-timesyncd

Linux 时间同步:NTP、Chrony 和 systemd-timesyncd
大多数人都会记录时间。 我们准时起床以完成早上的仪式并上班、午休、按时完成项目、庆祝生日和假期、登机等等。

此外:我们中的一些人对时间很着迷。 我的手表由太阳能供电,并从美国国家标准技术研究院(NIST) 通过长波无线电到科罗拉多州柯林斯堡 WWVB. 时间信号与同样位于柯林斯堡的原子钟同步。 我的 Fitbit 正在与我的手机同步,而我的手机正在与服务器同步 NTP,最终与原子钟同步。

设备也会记录时间

我们的设备和计算机需要准确时间的原因有很多。 例如,在银行、股票市场和其他金融业务中,交易必须按正确的顺序进行,而准确的时间顺序对此至关重要。

我们的手机、平板电脑、汽车、GPS 系统和计算机都需要准确的时间和日期设置。 我希望计算机桌面上的时钟显示正确的时间。 我希望提醒在正确的时间出现在我的本地日历上。 正确的时间还可以确保 cron 和 systemd 作业在正确的时间运行。

日期和时间对于日志记录也很重要,因此根据日期和时间查找某些日志会更容易一些。 例如,我曾经在 DevOps 工作(当时还不叫 DevOps),正在北卡罗来纳州建立一个电子邮件系统。 我们过去每天处理超过 20 万封电子邮件。 通过一系列服务器跟踪电子邮件,或使用地理上分散的主机上的日志文件确定事件的确切顺序,如果各个计算机及时同步,就会容易得多。

一次 - 许多小时

Linux 主机必须考虑到系统时间和 RTC 时间。 RTC(实时时钟)是硬件时钟的一个有点奇怪且不太准确的名称。

即使计算机关闭,硬件时钟也会使用系统主板上的电池持续运行。 RTC 的主要功能是在与时间服务器的连接不可用时存储时间。 在无法通过 Internet 连接到时间服务器的时代,每台计算机都必须有一个准确的内部时钟。 操作系统必须在启动时访问 RTC,用户必须使用 BIOS 硬件配置界面手动设置系统时间以确保它是正确的。

硬件时钟不理解时区的概念; RTC 仅存储时间,不存储时区或与 UTC(协调世界时,也称为 GMT 或格林威治标准时间)的偏移量。 您可以使用我将在本文后面介绍的工具安装 RTC。

系统时间是操作系统在您桌面上的 GUI 时钟上显示的时间,在 date 命令的输出中,在日志的时间戳中。 这也适用于何时创建、修改和打开文件。

在页面上 人为rtc 有 RTC 和系统时钟的完整描述。

NTP 是怎么回事?

世界各地的计算机使用 NTP(网络时间协议)通过使用 NTP 服务器层次结构的 Internet 将它们的时间与标准参考时钟同步。 主要时间服务器位于第 1 层,它们通过卫星、无线电甚至电话线调制解调器直接连接到第 0 层的各种国家时间服务。 第 0 层时间服务可以是原子钟、调谐到原子钟传输的信号的无线电接收器,或者使用 GPS 卫星传输的高精度时钟信号的 GPS 接收器。

绝大多数参考服务器都有数千个向公众开放的公共 NTP stratum 2 服务器。 许多拥有大量需要 NTP 服务器的主机的组织和用户(包括我自己)选择设置自己的时间服务器,以便只有一台本地主机访问第 2 层或第 3 层。然后他们将网络上的其余节点配置为使用本地时间服务器。 对于我的家庭网络,这是一个第 3 层服务器。

NTP的各种实现

NTP最初的实现是ntpd。 然后加入了两个更新的,chronyd 和 systemd-timesyncd。 这三个都将本地主机时间与 NTP 时间服务器同步。 systemd-timesyncd 服务不如 chronyd 可靠,但对于大多数用途来说已经足够好了。 如果RTC不同步,当本地系统时间有轻微漂移时,可以逐步调整系统时间与NTP服务器同步。 systemd-timesync 服务不能用作时间服务器。

计时码表 是 NTP 的一个实现,它包含两个程序:chronyd 守护进程和一个名为 chronyc 的命令行界面。 Chrony 有一些在很多情况下不可或缺的特性:

  • Chrony 可以比旧的 ntpd 服务更快地与时间服务器同步。 这对于不能一直工作的笔记本电脑或台式机来说非常有用。
  • 它可以补偿时钟波动,例如当主机进入睡眠或进入睡眠模式时,或者当时钟由于跳频而发生变化时,这会在低负载时减慢时钟速度。
  • 它解决了与不稳定的网络连接或网络拥塞相关的时间问题。
  • 它调节网络延迟。
  • 初始时间同步后,Chrony 永远不会停止时钟。 这为许多系统服务和应用程序提供了稳定和一致的时隙。
  • 即使没有网络连接,Chrony 也可以工作。 在这种情况下,可以手动更新本地主机或服务器。
  • Chrony 可以充当 NTP 服务器。

再一次,NTP 是一种可以使用 Chrony 或 systemd-timesyncd 在 Linux 主机上实施的协议。

NTP、Chrony 和 systemd-timesyncd RPM 在标准 Fedora 存储库中可用。 systemd-udev RPM 是一个内核事件管理器,默认安装在 Fedora 上,但它是可选的。

您可以安装所有这三个并在它们之间切换,但这会造成额外的麻烦。 所以最好不要。 Fedora、CentOS 和 RHEL 的现代版本已将 Chrony 作为默认实现,它们也有 systemd-timesyncd。 我发现 Chrony 运行良好,提供了比 NTP 服务更好的界面,提供了更多的信息和控制,系统管理员肯定会喜欢。

禁用 NTP 服务

NTP 服务可能已经在您的主机上运行。 如果是这样,您需要在切换到其他东西之前将其禁用。 我让 chronyd 运行,所以我使用以下命令来停止和禁用它。 为您在主机上运行的任何 NTP 守护程序运行适当的命令:

[root@testvm1 ~]# systemctl disable chronyd ; systemctl stop chronyd
Removed /etc/systemd/system/multi-user.target.wants/chronyd.service.
[root@testvm1 ~]#

检查服务是否已停止和禁用:

[root@testvm1 ~]# systemctl status chronyd
● chronyd.service - NTP client/server
     Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:chronyd(8)
             man:chrony.conf(5)
[root@testvm1 ~]#

启动前状态检查

系统时钟同步状态可让您确定 NTP 服务是否正在运行。 由于您尚未启动 NTP,因此 timesync-status 命令将提示:

[root@testvm1 ~]# timedatectl timesync-status
Failed to query server: Could not activate remote peer.

直接状态请求提供重要信息。 例如,不带参数或选项的 timedatectl 命令默认执行 status 子命令:

[root@testvm1 ~]# timedatectl status
           Local time: Fri 2020-05-15 08:43:10 EDT  
           Universal time: Fri 2020-05-15 12:43:10 UTC  
                 RTC time: Fri 2020-05-15 08:43:08      
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: no                          
              NTP service: inactive                    
          RTC in local TZ: yes                    

Warning: The system is configured to read the RTC time in the local time zone.
         This mode cannot be fully supported. It will create various problems
         with time zone changes and daylight saving time adjustments. The RTC
         time is never updated, it relies on external facilities to maintain it.
         If at all possible, use RTC in UTC by calling
         'timedatectl set-local-rtc 0'.
[root@testvm1 ~]#

这将为您提供主机的本地时间、UTC 时间和 RTC 时间。 在这种情况下,系统时间设置为美国/纽约 (TZ) 时区,RTC 设置为本地时区时间,NTP 服务未激活。 RTC 时间开始与系统时间略有偏差。 这对于时钟未同步的系统来说是正常的。 主机上的偏移量取决于自系统上次同步以来经过的时间。

我们还收到了关于使用本地时间作为 RTC 的警告 - 这适用于时区更改和 DST 设置。 如果需要更改时关闭计算机,则 RTC 不会更改。 但对于全天候运行的服务器或其他主机来说,这根本不是问题。 另外,任何提供NTP时间同步的服务都会在初始启动阶段调整主机的时间,所以启动完成后时间又会正确。

设置时区

通常,您在安装过程中指定时区,以后无需更改时区。 但是,有时您需要更改时区。 有几种工具可以提供帮助。 Linux 使用时区文件来确定主机的本地时区。 这些文件在目录中 /usr/共享/区域信息. 默认情况下,对于我的时区,系统规定如下: /etc/localtime -> ../usr/share/zoneinfo/America/New_York. 但您无需了解这些细微之处即可更改时区。

最主要的是要知道您所在位置的官方时区名称和相应的命令。 假设您想将时区更改为洛杉矶:


[root@testvm2 ~]# timedatectl list-timezones | column
<SNIP>
America/La_Paz                  Europe/Budapest
America/Lima                    Europe/Chisinau
America/Los_Angeles             Europe/Copenhagen
America/Maceio                  Europe/Dublin
America/Managua                 Europe/Gibraltar
America/Manaus                  Europe/Helsinki
<SNIP>

现在您可以设置时区了。 我使用 date 命令来检查更改,但您也可以使用 timedatectl:

[root@testvm2 ~]# date
Tue 19 May 2020 04:47:49 PM EDT
[root@testvm2 ~]# timedatectl set-timezone America/Los_Angeles
[root@testvm2 ~]# date
Tue 19 May 2020 01:48:23 PM PDT
[root@testvm2 ~]#

现在您可以将房东的时区改回当地时间。

系统时间同步

systemd timesync 守护进程提供了一个 NTP 实现,在 systemd 上下文中易于管理。 它默认安装在 Fedora 和 Ubuntu 上。 但是,它仅在 Ubuntu 上默认启动。 我不确定其他发行版。 你可以自己检查一下:

[root@testvm1 ~]# systemctl status systemd-timesyncd

配置 systemd-timesyncd

systemd-timesyncd 的配置文件是 /etc/systemd/timesyncd.conf. 这是一个简单的文件,启用的选项少于旧的 NTP 和 chronyd 服务。 这是我的 Fedora VM 上该文件的内容(未经进一步修改):

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See timesyncd.conf(5) for details.

[Time]
#NTP=
#FallbackNTP=0.fedora.pool.ntp.org 1.fedora.pool.ntp.org 2.fedora.pool.ntp.org 3.fedora.pool.ntp.org
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

除了注释之外,它唯一包含的部分是 [时间]。 所有其他行都被注释掉了。 这些是默认值,不应更改(除非您有理由)。 如果您没有在 NTP= 行中定义 NTP 时间服务器,Fedora 默认使用后备 Fedora 时间服务器。 我通常添加我的时间服务器:

NTP=myntpserver

运行时间同步

您可以像这样启动并激活 systemd-timesyncd:

[root@testvm2 ~]# systemctl enable systemd-timesyncd.service
Created symlink /etc/systemd/system/dbus-org.freedesktop.timesync1.service → /usr/lib/systemd/system/systemd-timesyncd.service.
Created symlink /etc/systemd/system/sysinit.target.wants/systemd-timesyncd.service → /usr/lib/systemd/system/systemd-timesyncd.service.
[root@testvm2 ~]# systemctl start systemd-timesyncd.service
[root@testvm2 ~]#

设置硬件时钟

这是运行 timesyncd 后的情况:

[root@testvm2 systemd]# timedatectl
               Local time: Sat 2020-05-16 14:34:54 EDT  
           Universal time: Sat 2020-05-16 18:34:54 UTC  
                 RTC time: Sat 2020-05-16 14:34:53      
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes                          
              NTP service: active                      
          RTC in local TZ: no    

最初,RTC 和当地时间 (EDT) 之间的差异不到一秒,在接下来的几天里,差异又增加了几秒。 由于 RTC 中没有时区的概念,timedatectl 命令必须执行比较以确定正确的时区。 如果 RTC 时间与本地时间不完全匹配,那么它也不匹配本地时区。

为了寻找更多信息,我检查了 systemd-timesync 的状态并发现了这个:

[root@testvm2 systemd]# systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/usr/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2020-05-16 13:56:53 EDT; 18h ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 822 (systemd-timesyn)
     Status: "Initial synchronization to time server 163.237.218.19:123 (2.fedora.pool.ntp.org)."
      Tasks: 2 (limit: 10365)
     Memory: 2.8M
        CPU: 476ms
     CGroup: /system.slice/systemd-timesyncd.service
             └─822 /usr/lib/systemd/systemd-timesyncd

May 16 09:57:24 testvm2.both.org systemd[1]: Starting Network Time Synchronization...
May 16 09:57:24 testvm2.both.org systemd-timesyncd[822]: System clock time unset or jumped backwards, restoring from recorded timestamp: Sat 2020-05-16 13:56:53 EDT
May 16 13:56:53 testvm2.both.org systemd[1]: Started Network Time Synchronization.
May 16 13:57:56 testvm2.both.org systemd-timesyncd[822]: Initial synchronization to time server 163.237.218.19:123 (2.fedora.pool.ntp.org).
[root@testvm2 systemd]#

请注意表明系统时间尚未设置或已重置的日志消息。 Timesync 服务根据时间戳设置系统时间。 时间戳由 timesync 守护程序维护,并在每次成功同步时创建。

timedatectl 命令无法从系统时钟中获取硬件时钟的值。 它只能根据在命令行中输入的值来设置时间和日期。 您可以使用 hwclock 命令将 RTC 设置为与系统时间相同的值:

[root@testvm2 ~]# /sbin/hwclock --systohc --localtime
[root@testvm2 ~]# timedatectl
               Local time: Mon 2020-05-18 13:56:46 EDT  
           Universal time: Mon 2020-05-18 17:56:46 UTC  
                 RTC time: Mon 2020-05-18 13:56:46      
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes                          
              NTP service: active                      
          RTC in local TZ: yes

--localtime 选项告诉硬件时钟显示本地时间,而不是 UTC。

为什么你需要 RTC?

NTP 的任何实现都会在启动时设置系统时钟。 为什么然后是 RTC? 这并不完全正确:只有当您与时间服务器建立了网络连接时才会发生这种情况。 然而,许多系统并不总是能够访问网络连接,因此硬件时钟对于 Linux 用于设置系统时间很有用。 这比手动设置时间要好,即使它可能与实际时间有偏差。

结论

本文回顾了一些用于处理日期、时间和时区的工具。 systemd-timesyncd 工具提供了一个 NTP 客户端,可以将本地主机上的时间与 NTP 服务器同步。 但是,systemd-timesyncd 不提供服务器服务,因此如果您的网络需要 NTP 服务器,则必须使用其他东西(例如 Chrony)作为服务器。

我更喜欢对我网络上的任何服务进行单一实现,所以我使用 Chrony。 如果您不需要本地 NTP 服务器,或者您不介意使用 Chrony 作为服务器并使用 systemd-timesyncd 作为 SNTP 客户端。 毕竟,如果您对 systemd-timesyncd 的功能感到满意,则无需使用 Chrony 作为客户端的附加功能。

另一个注意事项:您不需要使用 systemd 工具来实施 NTP。 您可以使用旧版本的 ntpd、Chrony 或其他 NTP 实现。 毕竟,systemd 包含大量服务; 其中许多是可选的,因此您可以关闭它们并使用其他东西代替。 这不是一个巨大的单体怪物。 您可能不喜欢 systemd 或其中的一部分,但您应该做出明智的决定。

我喜欢 systemd 对 NTP 的实现,但我更喜欢 Chrony,因为它更适合我的需求。 这是 Linux,宝贝 -)

由于宣传

VDSina优惠 任何任务的服务器, 大量可供自动安装的操作系统选择,可以从您自己的操作系统安装任何操作系统 ISO, 舒服的 控制面板 自己开发和日常支付。 回想一下,我们有绝对永恒的永恒服务器😉

Linux 时间同步:NTP、Chrony 和 systemd-timesyncd

来源: habr.com

添加评论