伺服器架設篇 - RedHat 9

第二十七章、簡易 NTP 伺服器

Network Time Protocol 就是 NTP 的全名。NTP 主機主要在提供網路上可以進行網路校時的主機功能!

最近更新時間: 2003/08/21

本文資料主要針對 RedHat 9 的系統進行說明,要注意的是,RedHat 9 與 Red Hat Enterprise Linux (RHEL) 是完全不同的東西!RedHat 9 在 2003 年推出,在 2004 年就不再維護了!這部份網站更新到 2005 年,也沒有再維護過! 因此,建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 RedHat 9 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!
很多時候由於電腦硬體的問題,所以我們都會調整一下時間,好讓電腦系統的時間可以一直保持正確的狀態。而既然要調整時間,那麼自然就會有一個讓我們可以對照著來調整時間的『準確時間』咯!在實際生活中,我們可以透過電視台、廣播電台、電話等等來調整我們的手錶,那麼如果是在網路上呢?該如何讓我們的主機隨時保持正確的時間資訊?!另外,整個地球被切分成為 24 個時區,那麼什麼是GMT(格林威治時間),我們所在的時區又是哪一區呢?!讓我們來簡單的談一談吧!

原理

    『時間』對於現在人來說,是很重要的!因為時間就是金錢啊!在 Internet 上面,時間同樣也是挺重要的!有些電腦需要時間同步才能夠正常的運作哩!所以說,時間真的是挺重要的!在開始 NTP 伺服器的介紹之前,我們先來簡單的談一談關於『時區』的概念吧!
     

    什麼是時區?全球有多少時區
     
    因為地球是圓的,所以同一個時刻,在地球的一邊是白天,一邊是黑夜。而因為人類使用一天 24 小時的制度,所以,在地球對角的兩邊就應該差了 12 的小時才對。由於同一個時間點上面,整個地球的時間應該都不一樣,為了解決這個問題,所以可以想見的,地球就被分成 24 個時區了!
     
    那麼這 24 個時區是依據什麼來劃分的呢?由於地球被人類以『經緯度』座標來進行定位,而經度為零的地點在英國『格林威治』這個城市所在縱剖面上,(註:所謂的縱剖面就是由南極切到北極的直線,而橫切面就是與赤道平行的切線),如下圖所示:
     
     
    因為繞地球一圈是 360 度角,這 360 度角共分為 24 個時區,當然一個時區就是 15 度角啦!又由於是以格林威治時間為標準時間(Greenwich Mean Time, GMT 時間)加上地球自轉的關係,因此,在格林威治以東的區域時間是比較快的(+小時),而以西的地方當然就是較慢囉!以台灣為例,因為台灣所在地為 120 這個東經度,又因為台灣在格林威治的東方 ( 廢話!因為是東經嘛! ^_^),因此,台灣本地時間 (local time) 會比 GMT 時間快 8 小時 (GMT + 8)。當格林威治時間為零點,台灣就已經是早上八點了!底下列出各個時區的名稱與所在經度,以及與 GMT 時間的時差:
     
    標準時區
    經度
    時差
    GMT , Greenwich Mean Time 0   W/E 標準時間
    CET , Central European 15  E +1  東一區
    EET , Eastern European 30  E +2  東二區
    BT  , Baghdad 45  E +3  東三區
    USSR, Zone 3  60  E +4  東四區
    USSR, Zone 4 75  E +5  東五區
    Indian, First 82.3E +5.5東五半區
    USSR, Zone 5 90  E +6  東六區
    SST , South Sumatra 105 E +7  東七區
    JT  , Java 112 E +7.5東七半區
    CCT , China Coast (台灣所在地) 120 E +8  東八區
    JST , Japan 135 E +9  東九區
    SAST, South Australia 142 E +9.5東九半區
    GST , Guam 150 E +10 東十區
    NZT , New Zealand 180 E +12 東十二區
    Int'l Date Line 180 E/W 國際換日線
    BST , Bering 165 W -11 西十一區
    SHST, Alaska/Hawaiian 150 W -10 西十區
    YST , Yukon 135 W -9  西九區
    PST , Pacific 120 W -8  西八區
    MST , Mountain 105 W -7  西七區
    CST , Central 90  W -6  西六區
    EST , Eastern 75  W -5  西五區
    AST , Atlantic 60  W -4  西四區
    Brazil, Zone 2 45  W -3  西三區
    AT  , Azores 30  W -2  西二區
    WAT , West Africa 15  W -1  西一區
     
    所以囉!台灣時間是 GMT + 8 就很容易推算出來了吧!要特別留意的是,很多朋友在安裝 Linux 的時候,總是會發現目前的時間慢或者快了 8 小時,不要懷疑,絕對與時區有關!趕緊給他查一下如何調整時區吧! ^_^。另外,在上表中有個比較有趣的時區,那就是在太平洋上面的國際換日線了!我們剛剛說,在格林威治的東邊時間會較快,而在西邊時間會較慢,但是兩邊各走了 180 度之後,就會碰頭啊!那不就剛好差了 24 小時嗎?!沒錯啦!所以才訂定為『國際換日線』啊!國際換日線剛好在太平洋上面,因此,如果您有坐飛機到美國的經驗,應該會發現,咦!怎麼出發的時間是星期六下午,坐了 13 個小時的飛機到了美國還是星期六?!因為剛好通過了國際換日線,日期減少了一天喔!如果反過來,由美國到台灣,日期就會多加一天喔! ^_^
     

    什麼是夏季節約時間(daylight savings)?
     
    除了時區的概念先建立起來之後,現在再來談一談,那麼什麼是『夏季節約時間』?既然是『夏季節約時間』當然主要是與夏天有關啦!因為地球在運行的時候是呈現一個傾斜角在繞太陽運轉的,所以才有春夏秋冬(這個大家應該都知道啦!),在夏天的時候,白天的時間會比較長,所以,為了節約用電,因此在夏天的時候,某些地區會將他們的時間定早一小時,也就是說,原本時區是 8 點好了,但是因為夏天太陽比較早出現,因此把時間向前挪,在 8 點的時候,訂定為該天的 7 點~如此一來,我們就可以利用陽光照明,省去了花費電力的時間,因此才會稱之為夏季節約時間!
     
    因為台灣實在是太小了,並沒有橫跨兩個時區,因此,夏季節約時間對我們來說,雖然還是有幫助啦!不過,似乎沒有特別推行的樣子說~
     

    Coordinated Universal Time (UTC) 與系統時間的誤差
     
    瞭解了一些時區的概念之後,這裡要談的是『什麼是正確的時間!』。在計算時間的時候,最準確的計算應該是使用『原子震盪週期』所計算的物理時鐘了( Atomic Clock, 也被稱為原子鐘 ),這也被定義為標準時間(International Atomic Time)。而我們常常看見的 UTC 也就是 Coordinated Universal Time (協和標準時間)就是利用這種 Atomic Clock 為基準所定義出來的正確時間。例如 1999 年在美國啟用的原子鐘 NIST F-1,他所產生的時間誤差每兩千年才差一秒鐘!真的是很準吶!這個 UTC 標準時間是以 GMT 這個時區為主的喔!所以本地時間與 UTC 時間的時差就是本地時間與 GMT 時間的時差就是了!
     
    事實上,在我們的身邊就有很多的原子鐘!例如石英表,還有電腦主機上面的 BIOS 內部就含有一個原子鐘在紀錄與計算時間的進行吶!不過,由於原子鐘主要是利用計算晶片 (crystal) 的原子震盪週期去計時的,這是因為每種晶片都有自己的獨特的震盪週期之故。然而因為這種晶片的震盪週期在不同的晶片之間多多少少都會有點差異性,甚至同一批晶片也可能會或多或少有些許的差異(就連溫度也可能造成這樣的誤差呢!),因此,也就造成了 BIOS 的時間會三不五時的給他快了幾秒或者慢了幾秒。
     
    或許您會認為,BIOS 計時器每天快個五秒也沒有什麼了不起的,不過如果您再仔細的算一算,會發現,一天快五秒,那麼一個月快2.5分鐘,一年就快了 75 分鐘了!所以說,呵呵!時間差是真的會存在的!那麼如果您的電腦真的有這樣的情況,那要怎麼來重新校正時間呢?!呵呵!那就需要『網路校時』( Network Time Protocol, NTP )的功能了!底下我們就談一談那個 NTP 的 daemon 吧!
     

    NTP 是什麼?
     
    如同前面說的,電腦主機主要是以 BIOS 內部的時間為主要的時間依據,而偏偏這個時間可能因為 BIOS 內部晶片本身的問題,而導致 BIOS 時間與標準時間 (UTC) 有一點點的差異存在!所以,為了避免主機時間因為長期運作下所導致的時間偏差,進行時間同步 ( synchronize ) 的工作就顯的很重要了!
     
    那麼怎麼讓時間同步化呢?想一想,如果我們選擇幾部主要主機 ( Primary server ) 調校時間,讓這些 Primary Servers 的時間同步之後,再開放網路服務來讓 Client 端連線,並且提供 Client 端調整 Client 自己的時間,不就可以達到全部的電腦時間同步化的運作了嗎?!那麼什麼協定可以達到這樣的功能呢?!那就是 Network Time Protocol ,另外還有 Digital Time Synchronization Protocol (DTSS) 也可以達到相同的功能!
     
    不過,到底 NTP 這個 daemon 是如何讓 Server 與 Client 同步他們的時間呢?!
     
    1. 首先,主機當然需要啟動這個 daemon ,之後,
    2. Client 會向 NTP Server 發送出調校時間的 message ,
    3. 然後 NTP Server 會送出目前的標準時間給 Client ,
    4. Client 接收了來自 Server 的時間後,會據以調整自己的時間,就達成了網路校時咯!
     
    不過,在上面的步驟中您有沒有想到一件事啊,那就是如果 Client 到 Server 的訊息傳送時間過長怎麼辦?!舉例來說,我在台灣以 ADSL 的 PC 主機,連線到美國的 NTP Server 主機進行時間同步化要求,而美國 NTP Server 收到我的要求之後,就發送當時的正確時間給我,不過,由美國將資料傳送回我的 PC 時,時間可能已經延遲了 10 秒鐘去了!這樣一來,我的 PC 校正的時間是 10 秒鐘前的標準時間喔!此外,如果美國那麼 NTP 主機有太多的人喜歡上去進行網路校時了,所以 loading (負荷) 太重啦!導致訊息的回傳又延遲的更為嚴重!那怎麼辦?!
     
    為了這些延遲的問題,有一些 program 已經開發了自動計算時間傳送過程的誤差,以更準確的校準自己的時間!當然啦,在 daemon 的部分,也同時以 server/client 及 master/slave 的架構來提供使用者進行網路校時的動作!所謂的 master/slave 就有點類似 DNS 的系統咯!舉例來說,台灣的標準時間主機去國際標準時間的主機校時,然後各大專院校再到台灣的標準時間校時,然後我們再到各大專院校的標準時間校時!這樣一來,那幾部國際標準時間主機 ( Time server ) 的 loading 就不至於太大,而我們也可以很快速的達到正確的網路校時的目的呢!台灣常見的 Time Server 為:
     
      time.stdtime.gov.tw
      clock.stdtime.gov.tw
      freq_f.stdtime.gov.tw
      tick.stdtime.gov.tw
      time.chttl.com.tw
     
    至於 ntp 這個 daemon 是以 port 123 為連結的埠口 (使用 UDP 封包),所以我們要利用 Time server 來進行時間的同步更新時,就得要使用 NTP 套件提供的 ntpdate 來進行 port 123 的連線喔!關於網路校時更多的說明,可以到 NTP 的官方網站上察看喔!
     

