關於ntp時間同步理論及配置引數20170804
[原創]關於ntp時間同步理論及配置引數20170804
前言
NTP(Network Time Protocol,網路時間協議)是用來使網路中的各個計算機時間同步的一種協議。無論是平時使用的私人計算機還是在工作中搭建的伺服器叢集,時間的統一性和準確性是十分重要的。它是用來同步網路中各個計算機的時間的協議。
在計算機的世界裡,時間非常地重要,例如對於火箭發射這種科研活動,對時間的統一性和準確性要求就非常地高,是按照A這臺計算機的時間,還是按照B這臺計算機的時間?NTP就是用來解決這個問題的,NTP(Network
TimeProtocol,網路時間協議)是用來使網路中的各個計算機時間同步的一種協議。它的用途是把計算機的時鐘同步到世界協調時
它可以使計算機對其伺服器或時鐘源(如石英鐘,GPS等等)進行時間同步,它可以提供高精準度的時間校正,而且可以使用加密確認的方式來防止惡毒的協議攻擊。
0層的伺服器採用的是原子鐘、GPS鍾等物理裝置,stratum
1與stratum 0 是直接相連的,往後的stratum與上一層stratum通過網路相連,同一層的server也可以互動。
1、C/S合一
ntpd對下層client來說是serviceserver,對於上層server來說它是client,也就是說新版的NTP服務程式已經不對服務端和客戶端進行區分了,統一叫做
2、NTP客戶端同步間隔
NTP服務會間隔多長時間想時鐘伺服器請求一次時鐘同步呢?預設最小時間間隔為64s,預設最大時間間隔是1024s(17分鐘左右)。64s是比較合理的,預設間隔也是可調的(Notethat
most device drivers will not operate properly if the poll interval is lessthan 64 s and that the broadcast server and manycast client associations willalso use the default, unless overridden.
3、容忍誤差範圍
NTP服務並不是在任何情況下都會進行同步的。當時鍾伺服器時間和本地時間相差大於1000s時,NTP服務就會認為是人為調整了時鐘或出現了硬體故障,例如CMOS電池損壞等。此時,NTP服務就會退出,需要人工(ntpdate…)進行時鐘同步。
採用-g選項可以讓ntpd忽略1000s或更大誤差,設定時鐘到serversystem time, 但是ntpd還是會因此退出。
4、層次(strata)
stratum根據上層server的層次而設定(+1)。
對於提供network time service provider的主機來說,stratum的設定要儘可能準確。
而作為區域網的time service provider,通常將stratum設定為10 (Stratum 10 is conventional for unsynchronized local clocks; it ishigh enough that nobody is likely to mistake it for a desirable clock tosynchronize with.),
如下:
server 127.127.1.0 # localclockfudge 127.127.1.0 stratum 10#stratum設定為其它值也是可以的,其範圍為0~15
二、設定與啟動
檔案路徑:/etc/ntp.conf
# 1. 先處理許可權方面的問題,包括放行上層伺服器以及開放區域網使用者來源:
restrict default kod nomodify notrap nopeernoquery <==拒絕 IPv4 的使用者
restrict -6 default kod nomodify notrapnopeer noquery <==拒絕 IPv6 的使用者
restrict 220.130.158.71 <==放行tock.stdtime.gov.tw 進入本 NTP 的伺服器
restrict 59.124.196.83 <==放行tick.stdtime.gov.tw 進入本 NTP 的伺服器
restrict 59.124.196.84 <==放行time.stdtime.gov.tw 進入本 NTP 的伺服器
restrict 127.0.0.1 <==底下兩個是預設值,放行本機來源
restrict -6 ::1restrict 192.168.100.0 mask255.255.255.0 nomodify <==放行區域網使用者來源,或者列出單獨IP
# 2. 設定主機來源,請先將原本的[0|1|2].centos.pool.ntp.org 的設定批註掉:
server 220.130.158.71 prefer <==以這部主機為最優先的server
server 59.124.196.83
server 59.124.196.84
# 3.預設的一個內部時鐘資料,用在沒有外部NTP 伺服器時,使用它為區域網使用者提供服務:
# server 127.127.1.0 # local clock#fudge 127.127.1.0 stratum 10
# 4.預設時間差異分析檔案與暫不用到的 keys等,不需要更動它:
driftfile /var/lib/ntp/driftkeys /etc/ntp/keys
引數設定檔案路徑:/etc/sysconfig/ntpd
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid" SYNC_HWCLOCK=yes# 將他改成 yes 吧!這樣 BIOS 的時間也會跟著改變的!
設定NTP伺服器不難但是NTP本身是一個很複雜的協議.
1. 時間和時區
如果有人問你說現在幾點? 你看了看錶回答他說晚上8點了. 這樣回答看上去沒有什麼問題,但是如果問你的這個人在歐洲的話那麼你的回答就會讓他很疑惑,因為他那裡還太陽當空呢.
這裡就有產生了一個如何定義時間的問題. 因為在地球環繞太陽旋轉的24個小時中,世界各地日出日落的時間是不一樣的.所以我們才有劃分時區(timezone)的必要,也就是把全球劃分成24個不同的時區. 所以我們可以把時間的定義理解為一個時間的值加上所在地的時區(注意這個所在地可以精確到城市)
地理課上我們都學過格林威治時間(GMT), 它也就是0時區時間. 但是我們在計算機中經常看到的是UTC.它是CoordinatedUniversal Time的簡寫.雖然可以認為UTC和GMT的值相等(誤差相當之小),但是UTC已經被認定為是國際標準,所以我們都應該遵守標準只使用UTC
那麼假如現在中國當地的時間是晚上8點的話,我們可以有下面兩種表示方式
20:00 CST
12:00 UTC
這裡的CST是Chinese Standard Time,也就是我們通常所說的北京時間了.因為中國處在UTC+8時區,依次類推那麼也就是12:00 UTC了.
為什麼要說這些呢(呵呵這裡不是地理論壇吧...)
第一,不管通過任何渠道我們想要同步系統的時間,通常提供方只會給出UTC+0的時間值而不會提供時區(因為它不知道你在哪裡).所以當我們設定系統時間的時候,設定好時區是首先要做的工作第二,很多國家都有夏令時(我記得小時候中國也實行過一次),那就是在一年當中的某一天時鐘撥快一小時(比如從UTC+8一下變成UTC+9了),那麼同理到時候還要再撥慢回來.如果我們設定了正確的時區,當需要改變時間的時候系統就會自動替我們調整
現在我們就來看一下如何在linux下設定時區,也就是time zone
2. 如何設定LinuxTime Zone
在Linux下glibc提供了我們事先編譯好的許多timezone檔案, 他們就放在/usr/share/zoneinfo這個目錄下,這裡基本涵蓋了大部分的國家和城市程式碼:
# ls -F /usr/share/zoneinfo/
Africa/ Chile/ Factory Iceland Mexico/ posix/ Universal
America/ CST6CDT GB Indian/ Mideast/ posixrules US/
Antarctica/ Cuba GB-Eire Iran MST PRC UTC
Arctic/ EET GMT iso3166.tab MST7MDT PST8PDT WET
Asia/ Egypt GMT0 Israel Navajo right/ W-SU
Atlantic/ Eire GMT-0 Jamaica NZ ROC zone.tab
Australia/ EST GMT+0 Japan NZ-CHAT ROK Zulu
Brazil/ EST5EDT Greenwich Kwajalein Pacific/ Singapore
Canada/ Etc/ Hongkong Libya Poland Turkey
CET Europe/ HST MET Portugal UCT在這裡面我們就可以找到自己所在城市的timezone檔案.那麼如果我們想檢視對於每個timezone當前的時間我們可以用zdump命令程式碼:
# zdump Hongkong
Hongkong Fri Jul 6 06:13:57 2007 HKT那麼我們又怎麼來告訴系統我們所在timezone是哪個呢?方法有很多,這裡舉出兩種
第一個就是修改/etc/localtime這個檔案,這個檔案定義了我麼所在的localtime
zone.
我們可以在/usr/share/zoneinfo下找到我們的time
zone檔案然後拷貝去到/etc/localtimezone(或者做個symboliclink)
假設我們現在的time zone是BST(也就是英國的夏令時間,UTC+1)
程式碼:
# date
Thu Jul 5 23:33:40 BST 2007我們想把time zone換成上海所在的時區就可以這麼做程式碼:
# ln -sf /usr/share/zoneinfo/posix/Asia/Shanghai/etc/localtime
# date
Fri Jul 6 06:35:52 CST 2007
這樣時區就改過來了(注意時間也做了相應的調整)
第二種方法也就設定TZ環境變數的值. 許多程式和命令都會用到這個變數的值.
TZ的值可以有多種格式,最簡單的設定方法就是使用tzselect命令程式碼:
# tzselect
...
TZ='America/Los_Angeles';export TZtzselect
會讓你選擇所在的國家和城市(我省略了這些步驟),最後輸出相應的TZ變數的值.那麼如果你設定了TZ的值之後時區就又會發生變化
程式碼:
# date
Thu Jul 5 15:48:11 PDT 2007
通過這兩個例子我們也可以發現TZ變數的值會override/etc/localtime. 也就是說當TZ變數沒有定義的時候系統才使用/etc/localtime來確定timezone. 所以你想永久修改timezone的話那麼可以把TZ變數的設定寫入/etc/profile裡
好了現在我們知道怎麼設定時區了,下面我們就來看看如何設定Linux的時間吧