Linux服務(wù)器時間系列(一)——了解服務(wù)器時間

說在前面

本篇文章主要針對Linux服務(wù)器時間(包含系統(tǒng)時間和硬件時間)進(jìn)行介紹,同時對服務(wù)器時間存在的時間偏移問題給出目前應(yīng)用較多的解決方案,并且對相關(guān)的解決方案進(jìn)行原理介紹和命令介紹。希望對各位讀者有所幫助。

一、硬件/系統(tǒng)時間的查詢

Linux的服務(wù)器時間可以分為硬件時間和系統(tǒng)時間,我們在服務(wù)器上面跑的時間默認(rèn)用的都是系統(tǒng)時間。簡單理解的話,硬件時間主要用途是作為開機(jī)時的時間存檔加載到系統(tǒng)時間上面,而系統(tǒng)時間則是開機(jī)后由內(nèi)核維護(hù),保存在內(nèi)存中的一個計時器。

1、系統(tǒng)時間(Software Clock)

系統(tǒng)時間由內(nèi)核維護(hù),開機(jī)后會讀取硬件時間作為默認(rèn)的系統(tǒng)時間,后續(xù)用戶可以自行設(shè)置系統(tǒng)時間,需要注意的是對于系統(tǒng)時間的修改,默認(rèn)情況下是不會回寫到硬件時間上面的。
我們可以通過date命令來快速查詢當(dāng)前Linux系統(tǒng)的系統(tǒng)時間

date
date +"%Y-%m-%d %H:%M:%S"
2、硬件時間(RTC / CMOS Time)

硬件時間見名知義,就是硬件維護(hù)的時間,主板上存在一顆紐扣電池供電的“電子表”,掉電也繼續(xù)走,但精度差,(據(jù)說每天漂移幾秒到幾十秒,但這點筆者未能找到比較可信的參考,不過大部分文章倒是都有提到硬件時間存在漂移的問題)。
我們可以使用hwclock命令來查看當(dāng)前Linux系統(tǒng)的硬件時間

hwclock --show  # 查看當(dāng)前硬件時間
hwclock -w      # 把當(dāng)前系統(tǒng)時間寫入到硬件時間上(內(nèi)核->主板)
hwclock -s      # 把當(dāng)前硬件時間寫入到系統(tǒng)時間上(主板->內(nèi)核)

二、服務(wù)器時間的修正/修改

需要注意的是,在沒有人為介入的情況下,無論是硬件時間還是系統(tǒng)時間實際上都會隨著系統(tǒng)運行時間的變長而偏移量逐漸變大,這點在硬件時間上尤為明顯,雖然系統(tǒng)時間累積的漂移量很低,但是如果一旦出現(xiàn)系統(tǒng)重啟的問題,就會因為讀取硬件時間而導(dǎo)致漂移量變大。
為了解決這個問題,我們必須要有方式去定期手動修正系統(tǒng)時間可能產(chǎn)生的偏移量,下面我們來介紹幾種主流的方案。

需要注意的是,在沒有人為介入的情況下,無論是硬件時間還是系統(tǒng)時間實際上都會隨著系統(tǒng)運行時間的變長而偏移量逐漸變大,這點在硬件時間上尤為明顯,雖然系統(tǒng)時間累積的漂移量很低,但是如果一旦出現(xiàn)系統(tǒng)重啟的問題,就會因為讀取硬件時間而導(dǎo)致漂移量變大。
為了解決這個問題,我們必須要有方式去定期手動修正系統(tǒng)時間可能產(chǎn)生的偏移量,下面我們來介紹幾種主流的方案。

(一)使用date命令臨時修正(只適用于臨時解決)

發(fā)現(xiàn)系統(tǒng)時間存在漂移時,我們可以使用date命令來臨時對系統(tǒng)時間進(jìn)行修正,這種場景適用于本身服務(wù)器不能連接外網(wǎng),且沒有自建ntp服務(wù)器等情況。

date -s "2025-10-14 15:30:00"  # 手動設(shè)置系統(tǒng)時間
hwclock -w  # 將系統(tǒng)時間回寫到硬件時間
(二)使用ntpdate命令修正(借助ntp服務(wù)器)

由于系統(tǒng)時間的偏移量修正是普遍的問題,借助ntp服務(wù)來修正系統(tǒng)時間是從早期乃至現(xiàn)在也還是一種常見的技術(shù)方案。首先,目前市面上存在一些公共的ntp服務(wù)提供者(比如cn.pool.ntp.org),他們通過硬件和其他技術(shù)手段,保證了他們維護(hù)了一個準(zhǔn)確的時間,并對外提供服務(wù),ntpdate命令實現(xiàn)的原理是我們通過獲取第三方服務(wù)返回的時間作為準(zhǔn)確的時間源,來修正當(dāng)前的系統(tǒng)時間。
如果是內(nèi)網(wǎng)環(huán)境的話,一般是會先在一臺服務(wù)器上面搭建ntp服務(wù)(對外獲取正確的時間同步到本地),再作為統(tǒng)一的服務(wù)出口提供給內(nèi)網(wǎng)所有的服務(wù)器使用。
介紹完ntp服務(wù)后,我們再來聊一下ntp服務(wù)的一些使用細(xì)節(jié):

  1. ntpdate是一次性的校正工具,會直接將系統(tǒng)時間校正到正確的時間,可能存在時間跳變的問題
  2. ntpdate命令不能做到定時自動校正,所以比較常見的做法是結(jié)合crontab命令來做成定時任務(wù)進(jìn)行系統(tǒng)時間校正

接下來我們開始正式說一下ntpdate命令的使用,首先需要在本地服務(wù)器下載ntp客戶端ntpdate

