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

來源: www.habr.com

添加評論