NTP (Network Time Protocol)
2019獨角獸企業重金招聘Python工程師標準>>>
- 地球共有24個時區,而以格林威治時間(GMT)為標準時間;
- 最準確的時間為使用原子鐘(Atomic clock)所計算的,例如 UTC(Coordinated Universal Time)就是一例。
- linux系統本來就有兩種時間,一種是linux 以 1920/01/01開始計數的系統時間,一種則是BIOS記載的硬件時間。 軟件時鐘: 由Linux 操作系統根據 1970/01/01 開始計算的總秒數; 硬件時鐘: 主機硬件系統上面的時鐘,例如BIOS記錄的時間;
- linux 可以透過網絡校時,最常見的網絡校時為使用NTP服務器,這個服務啟動在 udp port 123;
- NTP 服務器為一種階梯式的服務,所以NTP服務器本來就會與上層時間服務器時間的同步化,因此 nptd 與 ntpdate 兩個命令不可同時使用;
- NTP 服務器的聯機狀態可以使用 ntpstat 及 ntpq -p 來查詢。
查看NTP服務器是否與上層聯機。
[root@localhost ebin]# ntpstat synchronised to NTP server (120.25.115.20) at stratum 3time correct to within 79 mspolling server every 1024 s[root@localhost etc]# ntpq -premote refid st t when poll reach delay offset jitter ============================================================================== +darwin.kenyonra 255.83.201.76 2 u 93m 1024 340 267.338 5.893 9.263 *120.25.115.20 10.137.38.86 2 u 288 1024 377 31.105 -1.139 15.493 +120.25.115.19 10.137.38.86 2 u 1052 1024 377 32.006 -2.325 18.519 +mx.comglobalit. 200.98.196.212 2 u 306 1024 257 313.641 1.955 13.162- NTP 提供的客戶端軟件為 ntpdate 這個指令。
- 在 linux 下想要手動處理時間時, 需以 date 設定時間后,以 hwclock -w 來寫入 BIOS 所記錄的時間。
- NTP 服務器之間的時間誤差不可超過 1000 秒,否則 NTP服務會自動關閉。
NTP這個deamon是如何讓Server與Client同步他們的時間的呢?
NTP服務端的設置
關于權限設定部分:
權限的設定主要以restrict這個參數來設定,主要的語法為:
其中IP 可以是IP地址,也可以是default, default 就是指所有的IP
參數有一下幾個:
ignore: 關閉所有的NTP聯機服務。
nomodify: 客戶端不能更改服務器端的時間參數,但是客戶端可以通過服務端進行網校時。
notrust: 客戶端除非通過認證,否則該客戶端來源將被視為不信任子網。
noquery: 不提供客戶端的時間查詢。
注意: 如果參數沒有設定,那就表示該IP(或子網)沒有任何限制!
利用server 設定上層NTP服務器
上層NTP服務器的設定方式為:
在 server 端后可以接ip 或者主機名。 perfer 表示[優先使用]的服務器。
上級時間服務器的設定
由于我們配置的NTP服務器需要網絡上面比較準確的NTP服務器來更新自己的時間,所以在我們的NTP服務器上面需要配置一部上級時間服務器來進行校準!
用server這個參數設定上級時間服務器語法為:
server IP地址或域名[prefer]IP 地址或域名就是我們指定的上級時間服務器,如果Server參數最后加上 perfer,
表示我們的NTP服務器主要以該部主機時間進行校準。
以driftfile 記錄時間差異
設定的方式如下:
因為預設的NTP Server 本身的時間計算的依據 BIOS 的芯片震蕩周期頻率來計算的, 但是這個數值與上層 Time Server 不見得會一致啊! 所以NTP這個daemon(ntpd)會自動的去計算我們自己主機的頻率與上層 Time server 的頻率,并且將兩個頻率的誤差記錄下來,記錄下來的文件就是在 driftfile 后面接的完整文檔名當中了!
關于文檔:
- driftfile 后面接的文檔需要使用完整路徑文件名;
- 該文檔不能是連結檔;
- 該文檔需要設定成ntpd這個daemon 可以寫入的權限;
- 改文檔所記錄的數值單位為: 百萬分之一秒(ppm) driftfile 后面接的文檔會被ntpd自動更新,所以他的權限一定要能夠讓ntpd 寫入才行。
除了以restrict 來限制客戶端的聯機之外,我們也可以透過秘鑰系統來給客戶端認證。
如此一來可以讓主機端更放心。
與時間及NTP服務器設定相關的配置文件和重要數據文件有底下幾個:
-
/etc/ntp.conf : 就是NTP服務器的主要配置文件,也是唯一的一個;
-
/usr/share/zoneinfo/ 為各個時區的時間格式對應檔。
-
/etc/sysconfig/clock 設定時區與是否使用UTC時間鐘的配置文件。每次開機后linux會自動的讀取這個文件來設定 自己系統所默認要顯示的時間。
-
/etc/localtime : 這個文件是本地的時間配置文件,剛剛那個clock 文件里面規定了使用的時間配置文件, /usr/share/zoneinfo/Asia/Taipei,
至于在常用于時間服務器與修改時間的指定方面,主要有底下這幾個啦:
-
/bin/date: 用于linux 時間(軟件時鐘)的修改與顯示的指令。
-
/sbin/hwclock : 用于 BIOS時鐘(硬件時鐘)的修改與顯示的指令。 這是一個root才能執行的指令, 因為 linux 系統上面BIOS 時間與linux 系統時間是分開的,所以使用date這個指令調整了時間之后,還需要使用 hwclock 才能將修改過后的時間寫入BIOS當中。
-
/usr/sbin/ntpd: 主要提供NTP服務的程序, 配置文件為 /etc/ntp.conf
-
/usr/sbin/ntpdate : 用于客戶端的時間校正,如果你沒有要啟動NTP而僅想要使用 NTP client 功能的話, 那么只會用到這個指令而已啦!
NTP時間同步告警的采集
//獲取NTP時間服務狀態 //#define NTP_STAT_CHECK "ntpstat" //#define NTP_CONF_CHECK "grep 'prefer' -r /etc/ntp.conf" void CBusinessMsgPro::GetSyncState() {//獲取上報時間char pcCurTime[64] = {0};GetSysTime(pcCurTime);int nSyncState = 0; #ifdef _LINUX_PPC_nSyncState = 1;//ppc上不判斷時間同步,直接設置為正常狀態 #else//獲取時間同步狀態char achBuff[255];char achBuff1[255];memset(achBuff, 0, sizeof(achBuff));memset(achBuff1, 0, sizeof(achBuff1));FILE *fpStream = popen(NTP_STAT_CHECK, "r");if (NULL == fpStream){ADP_LOG(ADP_ERROR, "[GetSyncState] popen : %s error: %s\n", NTP_STAT_CHECK,strerror(errno));return;}fread(achBuff, sizeof(char), sizeof(achBuff), fpStream);pclose(fpStream);ADP_LOG(ADP_INFO, "[GetSyncState] NTP_STAT_CHECK state is : %s\n",achBuff);//獲取/etc/ntp.conf中的prefer ipfpStream = popen(NTP_CONF_CHECK, "r");if (NULL == fpStream){ADP_LOG(ADP_ERROR, "[GetSyncState] popen : %s error : %s\n", NTP_CONF_CHECK,strerror(errno));return;}fread(achBuff1, sizeof(char), sizeof(achBuff1), fpStream);pclose(fpStream);ADP_LOG(ADP_INFO, "[GetSyncState] NTP_CONF_CHECK state is : %s\n",achBuff1);//如果有同步成功的標識if ((NULL != strstr(achBuff, "synchronised")) && (NULL == strstr(achBuff, "unsynchronised"))){//判斷是否是同步localhost成功,如果是的話,查看/etc/ntp.conf中的prefer是否為127.0.0.1,如果不是,則也視為時間同步失敗if (NULL != strstr(achBuff, "synchronised to local net at")){if ((NULL != strstr(achBuff1, "127.0.0.1")) || (NULL != strstr(achBuff1, "localhost"))){nSyncState = 1;}}else{nSyncState = 1;}} #endif//上報時間同步狀態json_t * ptJsRoot = json_pack("{s:s, s:s, s:s, s:s, s:i}","devid", m_pServerInfo[emServTypePhysical]->m_achSrvGUID,"devtype", m_pServerInfo[emServTypePhysical]->m_achSrvType,"eventid", EV_SYSTIME_SYNC,//消息類型"rpttime", pcCurTime,"syncstate", nSyncState);//每個cpu核的詳細信息if (NULL == ptJsRoot){ADP_LOG(ADP_ERROR, "[GetSyncState] Json root pack failed!\n");return;}m_pServerInfo[emServTypePhysical]->SendMsg(ptJsRoot); }轉載于:https://my.oschina.net/lvhuizhenblog/blog/871090
總結
以上是生活随笔為你收集整理的NTP (Network Time Protocol)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: webapp开发学习--Ionic+Co
- 下一篇: c# 使用GDAL处理大图