套件安裝:


    使用 RPM 安裝
     
    一般來說, NTP Server 在各個 distribution 的功能差異應該不很大啦!所以比較建議使用 RPM 的方式來進行安裝!您可以拿出 Linux 的原版光碟,mount 上之後,搜尋以 ntp 為開頭的套件檔名,然後給他安裝上去,就可以了!不過,需要特別留意的是,當您安裝好了 NTP 之後,系統會自動的將 ntp 啟動喔!所以,如果您只是想利用 NTP 套件裡面的 Client 功能,那麼最好還是將 ntp 這個 daemon 關閉吧
     
    [root@test root]# chkconfig --level 2345 ntpd off
    [root@test root]# /etc/rc.d/init.d/ntpd stop
     
    如此一來,您的 ntp 套件已經安裝完畢,可以使用 ntp 的 client 功能去連線 Time server 進行網路校時了!至於 NTP Server 則需要繼續的進行設定呢!
     

    使用 Tarball 安裝
     
    使用 Tarball 來安裝 NTP 其實也是不困難的!簡單的很!請先到 NTP 的官方網站下載最新的 NTP 套件:http://www.ntp.org/downloads.html,這裡我以 ntp-4.1.2.tar.gz 這個版本為範例,假設您下載的套件放置在 /root 底下,那麼可以這樣做:
     
    0. 解壓縮,並閱讀一下 ntp 底下的 README 與 INSTALL:
    [root@test root]# cd /usr/local/src
    [root@test src]# tar -zxvf /root/ntp-4.1.2.tar.gz
    [root@test src]# cd ntp-4.1.2
    [root@test ntp-4.1.2]# vi INSTALL (vi README)
     
    1. 開始設定參數、編譯與安裝:
    [root@test ntp-4.1.2]# ./configure --help | more #可以察看一下可用的參數!
    [root@test ntp-4.1.2]# ./configure --prefix=/usr/local/ntp  \
    >  --enable-all-clocks --enable-parse-clocks
    [root@test ntp-4.1.2]# make clean ; make
    [root@test ntp-4.1.2]# make check  #確定一下,是否有問題!?
    [root@test ntp-4.1.2]# make install # 將資料給他安裝在 /usr/local/ntp 底下
     
    設定完成之後,您就有 ntp 可以使用了!不過,無論怎麼說,使用 RPM 來安裝 NTP 還是比較簡單一些啦! ^_^

