Linux時間同步服務Chronyd同步時間工作機制探討
我之前由于測試了SSL證書過期如何延期,我把服務器的時間往后調了一年。事后我沒有把服務器的時間調整回去,服務器上安裝了chronyd服務,我原以為時間會在不久之后修正回去。然而直到我發現Prometheus無法工作才知曉,時間并沒有及時修正。
我檢查了chronyd的服務狀態是正常運行,配置也沒有問題,配置是:
# cat /etc/chrony.conf |egrep -v '^$|#'
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
其中 makestep 參數用于控制在啟動時或手動強制同步時的最大步長。具體來說,它有兩個子參數:
- 第一個參數:最大步長(以秒為單位)。如果系統時間與NTP時間的偏差超過這個值,chronyd 會進行一步調整。
- 第二個參數:最大步長的允許次數。如果在一定時間內多次需要進行大步調整,chronyd 會限制調整次數。
rtcsync 參數用于啟用或禁用將系統時間寫入實時時鐘(RTC, Real-Time Clock)的功能。實時時鐘是硬件時鐘,通常在系統關機后仍然保持時間。
那么為什么時間沒有及時的修正呢?我只有在手動重啟chronyd服務之后,時間才正確修正了呢?
原來chronyd不是一下子就修正時間的,它是逐步調整時間的,具體請查看如下截圖,chronyc tracking 檢查每隔一段時間的時間差是越來越小的。
圖片
其實我們也可以手動強制 chronyd 進行時間同步,而不需要重啟服務。
chronyc makestep
這個命令會強制chronyd立即調整系統時間,而不是逐步調整。
圖片
所以假如我們在服務器上時間相差太大,建議直接執行下 chronyc makestep,另外測試好需要及時恢復環境,或者臨時新建一個測試服務器處理。