在 Linux 系統裡設定 NTP 服務並不難,但是 NTP 本身確是一個很複雜的協議. 你都瞭解細節麼?
1. 時間和時區
date 命令可顯示時間與市區
[root@T_PV1_DB ~]# date
Tue Feb  7 16:32:16 CST 2017
[root@T_PV1_DB ~]# cat /etc/sysconfig/clock
ZONE=”Asia/Shanghai”
CST=true
在地球環繞太陽旋轉的 24 個小時中, 世界各地日出日落的時間是不一樣的. 所以我們才有劃分時區 (timezone) 的必要, 也就是把全球劃分成 24 個不同的時區. 所以我們可以把時間的定義理解為一個時間的值加上所在地的時區 (注意這個所在地可以精確到城市)
格林威治時間 (GMT), 它也就是 0 時區時間. 但是我們在計算機中經常看到的是 UTC. 它是 Coordinated Universal Time 的簡寫. 雖然可以認為 UTC 和 GMT 的值相等 (誤差相當之小), 但是 UTC 已經被認定為是國際標準, 所以我們都應該遵守標準只使用 UTC
那麼假如現在中國當地的時間是晚上 8 點的話, 我們可以有下面兩種表示方式
20:00 CST
12:00 UTC
這裡的 CST 是 Chinese Standard Time, 也就是我們通常所說的北京時間了. 因為中國處在 UTC+8 時區
如果時區設定錯了,你看到的日誌時間也不正確了。
補充:
CST 同時可以代表如下 4 個不同的時區:
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
可見,CST 可以同時表示美國,澳大利亞,中國,古巴四個國家的標準時間。
2 、 ntp 的配置
#cat  /etc/ntp.conf

restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 11.107.13.100                         //允許該 NTP 站群伺服器進入
restrict 11.80.81.1                            //沒有任何何引數的話,這表示『該 IP 或網段不受任何限制』
restrict 202.112.1.199
restrict 127.0.0.1
restrict -6 ::1
restrict 192.168.0.0 mask 255.255.0.0 nomodify  //該網段可以進行校時
restrict 0.0.0.0 mask 0.0.0.0 notrust           //拒絕沒有認證的使用者端
server time-nw.nist.gov prefer                  //prefer 該站群伺服器優先
server 0.rhel.pool.ntp.org  iburst        //設定時間站群伺服器
server 1.rhel.pool.ntp.org  iburst
server 2.rhel.pool.ntp.org  iburst
fudge   127.127.1.0 stratum 6
driftfile /var/lib/ntp/drift
keys /etc/ntp/keys
broadcastdelay 0.008

上邊只是簡單設定,沒有考慮安全方面如認證等等。
許可權管理使用 restrict 公式如下:
restrict IP mask [引數] / restrict 192.168.0.0 mask 255.255.0.0 nomodify
其中引數主要有底下這些:
* ignore:拒絕所有型別的 NTP 的連線;
* nomodfiy:使用者端不能使用 NTPC 與 ntpq 這兩支程式來修改站群伺服器的時間引數,但使用者端仍可透過這部 WordPress 主機來進行網際網路校時的;
* noquery:使用者端不能夠使用 ntpq,NTPC 等指令來查詢發表站群伺服器,等於不提供的 NTP 的網際網路校時冪;
* notrap:不提供陷阱這個遠端事件郵箱(遠端事件日誌)的功能。
* notrust:拒絕沒有認證的使用者端。

配置檔案中的 driftfile 是什麼?
我們每一個 system clock 的頻率都有小小的誤差, 這個就是為什麼機器執行一段時間後會不精確. NTP 會自動來監測我們時鐘的誤差值並予以調整. 但問題是這是一個冗長的過程, 所以它會把記錄下來的誤差先寫入 driftfile. 這樣即使你重新開機以後之前的計算結果也就不會丟失了。
 
