虛擬機下LINUX時間不同步的解決辦法

1. 時間和時區

地理課上我們都學過格林威治時間(GMT), 它也就是0時區時間,但是我們在計算機中經常看到的是UTC,它是Coordinated Universal Time的簡寫, 雖然可以認爲UTC和GMT的值相等(誤差相當之小),但是UTC已經被認定爲是國際標準,所以我們都應該遵守標準只使用UTC。

 

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

20:00 CST

12:00 UTC

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

 

2. 如何設置Linux Time Zone

在Linux下glibc提供了我們事先編譯好的許多timezone文件,他們就放在/usr/share/zoneinfo這個目錄下,這裏基本涵蓋了大部分的國家和城市。在這裏面我們就可以找到自己所在城市的time zone文件。那麼如果我們想查看對於每個time zone當前的時間我們可以用zdump命令

# zdump HongKong

HongKong  Tue Aug  9 05:04:46 2011 HongKong

 

那麼我們又怎麼來告訴系統我們所在time zone是哪個呢? 方法有很多,這裏舉出兩種:

第一個就是修改/etc/localtime這個文件,,這個文件定義了我麼所在的local time zone。我們可以在/usr/share/zoneinfo下找到我們的time zone文件然後拷貝去到/etc/localtimezone(或者做個symbolic link)。

假設我們現在的time zone是BST(也就是英國的夏令時間,UTC+1)

 date

Thu  Jul   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 TZ

 

tzselect會讓你選擇所在的國家和城市(我省略了這些步驟),最後輸出相應的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包裝上

# rpm -ivh ntp-4.2.2p1-5.el5.rpm

yum install ntp

那麼第一步我們就要找到在互聯網上給我們提供同步服務的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

如果是中國

0.cn.pool.ntp.org

1.cn.pool.net.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會花上較長一段時間進行調整.所以手動同步可以減少這段時間

3. 配置和運行NTP Server

現在我們就來創建NTP的配置文件了, 它就是/etc/ntp.conf. 我們只需要加入上面的NTP Server和一個driftfile就可以了

# vi /etc/ntp.conf

server 0.uk.pool.ntp.org

server 1.uk.pool.ntp.org

driftfile /var/lib/ntp/ntp.drift

4、非常的簡單. 接下來我們就啓動NTP Server,並且設置其在開機後自動運行

# /etc/init.d/ntpd/start# chkconfig --level 35 ntpd on

 

5. 查看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: 遠程服務器的級別. 由於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——遠程服務器不可用

瞭解這些之後我們就可以實時監測我們系統的時間同步狀況了


6. NTP安全設置

運行一個NTP Server不需要佔用很多的系統資源,所以也不用專門配置獨立的服務器,就可以給許多client提供時間同步服務, 但是一些基本的安全設置還是很有必要的

那麼這裏一個很簡單的思路就是第一我們只允許局域網內一部分的用戶連接到我們的服務器. 第二個就是這些client不能修改我們服務器上的時間

在/etc/ntp.conf文件中我們可以用restrict關鍵字來配置上面的要求

首先我們對於默認的client拒絕所有的操作

vi /etc/ntp.conf

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來做authenticaiton,這裏就不詳細介紹了


7. NTP client的設置

做到這裏我們已經有了一臺自己的Relay Server.如果我們想讓局域網內的其他client都進行時間同步的話那麼我們就都應該照樣再搭建一臺Relay Server,然後把所有的client都指向這兩臺服務器(注意不要把所有的client都指向Internet上的服務器). 只要在client的ntp.conf加上這你自己的服務器就可以了

server ntp1.leonard.com

server ntp2.leonard.com


9. 一些補充和拾遺

1)配置文件中的driftfile是什麼?

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


2) 如何同步硬件時鐘?

NTP一般只會同步system clock. 但是如果我們也要同步RTC的話那麼只需要把下面的選項打開就可以了

# vi /etc/sysconfig/ntpd

SYNC_HWCLOCK=yes


舉例:

修改linux下的時區,可以改變以下的文件內容:

/etc/localtime,方法是到/usr/share/zoneinfo目錄下找到你要相對應的時區文件,例如上海在/usr/share/zoneinfo/Asia/Shanghai中

將/etc/localtime改名:mv /etc/localtime /etc/localtime.old

將上海的時區文件拷貝過來:cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

再次使用date命令,可以看到時區已經改爲CST了。

也可以設置TZ環境變量,在/etc/profile中加入:

export TZ=CST

就可以在每次啓動後設置爲CST時區了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章