目錄
文章目錄
- 目錄
- 數字化時間
- 時間定義的型別
- 服務器時間的型別
- 常見的時間操作
- NTP
- NTP 的實作原理
- NTP 的處理流程
- Chrony
- 安裝與配置
- chronyc CLI
- 使用 Chrony 作為 NTP Server
數字化時間
時間定義的型別
- UTC(Universal Time Coordinated,國際標準時間):地球分為二十四時區,每個時區都有自己的本地時間,
- GMT(Greenwich Mean Time,格林威治標準時間):指位于英國倫敦郊區的皇家格林尼治天文臺的標準時間,因為本初子午線被定義在通過那里的經線,(UTC 與 GMT 時間基本相同)
- CST(China Standard Time,中國標準時間):CST = GMT + 8 = UTC + 8
- DST(Daylight Saving Time,夏令時):指在夏天太陽升起的比較早時,將時間撥快一小時,以提早日光的使用,(中國不使用)
服務器時間的型別
- 硬體時間:又稱 RTC(Real-Time Clock)或 CMOS 時間,在主板上靠電池供電,僅保存日期時間數值,無法保存時區和夏令時設定,
- 系統時間:作業系統啟動時復制 RTC 時間,之后就獨立運行,保存了時間、時區和夏令時設定,
常見的時間操作
- 查看當前系統的時區和時間,
$ timedatectl status
Local time: 六 2021-01-30 23:58:51 CST
Universal time: 六 2021-01-30 15:58:51 UTC
RTC time: 六 2021-01-30 15:58:51
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
- 設定當前系統時區,
# 查看時區清單
timedatectl list-timezones | grep -E "Asia/S.*"
# 選擇上海時區
timedatectl set-timezone Asia/Shanghai
# 強制同步系統時鐘
chronyc -a makestep
- 設定當前系統時間,
timedatectl set-time "2019-10-31 15:50:00"
- 系統時鐘同步至硬體,
timedatectl set-local-rtc
# or
hwclock --systohc --localtime
- 硬體時鐘同步至系統,
hwclock --hctosys
- 啟用或者禁止 NTP 時間同步,
timedatectl set-ntp yes/no
NTP
NTP(Network Time Protocol,網路時間同步協議)是一種用來進行計算機時間同步的協議,由特拉華大學的 David L. Mills 設計,位于 OSI 模型的應用層,自 1985 年以來,NTP 是目前仍在使用的最古老的互聯網協議之一,
NTP 時鐘源可以是 NTP Server 或 GPS,NTP 提供了一種高精準度的時間校正服務:LAN 環境中,時鐘偏差小于 1ms;WAN 環境中,時鐘偏差在 1-50ms 之間,NTP 還支持加密認證(Authentication)機制,以防止中間人攻擊,
NTP 的目的是在無序的 Internet 環境中提供精確且健壯的時間同步(校正)服務,在分布式時間敏感的系統至關重要,
NTP 的實作原理
在 Internet 中,NTP Server 用于提供準確的時間,首先就要有準確的時鐘源,并且這一時鐘源應該是 UTC 的(注:世界上最準確的時間是使用原子時鐘(Atomic clock)所計算的,UTC 就是其中一例),NTP Server 獲得 UTC 的時鐘可以是:原子鐘、天文臺、衛星等,稱之為獨立的時間源,
為適應 Internet 的層次結構,NTP 也采用了 Stratum(層級)時間分布模型,有了準確且可靠的時鐘源之后,時間就會按照 NTP Server 的 Stratum 進行傳播,
Stratum 的層級高低由距離時鐘源的遠近決定,獨立的時間源為 Stratum-0,直接連接到 Stratum-0 的設備為 Stratum-1,Stratum-1 則從 Stratum-0 獲取時鐘;直接連接到 Stratum-1 的設備為 Stratum-2,Stratum-2 則從 Stratum-1 獲取時鐘,以此類推,
NTP 規定 Stratum 的總層數限制在 15 以內,而 Stratum-1 則作為整個 NTP 系統的基礎,當下層 Stratum-X 從多個上層 Stratum-Y 中獲取時鐘源時,則需要利用統計學的演算法來選擇出最佳的路徑并以此校正本地時間,

國內 NTP 服務器:
cn.pool.ntp.org # 最常用的國內 NTP 服務器,參考:https://www.ntppool.org/zh/use.html
cn.ntp.org.cn # 中國
edu.ntp.org.cn # 中國教育網
ntp1.aliyun.com # 阿里云
ntp2.aliyun.com # 阿里云
ntp.sjtu.edu.cn # 上海交通大學
s1a.time.edu.cn # 北京郵電大學
s1b.time.edu.cn # 清華大學
s1c.time.edu.cn # 北京大學
s1d.time.edu.cn # 東南大學
s1e.time.edu.cn # 清華大學
s2a.time.edu.cn # 清華大學
s2b.time.edu.cn # 清華大學
s2c.time.edu.cn # 北京郵電大學
s2d.time.edu.cn # 西南地區網路中心
s2e.time.edu.cn # 西北地區網路中心
s2f.time.edu.cn # 東北地區網路中心
s2g.time.edu.cn # 華東南地區網路中心
s2h.time.edu.cn # 四川大學網路管理中心
s2j.time.edu.cn # 大連理工大學網路中心
s2k.time.edu.cn # CERNET桂林主節點
NTP 的處理流程