Server 端的設定

    好了,假設您已經使用 RPM 來安裝了 NTP 這個套件,那麼我們就可以來談一談怎麼設定 NTP 主機啦!
     

    NTP 的套件結構
     
    NTP 套件的結果主要分為兩部份,一個是 NTP Server 的部分,一個則是 NTP Client 的部分,在這個章節裡面,我們不談比較困難的設定,主要介紹較為簡易的設定而已喔!所以,您需要注意到的檔案與指令有底下這幾個:
     
    • 與 NTP 及時區有關的幾個設定檔:

    •  
      • /etc/ntp.conf :這個是 NTP daemon 的主要設定檔,依據不同的版本放置的目錄可能會不同,不過檔名都是一樣的!使用 locate ntp.conf 搜尋一下您的系統有沒有這個檔案吧!這也是 NTP 唯一的一個設定檔案!

      •  
      • /usr/share/zoneinfo:這是個目錄,這個目錄是 Linux 本身提供的,而不是 NTP 所提供的。在這個目錄下的檔案其實是規定了各主要時區的時間設定檔案,例如台灣地區的時區設定檔案在 /usr/share/zoneinfo/Asia/Taipei 就是了!這個目錄裡面的檔案與底下要談的兩個檔案( clock 與 localtime )是有關係的喔!

      •  
      • /etc/sysconfig/clock:這個檔案其實也不包含在 NTP 的 daemon 當中,因為這個是 linux 的主要時區設定檔案啊!每次開機後,Linux 會自動的讀取這個檔案來設定自己系統所預設要顯示的時間說!舉個例子來說,在我們台灣地區的本地時間設定中,這個檔案內應該會出現一行『ZONE="Asia/Taipei"』的字樣,這表示我們的時間設定檔案『要取用 /usr/share/zoneinfoe/Asia/Taipei 那個檔案』的意思!

      •  
      • /etc/localtime:這個檔案就是『本地端的時間設定檔』啦!剛剛那個 clock 檔案裡面規定了使用的時間設定檔 (ZONE) 為 /usr/share/zoneinfo/Asia/Taipei ,所以說,這就是本地端的時間了,此時, Linux 系統就會將 Taipei 那個檔案複製一份成為 /etc/localtime ,所以未來我們的時間顯示就會以 Taipei 那個時間設定檔案為準。好了,如果現在我這部主機搬到日本東京去了,那麼我應該如何調整時間呢?其實什麼調整都不需要,因為我們的 localtime 主要是分析與 UTC 時間的時差來顯示的格式,所以,您只要將 /etc/sysconfig/clock 裡面的 ZONE 設定成為 Asia/Tokyo 並且將 /usr/share/zoneinfo/Asia/Tokyo 複製成為 /etc/localtime ,呵呵!什麼設定都不需要更動,就能顯示時間為日本東京的時間了!這樣是否能夠瞭解?
       
    • 與 NTP 及時間有關的執行檔:

    •  
      • /bin/date:這個是 Linux 系統上面常見的日期與時間輸出指令,用途很廣喔!除了輸出時間外,也可以修改時間。

      •  
      • /sbin/hwclock:這是一個 root 才能執行的指令,因為 Linux 系統上面 BIOS 時間與 Linux 系統時間是分開的,所以使用 date 這個指令調整了時間之後,還需要使用 hwclock 才能將修改過後的時間寫入 BIOS 當中!

      •  
      • /usr/sbin/ntpd:這就是 NTP 的主要 daemon 檔案啦!得要啟動他才能提供 NTP 服務。注意,這個指令預設會參考 /etc/ntp.conf 裡面的設定喔!

      •  
      • /usr/sbin/ntpdate:這個就是 Client 端用來連接 NTP Server 的主要執行檔囉!如果您沒有要啟用 NTP 而僅想要使用 NTP Client 功能的話,那麼只會用到這個指令而已啦!

      •  
      • /usr/sbin/ntptrace:這個指令可以用來追蹤某部時間伺服器的時間對應關係,這也是個很有用的指令喔!底下我們會介紹如何使用這支程式!
       

    主機的規劃技巧建議
     
    因為 NTP daemon 並沒有花費什麼硬碟空間,所以主機的規劃上面就沒有太多的考慮了!
     

    編輯主要設定檔 /etc/ntp.conf
     
    在 NTP Server 的設定上面,其實最好不要對 Internet 無限制的開放,盡量僅提供您自己內部的 Client 端連線進行網路校時就好。此外, NTP Server 總也是需要網路上面較為準確的主機來自行更新自己的時間啊,所以在我們的 NTP Server 上面也要找一部最靠近自己的 Time Server 來進行自我校正喔!事實上,就如同前面的說明, NTP 這個服務也是 Server/Client 的一種模式 (當然也提供 Peer/Peer ,不過我們這裡主要討論 Server/Client 的架構 ) ,在 Internet 上面提供了多部主要的 (Primary) 時間伺服器,如下的網頁連結所示。不過,雖然 Primary Time Servers 不少,然而 Client 數量更是大的驚人,為了不讓 Primary 的時間伺服器負載太大,所以就有 Secondary (次要的) 時間伺服器的出現了!這個 Secondary 主要就是利用 Primary 主機進行時間調校後,再提供 Internet 上面的 Client 進行校時。
       
    如果想要在台灣地區進行網路校時,那麼 time.stdtime.gov.tw 這個國家單位的第二層主機 ( stratum-2 ) 應該是比較合適的!一般來說,我們在進行 NTP 主機的設定時,都會先選擇數部上層的 Time Server 來做為我們這一部 NTP Server 的校正之用,選擇多部的原因是因為可以避免因為某部時間伺服器突然掛點時,其他主機仍然可以提供我們的 NTP 主機來自我更新啊!然後我們的 NTP Server 才提供給自己的 Client 端更新時間。如此一來,國家單位的 time.stdtime.gov.tw 負載才不會太大,而我們的 Client 也可以很快速的達到校時的動作!
     
    這裡還是需要注意一下,台灣地區的主要 ( 或稱為第一層 stratum-1 ) 時間伺服器 IP 為:
    • 210.59.157.40
    • 210.59.157.41
    • 210.59.157.151
    而第二層的主機有很多,例如:
    • 210.59.157.10

    • 210.59.157.30
      202.39.157.155
     
    基於上面的說明,我的 NTP 伺服器主要的設定項目是這樣的:
     
    • 以上面提到的六部時間伺服器作為我的 NTP server 的上層主機;
    • 不對 Internet 提供公開的服務,僅針對內部網域 192.168.0.0/24 提供服務;
    • 亦對網路上 192.168.100.20 這個 IP 提供服務;
    • 內部私有網路的網路校時不需要認證機制;
     
    這樣的設定真的是很簡單喔!我們就來設定一下吧!
     
    [root@test root]# vi /etc/ntp.conf
    # 1. 關於權限設定部分
    #  權限的設定主要以 restrict 這個參數來設定,主要的語法為:
    #
    #  restrict IP mask netmask_IP parameter
    #
    #  其中 IP 可以是軟體位址,也可以是 default ,default 就類似 0.0.0.0 咯!
    #  至於 paramter 則有:
    #   ignore :關閉所有的 NTP 連線服務
    #   nomodify:表示 Client 端不能更改 Server 端的時間參數,不過,
    #        Client 端仍然可以透過 Server 端來進行網路校時。
    #   notrust :該 Client 除非通過認證,否則該 Client 來源將被視為不信任網域
    #   noquery :不提供 Client 端的時間查詢
    #  如果 paramter 完全沒有設定,那就表示該 IP (或網域) 『沒有任何限制!』
    #
    #  在我們這個例子當中,因為拒絕所有,僅開放 192.168.0.0/24 ,
    #  並且讓 127.0.0.1 以及本機 IP 192.168.0.2 可以不受限制,所以:
    restrict default ignore # 關閉所有的 NTP 要求封包
    restrict 127.0.0.1    # 開啟內部遞迴網路介面 lo
    restrict 192.168.0.2   # 主機本身的 IP 也同時開啟!
    restrict 192.168.100.20 mask 255.255.255.255 nomodify
    # 針對另一個 IP 開放讓他可以更新時間!
    restrict 192.168.0.0 mask 255.255.255.0 nomodify
    # 在網域裡面的 client 可以進行網路校時,但不會影響 Server !
     
    # 2. 上層主機的設定
    #  上層主機我們選擇 time.stdtime.gov.tw ,要設定上層主機主要以 server 
    #  這個參數來設定,語法為:
    #
    #  server [IP|FQDN] [prefer]
    #
    #  Server 後面接的就是我們上層 Time Server 囉!而如果 Server 參數
    #  後面加上 perfer 的話,那表示我們的 NTP 主機主要以該部主機來作為
    #  時間校正的對應。另外,為了解決更新時間封包的傳送延遲動作,
    #  所以可以使用 driftfile 來規定我們的主機
    #  在與 Time Server 溝通時所花費的時間,可以記錄在 driftfile 
    #  後面接的檔案內,例如下面的範例中,我們的 NTP server 與 
    #  time.stdtime.gov.tw 連線時所花費的時間會記錄在 /etc/ntp/drift 檔案內
    # 先輸入第二層主機的 IP
    server 210.59.157.10  prefer
    server 210.59.157.30  prefer
    server 202.39.157.155  prefer
    # 第一層的主機就列為參考用!
    server 210.59.157.40
    server 210.59.157.41
    server 202.39.157.151
    # 當然要讓 Server 可以進入我們的 NTP 主機啦!權限要開放啊!
    restrict 210.59.157.10
    restrict 210.59.157.30
    restrict 202.39.157.155
    restrict 210.59.157.40
    restrict 210.59.157.41
    restrict 202.39.157.151
    driftfile /etc/ntp/drift
     
    在上面的設定當中,最有趣的應該要算 driftfile 那個咚咚了!因為我們的 NTP Server 本身的時間計算是依據 BIOS 的晶片震盪週期頻率來計算的,但是這個數值與上層 Time Server 不見得會一致啊!所我 NTP 這個 daemon 會自動的去計算我們自己主機的頻率與上層 Time server 的頻率,並且將兩個頻率的誤差記錄下來,記錄下來的檔案就是在 driftfile 後面接的完整檔名當中了!我們這裡是以預設的檔案 /etc/ntp/drift 來設定,您也可以自行設定其他的檔名,不過請注意:
    • driftfile 後面接的檔案需要使用完整路徑檔名;
    • 該檔案不能是連結檔;
    • 該檔案需要設定成 ntpd 這個 daemon 可以寫入的權限。
    driftfile 後面接的檔案會被 ntpd 自動更新,所以他的權限一定要能夠讓 ntpd 寫入才行。在 Red Hat 9 預設的 NTP 伺服器中,使用的 ntpd 的 owner 是 ntp ,所以 /etc/ntp/drift 需要設定成 ntp 這個 user 可以寫入喔!至於 owner 怎麼會是 ntp 呢?請查閱 /etc/sysconfig/ntpd 就可以知道啦!而 /etc/ntp/drift 的內容則是僅有一行,裡面的資料是具有小數點的浮點數字,單位則是百萬分之一(ppm)。
     
    事實上 ntp.conf 裡頭還有很多很有趣的設定,例如認證的機制、登入的 Client 觀察以及其他的相關設定等等,不過這裡我們就不多加介紹了!
     

    NTP 的啟動與觀察
     
    在設定好了 ntp.conf 之後,就可以來啟動 NTP 這個 Time Server 了!我們可以這樣做喔:
     
    [root@test root]# /etc/rc.d/init.d/ntpd start
    [root@test root]# netstat -unl | grep 123
    udp        0      0 192.168.0.2:123         0.0.0.0:*
    udp        0      0 127.0.0.1:123           0.0.0.0:*
    udp        0      0 0.0.0.0:123             0.0.0.0:*
    # 請注意喔,NTP 使用的是 UDP 的封包!而且 port number 為 123,
    # 此外,我有兩個介面,以及對外提供服務,所以自然就會有三個!
     
    [root@test root]# ntptrace 192.168.0.2
    192.168.0.2: stratum 3, offset 0.000056, synch distance 0.65865
    210.59.157.10: stratum 2, offset -0.228265, synch distance 0.22488
    ntp0.usno.navy.mil: stratum 1, offset -0.250685, synch distance 0.00038,

    # 我們也可以利用 ntptrace 來追蹤一下到底我們的主機有沒有正確的先經過
    # 上層 Time Server 的校時了呢?如上所示,我們的主機 192.168.0.2 
    # 是第三層的時間伺服器 (stratum 3),與目前本機的時間誤差(offset)
    # 以及若要同步更新時(synch distance)的時間損耗,同時,也會將這個第三層
    # 對哪一部第二層主機進行校時也列出來!有時候您會發現這樣的錯誤訊息:
    192.168.0.2: stratum 16, offset 0.000048, synch distance 0.00087
    0.0.0.0:        *Not Synchronized*
    # 這表示我們的主機尚未與 Internet 的上層 Time Server 進行校時,
    # 最可能發生這樣的錯誤在 ntp.conf 裡面的 restrict 設定了!
    # 此外,當啟動 ntpd 後,您至少需要等待 5 分鐘左右,這段時間
    # 我們的 NTP Server 會不斷的與上層時間伺服器聯繫,如果尚未聯繫成功,
    # 那麼我們的 NTP 主機就會暫時無法讓 Client 端來進行更新喔!
    # 所以如果未能更新,不要太緊張,先等待一陣子再說吧!

     
    如果 ntptrace 可以成功的話,那就表示您的主機 OK 啦!

