linux ntp時間服務器配置

Network Time Protocol (NTP) 也是RHCE新增的考試要求. 學習的時候也順便複習了一下如何設置Linux的時間,如今拿出來和你們分享linux

設置NTP服務器不難可是NTP自己是一個很複雜的協議. 這裏只是簡要地介紹一下實踐方法
和上次同樣,下面的實驗都在RHEL5上運行windows

 

1. 時間和時區安全

若是有人問你說如今幾點? 你看了看錶回答他說晚上8點了. 這樣回答看上去沒有什麼問題,可是若是問你的這我的在歐洲的話那麼你的回答就會讓他很疑惑,由於他那裏還太陽當空呢.服務器

這裏就有產生了一個如何定義時間的問題. 由於在地球環繞太陽旋轉的24個小時中,世界各地日出日落的時間是不同的.因此咱們纔有劃分時區(timezone) 的必要,也就是把全球劃分紅24個不一樣的時區. 因此咱們能夠把時間的定義理解爲一個時間的值加上所在地的時區(注意這個所在地能夠精確到城市)網絡

地理課上咱們都學過格林威治時間(GMT), 它也就是0時區時間. 可是咱們在計算機中常常看到的是UTC. 它是Coordinated Universal Time的簡寫. 雖然能夠認爲UTC和GMT的值相等(偏差至關之小),可是UTC已經被認定爲是國際標準,因此咱們都應該遵照標準只使用UTCsocket

那麼假如如今中國當地的時間是晚上8點的話,咱們能夠有下面兩種表示方式
20:00 CST
12:00 UTCide

這裏的CST是Chinese Standard Time,也就是咱們一般所說的北京時間了. 由於中國處在UTC+8時區,依次類推那麼也就是12:00 UTC了.工具

爲何要說這些呢(呵呵這裏不是地理論壇吧...)學習

第一,無論經過任何渠道咱們想要同步系統的時間,一般提供方只會給出UTC+0的時間值而不會提供時區(由於它不知道你在哪裏).因此當咱們設置系統時間的時候,設置好時區是首先要作的工做
第二,不少國家都有夏令時(我記得小時候中國也實行過一次),那就是在一年當中的某一天時鐘撥快一小時(好比從UTC+8一下變成UTC+9了),那麼同理到時候還要再撥慢回來.若是咱們設置了正確的時區,當須要改變時間的時候系統就會自動替咱們調整測試

如今咱們就來看一下如何在Linux下設置時區,也就是time zone

 

2. 如何設置Linux Time 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在這裏面咱們就能夠找到本身所在城市的time zone文件. 那麼若是咱們想查看對於每一個time zone當前的時間咱們能夠用zdump命令
代碼:
# zdump Hongkong
Hongkong  Fri Jul  6 06:13:57 2007 HKT那麼咱們又怎麼來告訴系統咱們所在time zone是哪一個呢? 方法有不少,這裏舉出兩種

第一個就是修改/etc/localtime這個文件,這個文件定義了我麼所在的local time zone.
咱們能夠在/usr/share/zoneinfo下找到咱們的time zone文件而後拷貝去到/etc/localtimezone(或者作個symbolic link)

假設咱們如今的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來肯定time zone. 因此你想永久修改time zone的話那麼能夠把TZ變量的設置寫入/etc/profile裏

好了如今咱們知道怎麼設置時區了,下面咱們就來看看如何設置Linux的時間吧

 

3. Real Time Clock(RTC) and System Clock

說道設置時間這裏還要明確另一個概念就是在一臺計算機上咱們有兩個時鐘:一個稱之爲硬件時間時鐘(RTC),還有一個稱之爲系統時鐘(System Clock)

硬件時鐘是指嵌在主板上的特殊的電路, 它的存在就是平時咱們關機以後還能夠計算時間的緣由
系統時鐘就是操做系統的kernel所用來計算時間的時鐘. 它從1970年1月1日00:00:00 UTC時間到目前爲止秒數總和的值 在Linux下系統時間在開機的時候會和硬件時間同步(synchronization),以後也就各自獨立運行了

那麼既然兩個時鐘獨自運行,那麼時間久了必然就會產生偏差了,下面咱們來看一個例子
代碼:
# date
Fri Jul  6 00:27:13 BST 2007
# hwclock --show
Fri 06 Jul 2007 12:27:17 AM BST  -0.968931 seconds 
經過hwclock --show 命令咱們能夠查看機器上的硬件時間(always in local time zone), 咱們能夠看到它和系統時間仍是有必定的偏差的, 那麼咱們就須要把他們同步