which ntpdate   # 下載之前可以先看看本地是否已經(jīng)有了ntpdate命令了
yum install ntp #  沒有的話就安裝一個

下載完成后,我們可以通過以下命令來查看當(dāng)前系統(tǒng)時間和ntp服務(wù)時間的差異,以及同步工作

# 只查詢本地系統(tǒng)時間和ntp服務(wù)時間的偏移量,這里的ntpserver可以是ip也可以是域名
ntpdate -q ntpserver  

# 根據(jù)ntp服務(wù)時間修正當(dāng)前系統(tǒng)時間,-u參數(shù)可以改成改用 非特權(quán)端口(123→1024+)發(fā)包/收包,避免因為權(quán)限或者防火墻問題被攔截
# 如果本身就有root權(quán)限,且防火墻沒有特別要求的話,這里的-u可以不用加
ntpdate -u ntpserver

執(zhí)行結(jié)果如下:

# ntpdate -q 10.10.10.10
server 10.10.10.10, stratum 4, offset 112.800209, delay 0.02657
18 Oct 12:58:39 ntpdate[9442]: step time server 10.10.10.10 offset 112.800209 sec

# ntpdate 10.10.10.10
18 Oct 13:03:40 ntpdate[13402]: step time server 10.10.10.10 offset 112.804155 sec
拓展:將ntpdate配置到定時任務(wù)中

這里配置了每隔2小時的20分,就會自動做一次ntp服務(wù)的自動同步,且同時回寫到硬件時間上面

20 */2 * * * /usr/sbin/ntpdate -u 10.10.10.10 && /sbin/hwclock -w > /dev/null 2>&1
(三)使用chronyc進(jìn)行時間修正

ntpdate工具固然好用,但目前chronyc工具也同樣被廣泛使用,這個工具自2009年隨 Chrony 項目誕生,2014年RHEL/CentOS 7開始把 chrony 設(shè)為默認(rèn) NTP 實現(xiàn),chronyc 隨之成為系統(tǒng)標(biāo)配工具。
chrony套件中一共有2個核心的成員:chronycchronyd。后者是 Chrony 套件里的常駐守護(hù)進(jìn)程,負(fù)責(zé)持續(xù)收發(fā) NTP 包、計算漂移、平滑調(diào)頻,讓系統(tǒng)時鐘長期保持亞毫秒精度;前者是則是客戶端工具,讓用戶可以進(jìn)行ntp換源、實時讀數(shù)、故障排除等操作。

1、chronyd(chrony daemon)

由于守護(hù)進(jìn)程的特性,使得chrony天然就支持定時從ntp服務(wù)器中獲取時間更新到系統(tǒng)時間上面。ntpdate命令是在執(zhí)行命令的時候手動傳入IP參數(shù)來指定ntp服務(wù)器的,chronyd則是通過讀取/etc/chrony.conf配置來實現(xiàn)。

我們可以來看一下缺省的chrony.conf配置文件
server聲明一臺遠(yuǎn)端 NTP 服務(wù)器,接下來再配置ntp服務(wù)器的源,國內(nèi)可以改成用阿里的ntp源(ntp.aliyun.com),最后是配置同步源的策略,一般默認(rèn)的iburst就可以滿足日常需要了。(首次上線或者服務(wù)斷網(wǎng)重連的時候,會同時發(fā)8 個包,發(fā)完后恢復(fù)普通輪詢,后續(xù)不再高速發(fā)包)。

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
同步策略介紹
選項 含義 示例
iburst 初始 8 連發(fā),秒級首同步 server ntp.aliyun.com iburst
burst 每次輪詢都發(fā) 8 包,用于高抖動鏈路 server x.x.x.x burst
minpoll N 最小輪詢間隔 2^N 秒 (默認(rèn) 6→64 s) server x minpoll 4 # 16 s
maxpoll N 最大輪詢間隔 2^N 秒 (默認(rèn) 10→1024 s) server x maxpoll 8 # 256 s
prefer 同等條件下優(yōu)先選此源 server x prefer
trust 永久信任,不做 falseticker 檢測 server x trust
nomodify 禁止遠(yuǎn)程用 ntpdc/ntpq 改配置 allow 192.168/24 nomodify
noselect 算樣本但不選為當(dāng)前源(調(diào)試對比) server x noselect

到這里可能有讀者會問,有多個ntp源的情況下,chrony怎么知道要選擇哪個ntp服務(wù)器作為最終的ntp源呢?

chrony會實時給所有源打分——誰分最低(最穩(wěn)定、最靠近真實時間)就把誰選為“當(dāng)前源”(帶 * 號),其余好的留作候補(bǔ)(+),差的直接剔除(-)。因此 “最后用的源”可能動態(tài)變化,甚至同時 合并多個源 做加權(quán)平均。

chronyd的啟動及日常運維
systemctl enable --now chronyd     # 一次性完成啟機(jī)+自啟
systemctl restart chronyd          # 修改配置后重載
systemctl status  chronyd          # 看運行狀態(tài)
2、chronyc(chrony client)

chronyc使用的前提是chronyd服務(wù)存在,本質(zhì)上chronyc工具就是需要依賴chronyd才能完成工作的。我們可以利用這個工具來進(jìn)行時間偏移量的查看、ntp數(shù)據(jù)源重載、手動調(diào)整時間等操作。

需求 命令
看總覽 chronyc tracking
看上游 chronyc sources -v
立即跳變(>0.1 s) chronyc makestep 0.1 -1
禁止步進(jìn)(只微調(diào)) chronyc maxupdateskew 100
重新加載上游 chronyc reload sources
統(tǒng)計漂移 chronyc sourcestats -v

需要注意的是chronyc不會直接把直接同步到硬件時間上,所以有這個需求的話,還是要結(jié)合hwclock來實現(xiàn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容