最後,別忘了啟動 NTP 站群伺服器
/etc/init.d/ntp start
[root@localhost ~]# chkconfig ntpd on #在執行級別 2 、 3 、 4 、 5 上設定為自動執行
[root@localhost ~]# chkconfig –list ntpd
ntpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
 
檢視 ntp 站群伺服器有無和上層 ntp 連通
 
[root@localhost ~]# ntpstat
synchronised to NTP server (192.168.7.49) at stratum 6
   time correct to within 440 ms
   polling server every 128 s
[root@localhost ~]#
檢視 ntp 站群伺服器與上層 ntp 的狀態
[root@localhost ~]# watch ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 192.168.7.49    192.168.7.50     5 u   13   64    3    5.853  1137178   2.696
3 、 ntpd 的配置
配置/etc/sysconfig/ntpd 檔案
ntp 服務,預設只會同步系統時間。如果想要讓 ntp 同時同步硬體時間,可以設定/etc/sysconfig/ntpd 檔案,在/etc/sysconfig/ntpd 檔案中,新增 SYNC_HWCLOCK=yes 這樣,就可以讓硬體時間與系統時間一起同步。
#允許 BIOS 與系統時間同步,也可以透過 hwclock -w 命令
SYNC_HWCLOCK=yes
# Drop root to id ‘ntp:ntp’ by default.
OPTIONS=”-x -u ntp:ntp -p /var/run/ntpd.pid -g”
有時會在 messages 日誌裡看到 NTP 程式正在做 DELETING 動作,不過 NTP 程式並不會真正刪除虛擬網際網路介面,但這個動作會造成網際網路短暫不通。紅帽官方有個對應的解決辦法是:
就是在這個檔案裡增加-L 引數。
還有-x 和-g 引數:
ntpd 服務的方式,又有兩種策略,一種是平滑、緩慢的漸進式調整(adjusts the clock in small steps 所謂的微調);一種是步進式調整(跳躍式調整)。兩種策略的區別就在於,微調方式在啟動 NTP 服務時加了個 “-x” 的引數,而預設的是不加 “-x” 引數。
 
假如使用了-x 選項,那麼 ntpd 只做微調,不跳躍調整時間,但是要注意,-x 引數的負作用:當時鐘差大的時候,同步時間將花費很長的時間。-x 也有一個閾值,就是 600s,當系統時鐘與標準時間差距大於 600s 時,ntpd 會使用較大 “步進值” 的方式來調整時間,將時鐘 “步進” 調整到正確時間。
 
假如不使用-x 選項,那麼 ntpd 在時鐘差距小於 128ms 時,使用微調方式調整時間,當時差大於 128ms 時,使用 “跳躍” 式調整。
 
這兩種方式都會在本地時鐘與遠端的 NTP 站群伺服器時鐘相差大於 1000s 時,ntpd 會停止工作。在啟動 NTP 時加了引數 “-g” 就可以忽略 1000S 的問題。
4 、時間同步
利用 crontab 可以讓 LINUX NTP 定時更新時間
注:讓 linux 執行 ntpdate 更新時間時,linux 不能開啟 NTP 服務,否則會提示埠被佔用:如下
[root@ESXI ~]# ntpdate 1.rhel.pool.ntp.org
20 May 09:34:14 ntpdate[6747]: the NTP socket is in use, exiting
如果想定時進行時間校準,可以使用 crond 服務來定時執行。
編輯 /etc/crontab 檔案
加入下面一行:
30 8 * * * root /usr/sbin/ntpdate 192.168.0.1; /sbin/hwclock -w    #192.168.0.1 是 NTP 站群伺服器的 IP 地址
然後重啟 crond 服務
service crond restart
這樣,每天 8:30 Linux 系統就會自動的進行網際網路時間校準。
如果是 WINDOWS ,則需要開啟 windows time 服務和 RPC 的二個服務
如果在開啟 windows time 服務,時報 錯誤 1058,進行下面操作
1. 執行 cmd 進入命令列,然後鍵入
w32tm /register  進行註冊
正確的響應為:W32Time 成功註冊。
2. 如果上一步正確,用 net start “windows time” 或 net start w32time 啟動服務。
 
