1. 程式人生 > >關於ntp時間同步理論及配置引數20170804

關於ntp時間同步理論及配置引數20170804

[原創]關於ntp時間同步理論及配置引數20170804

前言

NTPNetwork Time Protocol,網路時間協議)是用來使網路中的各個計算機時間同步的一種協議。無論是平時使用的私人計算機還是在工作中搭建的伺服器叢集,時間的統一性和準確性是十分重要的它是用來同步網路中各個計算機的時間的協議。

在計算機的世界裡,時間非常地重要,例如對於火箭發射這種科研活動,對時間的統一性和準確性要求就非常地高,是按照A這臺計算機的時間,還是按照B這臺計算機的時間?NTP就是用來解決這個問題的,NTP(Network TimeProtocol,網路時間協議)是用來使網路中的各個計算機時間同步的一種協議。它的用途是把計算機的時鐘同步到世界協調時

UTC,其精度在區域網內可達0.1ms,在網際網路上絕大多數的地方其精度可以達到1-50ms

它可以使計算機對其伺服器或時鐘源(如石英鐘,GPS等等)進行時間同步,它可以提供高精準度的時間校正,而且可以使用加密確認的方式來防止惡毒的協議攻擊。

0層的伺服器採用的是原子鐘、GPS鍾等物理裝置,stratum 1stratum 0 是直接相連的,往後的stratum與上一層stratum通過網路相連,同一層的server也可以互動。

1C/S合一

ntpd對下層client來說是serviceserver,對於上層server來說它是client,也就是說新版的NTP服務程式已經不對服務端和客戶端進行區分了,統一叫做

ntpdntpd根據配置檔案的引數決定是要為其他伺服器提供時鐘服務或者是從其他伺服器同步時鐘。所有的配置都在/etc/ntp.conf檔案中。

2NTP客戶端同步間隔

NTP服務會間隔多長時間想時鐘伺服器請求一次時鐘同步呢?預設最小時間間隔為64s,預設最大時間間隔是1024s17分鐘左右)。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的簡寫.雖然可以認為UTCGMT的值相等(誤差相當之小),但是UTC已經被認定為是國際標準,所以我們都應該遵守標準只使用UTC

那麼假如現在中國當地的時間是晚上8點的話,我們可以有下面兩種表示方式
20:00 CST
12:00 UTC

這裡的CSTChinese Standard Time,也就是我們通常所說的北京時間了.因為中國處在UTC+8時區,依次類推那麼也就是12:00 UTC.

為什麼要說這些呢(呵呵這裡不是地理論壇吧...)

第一,不管通過任何渠道我們想要同步系統的時間,通常提供方只會給出UTC+0的時間值而不會提供時區(因為它不知道你在哪裡).所以當我們設定系統時間的時候,設定好時區是首先要做的工作第二,很多國家都有夏令時(我記得小時候中國也實行過一次),那就是在一年當中的某一天時鐘撥快一小時(比如從UTC+8一下變成UTC+9),那麼同理到時候還要再撥慢回來.如果我們設定了正確的時區,當需要改變時間的時候系統就會自動替我們調整

現在我們就來看一下如何在linux下設定時區,也就是time zone

2. 如何設定LinuxTime Zone

Linuxglibc提供了我們事先編譯好的許多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 zoneBST(也就是英國的夏令時間,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的時間吧