若是咱們想要把硬件時間設置成系統時間咱們能夠運行如下命令
代碼:
# hwclock --hctosys  反之,咱們也能夠把系統時間設置成硬件時間
代碼:
# hwclock --systohc  那麼若是想設置硬件時間咱們能夠開機的時候在BIOS裏設定.也能夠用hwclock命令
代碼:
# hwclock --set --date="mm/dd/yy hh:mm:ss"  若是想要修改系統時間那麼用date命令就最簡單了
代碼:
# date -s "dd/mm/yyyy hh:mm:ss"  如今咱們知道了如何設置系統和硬件的時間. 但問題是若是這兩個時間都不許確了怎麼辦? 那麼咱們就須要在互聯網上找到一個能夠提供咱們準確時間的服務器而後經過一種協議來同步咱們的系統時間,那麼這個協議就是NTP了. 注意接下去咱們所要說的同步就都是指系統時間和網絡服務器之間的同步了


4. 設置NTP Server前的準備

其實這個標題應該改成設置"NTP Relay Server"前的準備更加合適. 由於不論咱們的計算機配置多好運行時間久了都會產生偏差,因此不足以給互聯網上的其餘服務器作NTP Server. 真正可以精確地測算時間的仍是原子鐘. 但因爲原子鐘十分的昂貴,只有少部分組織擁有, 他們鏈接到計算機以後就成了一臺真正的NTP Server. 而咱們所要作的就是鏈接到這些服務器上同步咱們系統的時間,而後把咱們本身的服務器作成NTP Relay Server再給互聯網或者是局域網內的用戶提供同步服務

好了,前面講了一大堆理論,如今咱們來動手實踐一下吧. 架設一個NTP Relay Server其實很是簡單,咱們先把須要的RPM包裝上
是否已經安裝了NTP包能夠用這條命令來肯定:

[root@NTPser ~]# rpm -qa | grep ntp
ntp-4.2.2p1-9.el5_4.1
chkfontpath-1.10.1-1.1
出現以上代碼則表示已安裝NTP包,不然用下面方法安裝:
代碼:

# rpm -ivh ntp-4.2.2p1-5.el5.rpm 
那麼第一步咱們就要找到在互聯網上給咱們提供同步服務的NTP Server

http://www.pool.ntp.org是NTP的官方網站,在這上面咱們能夠找到離咱們城市最近的NTP Server. NTP建議咱們爲了保障時間的準確性,最少找兩個個NTP Server
那麼好比在英國的話就能夠選擇下面兩個服務器
0.uk.pool.ntp.org
1.uk.pool.ntp.org

它的通常格式都是number.country.pool.ntp.org

第二步要作的就是在打開NTP服務器以前先和這些服務器作一個同步,使得咱們機器的時間儘可能接近標準時間. 
這裏咱們能夠用ntpdate命令手動更新時間
代碼:
# ntpdate 0.uk.pool.ntp.org
 6 Jul 01:21:49 ntpdate[4528]: step time server 213.222.193.35 offset -38908.575181 sec
# ntpdate 0.pool.ntp.org
 6 Jul 01:21:56 ntpdate[4530]: adjust time server 213.222.193.35 offset -0.000065 sec
假如你的時間差的很離譜的話第一次會看到調整的幅度比較大,因此保險起見能夠運行兩次. 那麼爲何在打開NTP服務以前先要手動運行同步呢? 
1. 由於根據NTP的設置,若是你的系統時間比正確時間要快的話那麼NTP是不會幫你調整的,因此要麼你把時間設置回去,要麼先作一個手動同步
2. 當你的時間設置和NTP服務器的時間相差很大的時候,NTP會花上較長一段時間進行調整.因此手動同步能夠減小這段時間

5. 配置和運行NTP Server

如今咱們就來建立NTP的配置文件了, 它就是/etc/ntp.conf. 咱們只須要加入上面的NTP Server和一個driftfile就能夠了
代碼:
# vi /etc/ntp.conf

server 210.72.145.44     #這是中國國家授時中心的IP
server 0.uk.pool.ntp.org
server 1.uk.pool.ntp.org
                                      
fudge 127.127.1.0 stratum 0  stratum  這行是時間服務器的層次。設爲0則爲頂級,若是要向別的NTP服務器更新時間,請不要把它設爲0

driftfile /var/lib/ntp/ntp.drift  很是的簡單. 接下來咱們就啓動NTP Server,而且設置其在開機後自動運行
代碼:
# /etc/init.d/ntpd start
# chkconfig --level 35 ntpd on

 

6. 查看NTP服務的運行情況

如今咱們已經啓動了NTP的服務,可是咱們的系統時間到底和服務器同步了沒有呢? 爲此NTP提供了一個很好的查看工具: ntpq (NTP query)

