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