- 針對每個 Peer X(上層 NTP Server)的資料過濾處理,
- 針對多個 Peers 的對等選擇與組合處理,NTP 就是通過利用多個 NTP Server 及多條網路路徑來確保高準確度與可靠性的,
- 本地時鐘校正,為維持時鐘的單調性,NTP 并不會直接使用前兩步處理得到的時鐘偏差值來調整本地時鐘,而是通過一個環路濾波器轉換為一個對可變頻率振蕩器的控制量,以此來控制振蕩器的振蕩頻率,時間間接的調整系統時鐘,
Chrony
Chrony 是由 RedHat 開發的,NTP 協議的另一種實作,作為 ntpd 的替代品,在 RHEL/CentOS 7.x 中作為默認安裝的時間同步工具,Chrony 可以同時做為 NTP Server 或 NTP Client,
- 官網:https://chrony.tuxfamily.org/
Chrony 專為間歇性互聯網連接的系統而設計,也能良好應用于持久互聯網連接的環境,Chrony 可以在各種復雜的環境中良好運行,包括:間歇性網路連接環境、高擁擠網路連接環境、溫度變化環境(計算機時鐘對溫度敏感),以及不能連續運行的、或在虛擬機上運行的作業系統,
Chrony 具有兩個核心組件:
- chronyd 守護行程:用于與 NTP Server 進行時間同步,
- chronyc CLI tool:用于監控 chronyd 的性能并進行多樣化的配置,支持遠程連接,
Chrony 與 ntpd 的對比:

Chrony 相較于 ntpd 的優勢:
- 更快的同步,只需要數分鐘而非數小時時間,從而最大程度減少了時間誤差率,對于并非全天 24 小時運行的虛擬機而言非常有用,
- 能夠更好地回應時鐘頻率的快速變化,對于具備不穩定時鐘的虛擬機或者時鐘頻率發生變化的節能技術而言非常有用,
- 在初始同步后,它不會停止時鐘,以防對需要系統時間保持單調的應用程式造成影響,
- 在應對臨時非對稱延遲時(例如,在大規模下載造成鏈接飽和時)提供更好的穩定性,
- 無需對服務器進行定期輪詢,因此具備間歇性網路連接的系統仍然可以快速同步時鐘,
安裝與配置
安裝:
yum -y install chrony
systemctl status chronyd
systemctl enable chrony
配置:/etc/chrony.conf
-
server hostname [option]:指定 NTP Server,具有以下 options,- iburst 引數:表示加急,指定在頭四次 NTP 請求中,采用 2s 或更短的時間間隔發出 NTP 請求,而不是以 minpoll x 指定的最小間隔,可以讓 chronyd 在啟動時快速進行一次時間同步,
- minpoll x 引數:發出 NTP 請求的最小時間間隔,默認值是 6,代表 64s,
- maxpoll x 引數:發出 NTP 請求的最大時間間隔,默認值是 9,代表 512s,
-
bindcmdaddress:指定 chronyd 監聽的網路介面, -
allow/deny:NTP Client 的 ACL 限制,支持精確 IP 和 CIDR, -
cmdallow/cmddeny:NTP CLI 的 ACL 限制,支持精確 IP 和 CIDR, -
makestep threshold limit:通常 chronyd 會將根據需求通過 “加速/減慢” 的方式逐步糾正系統的時間偏移,但在某些特定情況下,該調整程序會消耗很長的時間,所以 makestep 指令用于強制 chronyd 在調整期大于某個域值時,直接進行 “跳躍式” 校時,例如:makestep 1.0 3 表示頭三次校時,如果時間相差 1.0s, 則進行跳躍式校時,而不是 “加速/減慢” 式校時, -
local stratum 10:表示即使 server 指令中 NTP Server 不可用了,也允許使用本地時間作為標準時間源同步到其它的客戶端, -
rtcsync:指定啟用內核模式,系統時間每 11 分鐘間隔就會拷貝到硬體時間, -
logdir:指定日志檔案路徑, -
driftfile file:指定根據實際時間計算出 “增/減” 時間差的比率,并將補償引數記錄到一個檔案中,會在機器重啟后為系統時鐘作出補償,默認為 /var/lib/chrony/drift,
NOTE:chrony 與 ntpd 最大的區別就是:時間的修正是連續進行的,而 ntpd 需要搭配 Crontab 來自動定時同步時間,本質就是用 crontab 定時執行一次手動時間同步命令 ntp,因此會出現間斷,
配置示例:
# 指定上層 NTP 服務器為阿里云提供的公網 NTP 服務器,
server ntp1.aliyun.com iburst minpoll 4 maxpoll 10
server ntp2.aliyun.com iburst minpoll 4 maxpoll 10
server ntp3.aliyun.com iburst minpoll 4 maxpoll 10
server ntp4.aliyun.com iburst minpoll 4 maxpoll 10
# 當阿里云提供的公網 NTP 服務器不可用時,采用本地時間作為同步標準,
local stratum 8
# 讓 chronyd 在選擇源時忽略源的層級,
stratumweight 0
# 記錄系統時鐘獲得/丟失時間的速率至 drift 檔案中,
driftfile /var/lib/chrony/drift
# 啟用 RTC(實時時鐘)的內核同步,
rtcsync
# 如果系統時鐘的偏移量大于 10 秒,則允許在前三次更新中步進式的調整系統時鐘,
makestep 10 3
# 只允許 192.168.1 網段的客戶端進行時間同步,
allow 192.168.1.0/24
# 指定包含 NTP 驗證密鑰的檔案,
keyfile /etc/chrony.keys
# 如果時鐘調整大于 0.5 秒,則向系統日志發送訊息,
logchange 0.5
# 指定存放日志檔案的目錄,
logdir /var/log/chrony
# 禁用客戶端訪問的日志記錄
noclientlog
# Select which information is logged.
log measurements statistics tracking
chronyc CLI