Client 端的設定:

    好了,再來就是要在 Client 端來向 Time Server 要求網路校時啦!不過,我們先談一談如何手動修正時間吧!
     

    如何調整 Linux 系統的時區與手動設定時間 (date MMDDhhmmYYYY)
     
    我們在前面說過, Linux 的時區檔案放置在 /etc/localtime ,這是一個時間格式的檔案,而不是 ASCII 類型的檔案喔!(file /etc/localtime 可以看出),至於所有的 Time Zone 則放置在 /usr/share/zoneinfo 這個目錄下。請注意:
     
    • 當 /etc/localtime 存在時,系統的時區以該檔案代表的時區來顯示、
    • 當 /etc/localtime 不存在時,系統的時區主要以 GMT (或 UTC) 為準;
     
    所以,如果您想要變更您 Linux 系統的時區,那麼只要在 /usr/share/zoneinfo 裡面找到您需要的時區檔案,然後將他複製一份成為 /etc/localtime 就可以順利的更新時區設定了!另外,同時建議修正一下 /etc/sysconfig/clock 這個檔案裡面的 ZONE 設定值!以我們台灣的 Time zone 為例,在 /etc/sysconfig/clock 這個檔案當中應該是『ZONE="Asia/Taipei"』這就表示我們的時區檔案為 /usr/share/zoneinfo/Asia/Taipei 這個檔案囉!請對應著修改成您所想要的時區吧!
     
    好了,時區修正完畢了,那麼時間呢?!呵呵!目前 Linux 系統上面有兩個時間喔,一個是 Linux 系統,另一個則是 BIOS 時間(真正的硬體記錄的時間)!我們可以使用 date 這個指令來手動修正目前主機的時間,不過, date 這個指令僅修正 Linux 時間而已,我們還需要以 hwclock 這個指令來將 BIOS 時間也更新才行!
     
    [root@test root]# date MMDDhhmmYYYY
    MM:月份
    DD:日期
    hh:小時
    mm:分鐘
    YYYY:西元年
    [root@test root]# date 082110002003
    Thu Aug 21 10:00:00 CST 2003
    # 時間立刻就修正了!
     
    [root@test root]# hwclock [-rw]
    -r:檢視目前的 BIOS 時間
    -w:將目前 Linux 的時間寫入 BIOS 當中!
    [root@test root]# date ; hwclock -r
    Thu Aug 21 10:01:46 CST 2003
    Thu 21 Aug 2003 09:57:52 AM CST  0.647923 seconds
    # 你可以看到, date 與 hwclock -r 所顯示的時間是『不一致的』!
    # 這就是因為 Linux 時間與 BIOS 時間不一致所導致的一個問題!
    # 我們需要以 hwclock -w 來將 Linux 時間寫入 BIOS 喔!
    [root@test root]# hwclock -w
    [root@test root]# date ; hwclock -r
    Thu Aug 21 10:03:42 CST 2003
    Thu 21 Aug 2003 10:03:43 AM CST  0.113323 seconds
    # 呵呵!這樣時間就一致啦!
     
    這樣可以瞭解了嗎?!沒錯,當我們進行完 Linux 時間的校時後,還需要以 hwclock 來更新 BIOS 的時間,因為每次開機的時候,系統會重新由 BIOS 將時間讀出來,所以, BIOS 才是重要的時間依據吶!
     

    如何在 Linux 系統自動網路校時?
     
    在 Linux 上面進行網路校時簡單的很,直接以 ntpdate 這個指令來執行即可!如下所示:
     
    [root@test root]# ntpdate 192.168.0.2
    # 那個 192.168.0.2 是我們剛剛建立的 NTP Server ,您也可以選擇
    # time.stdtime.gov.tw 這部主機來校時喔!
    21 Aug 10:05:29 ntpdate[23420]: step time server 192.168.0.2 offset -236.117047 sec
    [root@test root]# hwclock -w
    # 這樣時間就修正了!若要每日進行時間校正,可以寫入 cron
     
    [root@test root]# vi /etc/crontab
    # 加入這一行:
    10 5 * * * root /usr/sbin/ntpdate 192.168.0.2 ; /sbin/hwclock -w
     
    使用 cron 之後,每天 5:10 Linux 系統就會自動的進行網路校時囉!相當的簡易吧!
     

    如何在 Windows 系統上面進行網路校時?
     
    在 Windows 上面進行網路校時也很簡單,目前已經有很多熱心人士寫好了在 Windows 上面的網路校時軟體了!例如全中文介面的 ntpclock1_21.exe ,您可以在以下的網站下載:
       
    上面同時列出使用說明,請自行參考喔!當然,您也可以在鳥哥的網站下載:
     