我建議你們在打開NTP服務器後就能夠運行ntpq命令來監測服務器的運行.這裏咱們可使用watch命令來查看一段時間內服務器各項數值的變化
代碼:
# watch ntpq -p
Every 2.0s: ntpq -p                                  Sat Jul  7 00:41:45 2007

     remote           refid      st t when poll reach   delay   offset  jitter
===========================================================
+193.60.199.75   193.62.22.98     2 u   52   64  377    8.578   10.203 289.032
*mozart.musicbox 192.5.41.41      2 u   54   64  377   19.301  -60.218 292.411

 

如今我就來解釋一下其中的含義

  remote: 它指的就是本地機器所鏈接的遠程NTP服務器
      refid: 它指的是給遠程服務器(e.g. 193.60.199.75)提供時間同步的服務器
          st: 遠程服務器的層級別(stratum). 因爲NTP是層型結構,有頂端的服務器,多層的Relay Server再到客戶端. 因此服務器從高到低級別能夠設定爲1-16. 爲了減緩負荷和網絡堵塞,原則上應該避免直接鏈接到級別爲1的服務器的.
            t: 這個.....我也不知道啥意思^_^
    when: 我我的把它理解爲一個計時器用來告訴咱們還有多久本地機器就須要和遠程服務器進行一次時間同步
       poll: 本地機和遠程服務器多少時間進行一次同步(單位爲秒). 在一開始運行NTP的時候這個poll值會比較小,那樣和服務器同步的頻率也就增長了,能夠儘快調整到正確的時間範圍.以後poll值會逐漸增大,同步的頻率也就會相應減少
    reach: 這是一個八進制值,用來測試可否和服務器鏈接.每成功鏈接一次它的值就會增長
    delay: 從本地機發送同步要求到服務器的round trip time
    offset: 這是個最關鍵的值, 它告訴了咱們本地機和服務器之間的時間差異. offset越接近於0,咱們就和服務器的時間越接近
     jitter: 這是一個用來作統計的值. 它統計了在特定個連續的鏈接數裏offset的分佈狀況. 簡單地說這個數值的絕對值越小咱們和服務器的時間就越精確

那麼你們細心的話就會發現兩個問題: 第一咱們鏈接的是0.uk.pool.ntp.org爲何和remote server不同? 第二那個最前面的+和*都是什麼意思呢?

第一個問題不難理解,由於NTP提供給咱們的是一個cluster server因此每次鏈接的獲得的服務器都有多是不同.一樣這也告訴咱們了在指定NTP Server的時候應該使用hostname而不是IP

第二個問題和第一個相關,既然有這麼多的服務器就是爲了在發生問題的時候其餘的服務器還能夠正常地給咱們提供服務.那麼如何知道這些服務器的狀態呢? 這就是第一個記號會告訴咱們的信息

* 它告訴咱們遠端的服務器已經被確認爲咱們的主NTP Server,咱們系統的時間將由這臺機器所提供
+ 它將做爲輔助的NTP Server和帶有*號的服務器一塊兒爲咱們提供同步服務. 當*號服務器不可用時它就能夠接管
- 遠程服務器被clustering algorithm認爲是不合格的NTP Server
x 遠程服務器不可用

 

瞭解這些以後咱們就能夠實時監測咱們系統的時間同步情況了

 

7. NTP安全設置

運行一個NTP Server不須要佔用不少的系統資源,因此也不用專門配置獨立的服務器,就能夠給許多client提供時間同步服務, 可是一些基本的安全設置仍是頗有必要的
那麼這裏一個很簡單的思路就是第一咱們只容許局域網內一部分的用戶鏈接到咱們的服務器. 第二個就是這些client不能修改咱們服務器上的時間

關於權限設定部分 
權限的設定主要以 restrict 這個參數來設定,主要的語法爲: 
restrict IP地址 mask 子網掩碼 參數 
其中 IP 能夠是IP地址,也能夠是 default ,default 就是指全部的IP 
參數有如下幾個: 
ignore :關閉全部的 NTP 聯機服務 
nomodify:客戶端不能更改服務端的時間參數,可是客戶端能夠經過服務端進行網絡校時。 
notrust :客戶端除非經過認證,不然該客戶端來源將被視爲不信任子網 
noquery :不提供客戶端的時間查詢 
注意:若是參數沒有設定,那就表示該 IP (或子網)沒有任何限制!

在/etc/ntp.conf文件中咱們能夠用restrict關鍵字來配置上面的要求

首先咱們對於默認的client拒絕全部的操做
代碼:
restrict default kod nomodify notrap nopeer noquery

而後容許本機地址一切的操做
代碼:
restrict 127.0.0.1

最後咱們容許局域網內全部client鏈接到這臺服務器同步時間.可是拒絕讓他們修改服務器上的時間
代碼:
restrict 192.168.1.0 mask 255.255.255.0 nomodify

