NTP 簡介
昨天遇到了一個神奇的問題,最後發現是伺服器的 ntpd 沒開導致本地時間沒有同步:joy: 正好了解一下 NTP.
NTP 協議
NTP 協議用於在網路之中通過分組交換進行時鐘同步。基於 UDP,使用 123 埠。
協議實現
客戶端和伺服器間會通過修改版的Marzullo 演算法 完成時間同步。
在傳遞時間時,伺服器會給出 64 位的時間戳,浮點精度為 32 位。這個時間戳每 2^32 秒會翻轉一次,理論解析度為 2^-32 秒。時間戳以 1900 年 1 月 1 日作為開始時間。
NTP 時間源會進行分層,通過階層 n 同步的伺服器將執行在階層 n+1. 分層機制用來防止迴圈請求。階層 0 的伺服器與高精度計時裝置(如原子鐘)相連,也成為基準時鐘。
使用 NTP 同步 Linux 系統時間
ntpd
ntpd 是某些 Linux 發行版自帶的 NTP 同步工具,它通常在後臺執行,與授時伺服器進行時間同步。
ntpd 預設使用/etc/ntp.conf
作為配置檔案。配置方法及範例可以參考Linux System Administrators Guide
不過需要注意的是,啟動 ntpd 並不會立即糾正本地時間,而是會緩慢地進行時間同步。
Be patient! A simple test is to change your system clock by 10 minutes before you go to bed and then check it when you get up. The time should be correct.
ntpdate
ntpdate 是一款使用 NTP 協議同步本地時間的工具。如果需要快速糾正時間,可以使用 ntpdate 進行手動同步。
安裝:
apt install ntpdate
使用:
$ sudo ntpdate cn.ntp.org.cn 12 Feb 13:19:05 ntpdate[27659]: adjust time server 119.28.183.184 offset -0.007086 sec
注意:由於 NTP 協議使用固定埠,在使用 ntpdate 時,需要關閉 ntpd 服務。
systemd-timesyncd
systend-timesyncd
是timedated
提供的時鐘同步守護軟體。它可以通過systemd-timesyncd.service
服務啟動。
timesyncd
的配置檔案位於/etc/systemd/timesyncd.conf
,格式如下:
[Time] NTP=cn.ntp.org.cn 0.cn.pool.ntp.org # 主要 NTP 伺服器 FallbackNTP=0.arch.pool.ntp.org 1.arch.pool.ntp.org 2.arch.pool.ntp.org 3.arch.pool.ntp.org # 備用 NTP 伺服器 RootDistanceMaxSec=5 PollIntervalMinSec=32 PollIntervalMaxSec=2048
配置完成後,執行sudo timedatectl set-ntp true
啟用時間同步服務timedatectl status
可以檢視當前同步設定,timedatectl timesync-status
可以檢視當前時間同步服務的執行狀態,包括時間延遲、誤差、至今同步次數等。
國內常用的 NTP 地址(IP 池)
更多地址可參考國內常用NTP伺服器地址