安全相關方面

NTP 伺服器在安全的相關性方面,其實剛剛我們在 /etc/ntp.conf 裡面的 restrict 參數中就已經設定了 NTP 這個 daemon 的服務限制範圍了!不過,在防火牆 iptables 的部分,還是需要啟用的啦!所以,在您的 iptables 規則的腳本 (scripts) 當中,需要加入這一段 (我是以開放 192.168.0.0/24 這個網域作為範例的!)
 
/sbin/iptables -A INPUT -p UDP -i eth0 -s 192.168.0.0/24  \
> --dport 123 -j ACCEPT
 
若還要開放其他的網段或者主機,請自行修改您的防火牆機制咯!

本章與 LPI 的關係

    在 LPI 網站 http://www.lpi.org 裡面提到的,在 LPI 102 裡面 NTP 其實考的還不少!Topic 1.111.6 Maintain system time 裡面說到,應試者應該要瞭解 BIOS 時間與 UTC 時間的意義,同時需要知道怎麼設定 timezone ,而時間差所使用的檔案 driftfile 也需要瞭解吶!可能會考的內容含有:
     
    • date
    • hwclock
    • ntpd
    • ntpdate
    • /usr/share/zoneinfo
    • /etc/localtime
    • /etc/ntp.conf
    • /etc/ntp.drift (新版已經改至 /etc/ntp/drift 了)

參考資源:


課後練習

  • 什麼是 GMT (格林威治) 時間與 UTC 時間?
  • Linux 系統的所有時區檔案放置哪一個目錄底下?
  • 我的 Linux 主機本來放置在日本東京,現在想將他拿到台灣來運作,不過因為日本與台灣有一個小時的時差,所以我的時間應該需要經過調整才行。不過,因為我的 BIOS Time 主要是依據 UTC 時間來設定的,所以似乎只要更動時區參數即可。請問我該如何設定時區,好讓我的 Linux 主機能夠顯示正確的時間?
  • 目前 Linux 系統上面的時間伺服器主要是以 NTP 為主,請問這個 daemon 的主要設定檔放在哪裡,而該設定檔中,針對上層 time server 的設定參數為何?而那個 driftfile 參數是幹嘛用的?
  • 請問 ntptrace 的功能為何?
  • 我以 date 更新了我 Linux 上面的時間後,該如何將時間數據寫入 BIOS 內?
  • 在 Linux 上面如何進行網路校時?

  • 前往參考用解答
修改歷史:
2003/08/21:首次完成
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計