把這三條加入到/etc/ntp.conf中就完成了咱們的簡單配置. NTP還能夠用key來作authentication,這裏就不詳細介紹了

 

8. NTP client的設置

作到這裏咱們已經有了一臺本身的Relay Server.若是咱們想讓局域網內的其餘client都進行時間同步的話那麼咱們就都應該照樣再搭建一臺Relay Server,而後把全部的client都指向這兩臺服務器(注意不要把全部的client都指向Internet上的服務器). 只要在client的/etc/ntp.conf加上這你本身的服務器就能夠了
代碼:
server ntp1.leonard.com
server ntp2.leonard.com

 

LINUX客戶端使用
ntpdate 172.30.218.114 
來向NTP服務器同步本身的時間
其它LINUX若是僅做爲只客戶端的話,則不能啓動ntpd服務!不然沒法運行ntpdata 服務器地址 來同步時間
以後可使用cron或修改crontab文件按期向NTP服務器更新時間,並用
# hwclock --systohc  
將系統時間設置爲硬件時間

9. 一些補充和拾遺(挺重要)

1. 配置文件中的driftfile是什麼?
咱們每個system clock的頻率都有小小的偏差,這個就是爲何機器運行一段時間後會不精確. NTP會自動來監測咱們時鐘的偏差值並予以調整.但問題是這是一個冗長的過程,因此它會把記錄下來的偏差先寫入driftfile.這樣即便你從新開機之後以前的計算結果也就不會丟失了

2. 如何同步硬件時鐘?
NTP通常只會同步system clock. 可是若是咱們也要同步RTC(hwclock)的話那麼只須要把下面的選項打開就能夠了
代碼:
# vi /etc/sysconfig/ntpd
SYNC_HWCLOCK=yes

 

三、利用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

crontab文件配置簡要說明
命令格式的前一部分是對時間的設定,後面一部分是要執行的命令。時間的設定咱們有必定的約定,前面五個*號表明五個數字,數字的取值範圍和含義以下:
分鐘 (0-59)
小時 (0-23)
日期 (1-31)
月份 (1-12)
星期 (0-6)//0表明星期天
除了數字還有幾個個特殊的符號就是「*」、「/」和「-」、「,」,「*」表明全部的取值範圍內的數字,「/」表明每的意思,「*/5」表示每5個單位,「-」表明從某個數字到某個數字,「,」分開幾個離散的數字。如下舉幾個例子說明問題:
天天早上6點:
0 6 * * *  command
每兩個小時:
0 */2 * * *  command
晚上11點到早上8點之間每兩個小時,早上八點:
0 23-7/2,8 * * * command
每月的4號和每一個禮拜的禮拜一到禮拜三的早上11點:
0 11 4 * 1-3 command 
1月1日早上4點:
0 4 1 1 * command

3.三、設置開機自動啓動服務
運行setup或其它服務設置工具,將crond服務勾選上 
chkconfig --level 2345 crond on  定義在這幾個系統運行級別上啓用crond (系統安裝完默認就是這個設置)
__________________________________________

 

10.NTP客戶端的設置

1、LINUX作爲客戶端自動同步時間
若是想定時進行時間校準,可使用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 系統就會自動的進行網絡時間校準。

 

2、WINDOWS 須要打開windows time服務和RPC的二個服務
若是在打開windows time 服務,時報 錯誤1058,進行下面操做 
1.運行 cmd 進入命令行,而後鍵入
w32tm /register  進行註冊
正確的響應爲:W32Time 成功註冊。

2.若是上一步正確,用 net start "windows time" 或 net start w32time 啓動服務。

 

11.其它形成沒法成功更新的緣由:一、客戶端的日期必需要設置正確,不能超出正常時間24小時,否則會由於安全緣由被拒絕更新。其次客戶端的時區必需要設置好,以確保不會更新成其它時區的時間。二、fudge 127.127.1.0 stratum 10 若是是LINUX作爲NTP服務器,stratum(層級)的值不能太大,若是要向上級NTP更新能夠設成2三、LINUX的NTP服務器必須記得將從上級NTP更新的時間從系統時間寫到硬件裏去 hwclock --systohc      NTP通常只會同步system clock. 可是若是咱們也要同步RTC(hwclock)的話那麼只須要把下面的選項打開就能夠了      代碼:      # vi /etc/sysconfig/ntpd      SYNC_HWCLOCK=yes四、Linux若是開啓了NTP服務,則不能手動運行ntpdate更新時間(會報端口被佔用),它只能根據/etc/ntp.conf 裏server 字段後的服務器地址按必定時間間隔自動向上級NTP服務器更新時間。能夠運行命令 ntpstat 查看每次更新間隔如:[root@ESXI ~]# ntpstatsynchronised 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輪詢更新一次時間 

相關文章
相關標籤/搜索