網路時間協定(NTP, Network Time Protocol)是實現該必備條件的標準化網路協定,其允許電腦主機或嵌入式開發板透過網路與時間伺服器達到時間同步的效果。NTP運作的核心在於其階層式(Stratum)架構。最頂層是Stratum 0(如原子鐘),Stratum 1 直接從 Stratum 0 獲取時間,而 Stratum 2 則從 Stratum 1 同步,依此類推。傳統上,ntpd(NTP daemon)是主流選擇,其歷史悠久且功能強大,但在現代化系統中逐漸顯露其侷限性,特別是在啟動速度與應對時間波動方面的表現。隨著技術演進,兩個時間同步的解決方案(chrony和systemd-timesyncd)逐漸取代ntpd,相較於傳統 ntpd方案,這兩個套件提供更加精準可靠的時間同步服務,尤其是在虛擬化環境和網路不穩定的場景。
systemd-timesyncd是一個極簡主義的解決方案。其屬於systemd服務系統的一部分,主要目標是快速簡單地與遠端NTP伺服器同步本地系統時間,優點是輕量級且配置簡單,通常只需要配置/etc/systemd/timesyncd.conf,即可快速在系統啟動時完成同步。然而systemd-timesyncd僅支援客戶端模式,無法作為時間伺服器供其他設備同步,同時不具備複雜的頻率調整演算法或Stratum管理功能。換言之,其僅適用於單一主機,開發板或不需要提供時間服務的客戶端,而無法適用於內部區網架設NTP伺服器的應用場景。
相對於systemd-timesyncd,chrony 是一個功能完整和優化的解決方案,其主要由兩個程式chronyd(守護行程)和chronyc(命令列介面)組成的,並透過演算法的動態調整,可有效針對不穩定的網路連線環境和頻繁的時鐘頻率變化的場景對時間動態修正和補償,其在處理時鐘偏移(Clock Skew)和時間突變(abrupt jumps)特別有效,並能平滑調整時間,避免對時間變化對某些應用服務造成影響。對於在高可靠性和高精度時間的應用場景,例如協同運作的分散式系統或是需要架設內部時間伺服器的Linux環境,chrony是不二之選,也是本文主要討論的內容。簡單比較表如下:
chrony伺服器和客戶端的安裝與測試:
本文的安裝環境如下:
1.伺服器: AlmaLinux OS 的樹莓派(Raspberry pi 5 / 8G)
2.客戶端: Ubuntu 22.04 LTS desktop OS 的虛擬機
為了避免不同linux發行版本可能先行預裝systemd-timesyncd套件,而造成chrony和systemd-timesyncd套件之間的衝突,請先行查看是否已預裝systemd-timesyncd套件,並強制停用systemd-timesyncd套件。安裝步驟如下:
a.伺服器端:
i.停用systemd-timesyncd套件(使用 mask 確保不會被其他服務喚醒)
sudo systemctl stop systemd-timesyncd
sudo systemctl disable systemd-timesyncd
sudo systemctl mask systemd-timesyncd
ii.更新軟體源,並安裝和啟用chrony
sudo apt update
sudo apt install chrony -y
sudo systemctl enable chrony
sudo systemctl restart chrony
iii.配置/etc/chrony.conf文件
可利用該文件重新配置上游時間源,或不做任何變更,沿用預設的上游時間源亦可,例如pool 2.almalinux.pool.ntp.org 是樹莓派中AlmaLinux OS默認的NTP時間同步池來源。另外,還須允許同網段的客戶端可以連線到該伺服器端。
sudo nano chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (https://www.pool.ntp.org/join.html).
pool 2.almalinux.pool.ntp.org iburst
# Allow NTP client access from local network.
allow 192.168.0.0/16
iv.重啟chrony,並透過下列指令檢視該伺服器與上游時間源同步的狀態。其中圖一中的紅框說明該伺服器已與上游時間源同步。圖二綠框說明上游為二級時間源,紅框中的*表示目前該伺服器同步的是這一個二級時間源(157-20-68-84.fuyu.network)。圖三除了說明二級時間源的name和IP之外,system time說明該伺服器與這一個二級時間源(157-20-68-84.fuyu.network)的同步時間差,一般而言,小於毫秒(ms)屬於準確,因此狀態顯示為正常。
sudo systemctl restart chronyd
timedatectl
chronyc sources -v
chronyc tracking
 |
| 圖一 |
 |
| 圖二 |
 |
| 圖三 |
b.客戶端:
客戶端的安裝和配置相對簡單,除了重複上述伺服器端安裝chrony的i和ii安裝步驟之外,只需在配置文件(/etc/chrony/conf.d/ub_vm.conf)中,指向上述已配置的內部NTP伺服器IP位址或主機名即可,文件配置方式如下:
i.在/etc/chrony/conf.d路徑下,建立一個ub_vm.conf
sudo nano ub_vm.conf
ii.將下列內容貼到ub_vm.con中
# 1. 優先使用上述已設置的內部NTP伺服器(ip:192.168.0.114),加上 prefer 代表最高優先權
server 192.168.0.114 iburst prefer
# 2. 加入外部公共 NTP 伺服器作為備援 (當內部NTP伺服器未開機時,內部客戶端自動使用外部公共 NTP 伺服器)
pool ntp.ubuntu.com iburst
pool pool.ntp.org iburst
# 3. 快速校時:前3次同步,若誤差大於1秒,則立即跳轉到正確時間
makestep 1.0 3
# 4. 儲存時鐘漂移率,這能讓客戶端在離線時更精準
driftfile /var/lib/chrony/chrony.drift
iii.重啟chrony,使服務生效
sudo systemctl restart chronyd
iv.同樣透過下列指令檢視該客戶端與該伺服器時間同步的狀態。
timedatectl
chronyc sources -v
chronyc tracking
 |
| 圖四 |
 |
| 圖五 |
 |
| 圖六 |
至於如何確認運維環境中,時間同步狀態是否健康,可留意下列幾項內容,以確認客戶端和伺服器端的連線狀態,包含判斷IP位址,同步時間差,時間源順序等等指標。
1.System clock synchronized: yes,說明客戶端的時間已與某個NTP伺服器取得同步,至於與哪個伺服器取得同步,要用chronyc來查看。
2.^* 192.168.0.114: ^*標籤表示客戶端已與該台NTP伺服器(也就是上述配置的伺服器端)取得同步,如果看到 ? 或 x,表示連線有問題或該源被判定為無效,需進一步檢查 Offset 和 Delay 欄位,可以幫助診斷網路延遲或時間偏移過大的問題。另外可特別注意該伺服器的級別(Stratum)屬於4級。
3.System time : 0.000000041 seconds fast of NTP time,表示該客戶端與上述配置的伺服器端(192.168.0.114)的同步時間差為0.000000041秒,屬於精準可靠的同步狀態。
Reference:
沒有留言:
張貼留言