5 、 Linux 的硬體時間
Linux 硬體時間的設定
硬體時間的設定,可以用 hwclock 或者 clock 命令。其中,clock 和 hwclock 用法相近,只用一個就 行,只不過 clock 命令除了支援 x86 硬體體系外,還支援 Alpha 硬體體系。
//檢視硬體時間 可以是用 hwclock ,hwclock –show 或者 hwclock -r
[root@localhost ~]# hwclock –show
2008 年 12 月 12 日 星期五 06 時 52 分 07 秒  -0.376932 seconds
//設定硬體時間
[root@localhost ~]# hwclock –set –date=”1/25/09 00:00″ <== 月/日/年時: 分: 秒 [root@localhost ~]# hwclock 2009年01月25日 星期日 00時00分06秒  -0.870868 seconds 幾個引數和命令: ntpq -p顯示結果中的offset 本地時間+offset=遠端時間, 因此如果offset為負數, 則本地時鐘比遠端快. offset值0-500,接近0是正常的。 執行ntpq -c asso, 如果顯示sys.peer則已經處於同步狀態了. 使用以下命令檢查ntp的版本: # ntpq -c version 錯誤問題處理 用於收集安裝,配置和應用中出現的問題 錯誤1:ntpdate -u ip -> no server suitable for synchronization found
判斷:在 ntp 客戶端用 ntpdate –d serverIP 檢視,發現有 “Server dropped: strata too high” 的錯誤,並且顯示 “stratum 16” 。而正常情況下 stratum 這個值得範圍是 “0~15” 。
原因:NTP server 還沒有和其自身或者它的 server 同步上。在 ntp server 上重新啟動 ntp 服務後,ntp server 自身或者與其 server 的同步的需要一個時間段,這個過程可能是 5 分鐘,在這個時間之內在客戶端執行 ntpdate 命令時會產生 no server suitable for synchronization found 的錯誤。
處理:等待幾分鐘後,重試一般解決。
其它造成無法成功更新的原因:
1 、客戶端的日期必須要設定正確,不能超出正常時間 24 小時,不然會因為安全原因被拒絕更新。其次客戶端的時區必須要設定好,以確保不會更新成其它時區的時間。
2 、 fudge 127.127.1.0 stratum 10 如果是 LINUX 做為 NTP 站群伺服器,stratum(層級) 的值不能太大,如果要向上級 NTP 更新可以設成 2
3 、 LINUX 的 NTP 站群伺服器必須記得將從上級 NTP 更新的時間從系統時間寫到硬體裡去 hwclock –systohc
NTP 一般只會同步 system clock. 但是如果我們也要同步 RTC(hwclock) 的話那麼只需要把下面的選項開啟就可以了
程式碼:
# vi /etc/sysconfig/ntpd
SYNC_HWCLOCK=yes
4 、 Linux 如果開啟了 NTP 服務,則不能手動執行 ntpdate 更新時間(會報埠被佔用),它只能根據/etc/ntp.conf 裡 server 欄位後的站群伺服器地址按一定時間間隔自動向上級 NTP 站群伺服器更新時間。可以執行命令 ntpstat 檢視每次更新間隔如:
[root@ESXI ~]# ntpstat
synchronised to NTP server (210.72.145.44) at stratum 2    #本 NTP 站群伺服器層次為 2,已向 210.72.145.44 NTP 同步過
time correct to within 93 ms                                 #時間校正到相差 93ms 之內
polling server every 1024 s                                  #每 1024 秒會向上級 NTP 輪詢更新一次時間
補充:
ntpd 、 ntpdate 的區別
下面是網上關於 ntpd 與 ntpdate 區別的相關資料。如下所示所示:
使用之前得弄清楚一個問題,ntpd 與 ntpdate 在更新時間時有什麼區別。 ntpd 不僅僅是時間同步站群伺服器,它還可以做客戶端與標準時間站群伺服器進行同步時間,而且是平滑同步,並非 ntpdate 立即同步,在生產環境中慎用 ntpdate,也正如此兩者不可同時執行。
時鐘的躍變,對於某些程式會導致很嚴重的問題。許多應用程式依賴連續的時鐘——畢竟,這是一項常見的假定,即,取得的時間是線性的,一些操作,例如資料庫事務,通常會地依賴這樣的事實:時間不會往回跳躍。不幸的是,ntpdate 調整時間的方式就是我們所說的” 躍變 “:在獲得一個時間之後,ntpdate 使用 settimeofday(2) 設定系統時間,這有幾個非常明顯的問題:
第一,這樣做不安全。 ntpdate 的設定依賴於 ntp 站群伺服器的安全性,攻擊者可以利用一些站群軟體設計上的缺陷,拿下 ntp 站群伺服器並令與其同步的站群伺服器執行某些消耗性的任務。由於 ntpdate 採用的方式是跳變,跟隨它的站群伺服器無法知道是否發生了異常(時間不一樣的時候,唯一的辦法是以站群伺服器為準)。
第二,這樣做不精確。一旦 ntp 站群伺服器宕機,跟隨它的站群伺服器也就會無法同步時間。與此不同,ntpd 不僅能夠校準計算機的時間,而且能夠校準計算機的時鐘。
第三,這樣做不夠優雅。由於是跳變,而不是使時間變快或變慢,依賴時序的程式會出錯(例如,如果 ntpdate 發現你的時間快了,則可能會經歷兩個相同的時刻,對某些應用而言,這是致命的)。因而,唯一一個可以令時間發生跳變的點,是計算機剛剛啟動,但還沒有啟動很多服務的那個時候。其餘的時候,理想的做法是使用 ntpd 來校準時鐘,而不是調整計算機時鐘上的時間。
NTPD 在和時間站群伺服器的同步過程中,會把 BIOS 計時器的振盪頻率偏差——或者說 Local Clock 的自然漂移 (drift)——記錄下來。這樣即使網際網路有問題,本機仍然能維持一個相當精確的走時。
ntpq –p 引數詳解
ntpq -p
remote           refid               st     t when  poll  reach     delay     offset     jitter
==================================================================
*10.247.160.31 10.240.241.5     4     u 53      64   377     0.240     0.374     0.240
remote:響應這個請求的 NTP 站群伺服器的名稱。
refid:NTP 站群伺服器使用的上一級 ntp 站群伺服器。
st :remote 遠端站群伺服器的級別. 由於 NTP 是層型結構, 有頂端的站群伺服器, 多層的 Relay Server 再到客戶端. 所以站群伺服器從高到低階別可以設定為 1-16. 為了減緩負荷和網際網路堵塞, 原則上應該避免直接連線到級別為 1 的站群伺服器的.
when: 上一次成功請求之後到現在的秒數。
poll : 本地機和遠端站群伺服器多少時間進行一次同步 (單位為秒). 在一開始執行 NTP 的時候這個 poll 值會比較小, 那樣和站群伺服器同步的頻率也就增加了, 可以儘快調整到正確的時間範圍,之後 poll 值會逐漸增大, 同步的頻率也就會相應減小
reach: 這是一個八進位制值, 用來測試能否和站群伺服器連線. 每成功連線一次它的值就會增加
delay: 從本地機傳送同步要求到 ntp 站群伺服器的 round trip time
offset:WordPress 主機透過 NTP 時鐘同步與所同步時間源的時間偏移量,單位為毫秒(ms)。 offset 越接近於 0,WordPress 主機和 ntp 站群伺服器的時間越接近
jitter: 這是一個用來做統計的值. 它統計了在特定個連續的連線數里 offset 的分佈情況. 簡單地說這個數值的絕對值越小,WordPress 主機的時間就越精確
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-03/141435.htm