Linux 上怎么配置 Ntp 時間同步
NTP 是 Network Time Protocol 的縮寫,也即 網絡時間協議,一種在 Linux 上保持準確時間的協議,它和網絡上可用的 NTP 服務器保持著時鐘同步
在 Linux 中,保持準確的日期和時間至關重要,因為許多服務(如 cron 作業和腳本)依賴于準確的時間才能得到預期的結果
用于同步日期和時間的 ntpd 服務,在新的Linux發行版 ( centos8、Ubuntu 20.04、Fedora 30 ) 中已經廢棄了,取而代之的是 chrony
當然,選擇 chrony 是有原因的,相比 ntpd , 它有如下的優點:
1、時間同步的速度比 ntpd 更快
2、chrony 很好的處理了同步延遲以及網絡延遲
3、即使出現網絡降級,chrony 仍然能正常工作
4、本地機器可以作為時間服務器,其他機器從這臺服務器上同步時間
安裝
在新的 Linux 發行版(centos8、Ubuntu 20.04、Fedora 30)及以后的版本中,系統默認已經安裝了 chrony,在這之前的版本是沒有安裝的,可以使用下面的命令進行安裝
yum install chrony
安裝完成后,chrony 服務默認會自動加到 systemctl 中管理,下面列出了一些常用的命令
#查詢 chronyd 服務狀態
systemctl status chronyd
#啟動 chronyd 服務
systemctl start chronyd
#關閉 chronyd 服務
systemctl stop chronyd
#重啟 chronyd 服務
systemctl restart chronyd
#設置 chronyd 服務開機自啟
systemctl enable chronyd
systemctl daemon-reload
另外,啟動 chronyd 服務的時候如果出現下面截圖中的錯誤,需要安裝或者升級 libsepol、policycoreutils-python
具體的問題說明詳見 https://bugzilla.redhat.com/show_bug.cgi?id=1592775
# 安裝 libsepol 和 policycoreutils-python
yum install libsepol policycoreutils-python
chrony 的組成
chrony 是由 守護進程 chronyd 以及 命令行工具 chronyc 組成的,具體如下圖
chronyd 在后臺靜默運行并通過 123 端口與時間服務器定時同步時間,默認的配置文件是 /etc/chrony.conf
chronyc 通過 323 端口與 chronyd 交互,可監控 chronyd 的性能并在運行時更改各種操作參數
chronyc 通過下面的方式訪問 chronyd
通過 IPv4 或 IPv6 訪問
2、通過 Unix 域 socket, 但只能訪問到本地的 chronyd,而且需要 root 用戶或者 chrony 用戶才能訪問
默認情況下,chronyc 先通過 Unix 域 socket 訪問 chronyd,默認的 socket 文件是 /var/run/chrony/chronyd.sock, 如果失敗(常見的原因是使用非 root 用戶運行 chronyc ),將嘗試通過 127.0.0.1 訪問 chronyd
chrony 配置
守護進程 chronyd 的默認配置文件是 /etc/chrony.conf,其中可配置項很多,這里介紹一些常用的
配置項 | 說明 |
server | 客戶端需找哪個服務器詢問當前時間 |
pool | 同 server 配置項 |
driftfile | 本地時鐘和服務器時鐘的預估漂移保存到哪個文件中 |
makestep | 糾正客戶端時間的步進參數 |
rtcsync | 是否允許內核同步實時時鐘 |
allow | 允許客戶端通過內網地址同步時鐘 |
logdir | 日志目錄 |
配置時間同步
守護進程 chronyd 既可作為客戶端 與 服務器同步時間,又可作為一個服務器,接受其他客戶端同步時間的請求
下面以配置局域網時間服務器為例來說明 chronyd 的客戶端和服務器的配置,相關的參數如下:
客戶端IP: 192.168.70.22服務器IP: 192.168.70.21
下面是具體的配置步驟
1. 安裝客戶端服務器
分別在客戶端機器和服務器機器安裝 chrony,安裝方法前面有講述,這里不贅述了
2. 編輯 /etc/chrony.conf
安裝好 chrony 之后,編輯 /etc/chrony.conf 配置文
客戶端配置
# 同步時間的服務器 IP 或 域名
server 192.168.70.21 iburst
# 系統時鐘的預估漂移保存到指定的文件中,是為了在下次啟動時能穩定的同步
driftfile /var/lib/chrony/drift
# 如果系統時鐘由于某種原因與啟動后的服務器時間相差甚遠,允許 chronyd
# 通過步進而不是回轉來快速糾正它
makestep 1 3
# 為了使客戶端實時時鐘接近服務器的時鐘,以便下次時鐘啟動時更接近真實的時間
# 增加了一種 rtcsync 模式,該模式下,系統時間會定期的拷貝到實時時鐘里
rtcsync
# 日志
logdir /var/log/chrony
服務器配置
安裝 chrony 之后,默認的配置是客戶端的啟動配置的,要想作為一個時間服務器來運行的話, 需要在配置中增加 allow 配置項,它表示允許客戶端通過該地址和服務器同步時間
另外,時間服務器的時間也需要從網絡上其他的時間服務器進行同步,這里直接用默認的即可,具體的配置如下
# 同步時間的服務器 IP 或 域名
pool 0.centos.pool.ntp.org iburst
pool 1.centos.pool.ntp.org iburst
pool 2.centos.pool.ntp.org iburst
pool 3.centos.pool.ntp.org iburst
# 為了在下次啟動時穩定的同步,系統時鐘的預估漂移需要保存到指定的文件中
driftfile /var/lib/chrony/drift
# 如果系統時鐘由于某種原因與啟動后的服務器時間相差甚遠,允許 chronyd
# 通過步進而不是回轉來快速糾正它,這個過程將花費很長時間
makestep 1 3
# 為了使客戶端實時時鐘接近服務器的時鐘,以便下次時鐘啟動時更接近真實的時間
# 增加了一種 rtcsync 模式,該模式下,系統時間會定期的拷貝到實時時鐘里
rtcsync
# 允許客戶端通過該地址和服務器同步時間,其實這里配置的就是時間服務器的地址
allow 192.168.70.21
pool 配置項
客戶端需要去時間服務器獲取時間,配置文件中 server 和 pool 配置項表示時間服務器的地址,支持域名或者IP
建議配置多個時間服務器的地址,優先選擇同步良好,網絡穩定且靠近客戶端的地址
pool 與 allow 的區別
pool指的是進行時間同步的服務器IP地址或域名,作為服務器來說,其機器時間也需要從其他時間服務器同步,此時,服務器是作為一個客戶端從網絡服務器上獲取時間
而 allow 字段表示的是作為服務器,允許客戶端從該地址獲取時間,此地址其實就是服務器的內網地址
3. 處理防火墻
時間服務器如果有開啟防火墻的話,需要開啟 UDP 協議 的 123 端口,以允許客戶端向服務器發送獲取時間的請求
[root@cghost22 ~]# firewall-cmd --permanent --add-port=123/udp
success
[root@cghost22 ~]# firewall-cmd --reload
success
如果想要關閉防火墻的 123 端口,在服務器機器上執行下面的命令
[root@cghost22 ~]# firewall-cmd --permanent --remove-port=123/udp
success
[root@cghost22 ~]# firewall-cmd --reload
success
4. 重啟 chrony
配置好客戶端和服務器之后,為使配置生效,需要重啟 chronyd 服務
systemctl restart chronyd
5. 查詢信息
在服務器端輸入 chronyc clients 命令查看同步的客戶端信息
在客戶端輸入 chronyc sources 命令查查看時間服務器的信息
問題
在配置時間服務器的過程中,可能遇到各種問題,下面記錄了一些常見的問題以及解決思路
客戶端無法進行時間同步
第一個想到的應該是 服務器之上存在防火墻,這時客戶端向服務器請求時間不會有任何的響應,在客戶端機器輸入 chronyc sources 命令可以看到 Reach 字段的值為 0 ,表示客戶端無法收到服務器的響應了,具體請看下圖
如果排除了防火墻的問題的話,可能需要使用一些工具(tcpdump、wireshark)檢查下客戶端是否有收到服務器的數據包
客戶端和服務器時間差得太多,如何快速修正
通常 chrony 會逐步的修正和服務器之間的時間差,根據需要加快或者減慢時鐘,如果客戶端和服務器時間差得太多了的話,這個過程會持續很長時間
這種情況可以使用 chronyc makestep 命令快速修復客戶端時間,makestep 后面不帶任何參數時,表示 chronyd 取消正在修正時間的動作,將當前客戶端時間直接修改成服務器的時間
不過,需要注意的是,這種方法直接越過了一段系統時間,有可能會對應用程序造成嚴重的問題,所以,推薦按照 chronyd 逐步修正的方式來同步時間
小結
本文介紹了 Linux 中,時間同步的配置方法,提供常見的問題的解決思路或者方案,更多關于 chrony 的介紹請參考下方的網站
https://chrony.tuxfamily.org/documentation.html