- 查看時間同步情況,
$ chronyc tracking
Reference ID : A29FC801 (time.cloudflare.com) # 當前進行時間同步的參考,
Stratum : 4 # 連接參考時鐘的跳數,
Ref time (UTC) : Sat Jan 30 13:36:04 2021 # 參考時間,
System time : 0.003950741 seconds fast of NTP time # 系統時間,
Last offset : +0.001695401 seconds # 最后一次時間校對偏移量,
RMS offset : 0.001266512 seconds # RMS 偏移,偏移值的長期平均值,
Frequency : 5.060 ppm slow # 系統的時鐘錯誤的頻率,單位為 ppm(百萬分率),
Residual freq : +0.000 ppm # 殘余頻率,表示參考源的測量值與當前使用的頻率之間的差異,
Skew : 0.010 ppm # 偏斜,估計頻率的誤差界限,
Root delay : 0.228649795 seconds # 根延遲,網路路徑延遲到計算機正在同步的層計算機的總和,
Root dispersion : 0.010007298 seconds
Update interval : 15499.7 seconds # 說明最后兩次更新的時間間隔,
Leap status : Normal # 跳躍狀態,列舉:正常、插入秒、洗掉秒、或不同步,
- 顯示所有 Source NTP Server 的資訊,
$ chronyc sources -v
210 Number of sources = 4
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^+ ntp16.doctor.com 2 10 127 49m +24ms[ +24ms] +/- 169ms
^* time.cloudflare.com 3 10 271 121m +26ms[ +28ms] +/- 145ms
^+ lax1.nonce.monster 2 10 377 200m -6349us[-4660us] +/- 161ms
^+ ntp1.ams1.nl.leaseweb.net 2 10 277 402 -788us[ -788us] +/- 153ms
- 顯示所有 Source NTP Server 的狀態,
$ chronyc sourcestats -v
210 Number of sources = 4
.- Number of sample points in measurement set.
/ .- Number of residual runs with same sign.
| / .- Length of measurement set (time).
| | / .- Est. clock freq error (ppm).
| | | / .- Est. error in freq.
| | | | / .- Est. offset.
| | | | | | On the -.
| | | | | | samples. \
| | | | | | |
Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev
==============================================================================
ntp16.doctor.com 6 3 15h +0.320 0.949 +14ms 1099us
time.cloudflare.com 64 30 69h -0.003 0.009 -6159us 1469us
lax1.nonce.monster 7 3 137m +0.126 0.186 -4871us 165us
ntp1.ams1.nl.leaseweb.net 37 19 11h +0.048 0.059 -1273us 1203us
- 查看 Source NTP Server 的在線和離線狀態,
$ chronyc activity
200 OK
4 sources online
0 sources offline
0 sources doing burst (return to online)
0 sources doing burst (return to offline)
0 sources with unknown address
- 查看 Chrony 服務的日志,
$ journalctl -u chronyd
- 檢查 NTP 訪問是否對 Source NTP Server 可用,
$ chronyc accheck <server>
- 手動添加一臺新的 Source NTP Server,
$ chronyc add server <server>
- 手動移除 NTP Server 或對等服務器,
$ chronyc delete <server>
- 手動設定 chronyd 的時間,
$ chronyc settime
使用 Chrony 作為 NTP Server
要將 Chrony 作為一個 NTP Server,方法很簡單,
- 首先,需要修改 /etc/chrony.conf 檔案,并添加以下配置即可,
allow 192.168.1.0/24 # ACL 限制,
bindcmdaddress 0.0.0.0 # chronyd 監聽介面,
local stratum 10 # 即使服務器沒有上層時間源,也可使用本地時間作為時鐘源,
- 重啟 Chronyd 服務,
systemctl restart chronyd
占用埠:
- 123/udp:標準的 NTP Server 監聽埠,
- 323/udp:默認的管理埠,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255652.html
標籤:其他
上一篇:小米的隔空充電,看起來好酷
下一篇:云版 Android 系統來了?
