Original url:
https://www.cnblogs.com/ajianbeyourself/p/4189520.html
閱讀目錄
注:以Ubuntu爲例說明
在Linux計算機上,有兩個時間,一個是硬件時間(BIOS中記錄的時間,稱爲hwclock),另一個是操作系統時間(osclock)。硬件時鐘由BIOS電池供電,
當計算機關機後,會繼續運行,BIOS電池一般可使用幾年,如果沒電了,那BIOS中的數據會恢復出廠設置。
1. 硬件時間
時間是有時區的,無論硬件時間還是操作系統時間。hwclock的時區在/etc/default/rcS文件中設置,裏面有一個參數UTC,默認值爲True,表示使用UTC時
區,如果設置爲no,那表示使用osclock的時區。建議hwclock與osclock設置相同的時區。注:由於我的osclock也是UTC時間,所以這裏UTC=yes還是
UTC=no都是一樣的。
# assume that the BIOS clock is set to UTC time (recommended) UTC=yes
查看硬件時間
njsqrt3@test:~$ sudo hwclock -r Sun 28 Dec 2014 05:20:56 AM UTC -1.044336 seconds njsqrt3@test:~$
將osclock寫入hwclock
zhj@test:~$ sudo hwclock -w zhj@test:~$
2.操作系統時間
osclock的時區配置文件爲/etc/timezone,如果你想修改,那最好使用sudo dpkg-reconfigure tzdata來修改時區,不建議直接修改/etc/timezone文件,
如果你想修改爲UTC時間,那執行sudo dpkg-reconfigure tzdata命令時,選擇None of the above->UTC 即可
zhj@test:~$ cat /etc/timezone Etc/UTC zhj@test:~$
查看osclock
zhj@test:~$ date Sun Dec 28 05:21:11 UTC 2014 zhj@test:~$
修改osclock
#修改時/分/秒 sudo date -s hh:mm:ss #修改年/月/日 sudo date -s MM/DD/YY
我們一般會使用ntp同步osclock,這一點是非常重要的,無論你是單臺主機還是集羣,你要保證你的時間必須與國際原子時同步,如果你不同步,那你主機的時
間與國際原子時相差幾秒甚至幾分鐘都是有可能的,想象一下,如果新浪微博的服務器沒有同步時間,假設當前國際原子時間爲2014-12-28T14:20:00Z,而新
浪微博服務器的時間爲1989-06-04T10:00:00Z,那我發的微博就穿越了到了1989年6月4日,那天在天安門發生了大動亂,如果新浪微博的應用服務器集羣之間
也沒有時間同步,假定server1爲2014-12-28T09:00:00Z,server2爲2014-12-27T09:00:00Z,兩者相差一天。我發微博時用的是server1,我的一個朋
友評論了我的微博,評論使用的是server2,這他媽奇蹟就出現了,他的評論時間比我發微博的時間還早。
如果是單臺主機,那我們的主機當ntp客戶端就行了,找一個ntp服務器(如0.ubuntu.pool.ntp.org)直接使用ntpdate命令就可以同步,一般我們將它做成
cron定時任務,該任務將osclock與國際原子時同步後,還要將osclock寫入hwclock(後面會講爲何將osclock刷入hwclock)。那如果是集羣呢?我們一般是將其
中一臺主機做成ntp服務器,安裝ntpd軟件(該軟件就叫ntp,爲了與ntp協議區分,這裏用它的守護進程名ntpd代替),通過sudoapt-get install ntp安裝,這
個軟件既可以做服務端也可以做客戶端。做爲客戶端,它從上層的ntp server那裏獲取到國際原子時;做爲服務端,它爲集羣內中的客戶機提供國際原子時
間。這樣做可以節約外網網絡帶寬。
注:ntpd軟件與ntpdate軟件不能同時運行。對於集羣中的ntp server服務器,要安裝ntpd,配置好ntpd後,它會自動定時同步上層ntp server的時間到
osclock,不過它沒有寫入hwclock的配置項,所以我們還要手動在cron添加定時任務,將osclock寫入hwclock。對於集羣中的客戶機,編寫cron任務,用
ntpdate命令(一般的,在安裝好Ubuntu後,就有該命令了)從集羣ntp server的那裏獲取標準時間,更新osclock,同時更新後,也要將osclock寫入hwclock。
3.硬件時間與操作系統時間的交互
下面說一下硬件時間與操作系統時間的交互流程
1、開機時,操作系統從BIOS中讀取硬件時間+時區,然後根據osclock的時區,轉換爲對應的時間。然後操作系統時間與硬件時間就獨立運行,相互不影響,我們
通過應用程序獲取的時間用的都是操作系統時間。這一步是開機時os自動完成的。
2、主機運行過程中,通過ntp保證osclock與國際原子時同步,再將osclock同步到hwclock。這一步需要自己配置實現
3、關機時,osclock寫入hwclock。這一步是關機時os自動完成的。不過我們要考慮異常關機的情況,當異常關機時,osclock可能沒有寫入hwclock,這就是爲什
麼在第2步中將osclock定時刷入hwclock的原因。如果不定時刷入,那osclock與hwclock差距比較大時,若異常關機,osclock就丟掉了,再開機時,osclock就是
錯誤的,在第一個ntp同步到來時,osclock就一直是錯誤的。而且如果使用的是ntpd,ntpd是漸進調整,要經過多個ntp同步週期後纔會將osclock調整爲國際原子
時,另外,如果osclock與ntp server的時間差超過1000秒,那ntp server就不會更新osclock了。(別,如果你安裝了Ubuntu GUI,並設置了
System Settings->Time&Date->Automatically from the Internet,那它會自動同步時間)
4、ntpd與ntpdate
參見https://help.ubuntu.com/10.04/serverguide/NTP.html
ntpd當發現ntp client與ntp server時間不相同時,使用漸進同步,如果ntp server與client之間的差距超過1000秒,那就直接不同步了;ntpdate是躍遷式
同步,一步到位。ntpd與ntpdate是不能同時運行的,如下,在ntpd運行的情況下,執行ntpdate時會出錯。ntpd和ntpdate使用的都是123號端口,然後我們把
ntpd停掉,再執行ntpdate,就可以了。
zhj@test:~$ sudo ntpdate 0.ubuntu.pool.ntp.org 28 Dec 07:47:40 ntpdate[5857]: the NTP socket is in use, exiting zhj@test:~$
zhj@test:~$ sudo service ntp stop * Stopping NTP server ntpd [ OK ] zhj@test:~$ date Sun Dec 28 07:52:37 UTC 2014 zhj@test:~$ sudo ntpdate 0.ubuntu.pool.ntp.org 28 Dec 07:52:50 ntpdate[5891]: adjust time server 202.112.31.197 offset 0.018119 sec zhj@test:~$
一般的,在集羣的ntp server主機上,考慮到該主機時間與國際原子時可能超過1000秒,一般先停止ntpd,然後用ntpdate同步一下時間,然後再開啓ntpd
服務,自動定時同步。而集羣中的ntp客戶機,就在cron定時執行ntpdate和hwclock -w任務就行了。當然,如果你不嫌麻煩,也可以在客戶機上安裝ntpd服務,
前面我們提到ntpd既可以做服務端,又可以做客戶端,這個在ntpd的配置文件/etc/ntp.conf中配置一下就行,restrict項只保留默認的下面四項即可,其它
restrict項註釋掉,另外,你還是要在cron中設置定時任務hwclock -w
# By default, exchange time with everybody, but don't allow configuration. restrict -4 default kod notrap nomodify nopeer noquery restrict -6 default kod notrap nomodify nopeer noquery # Local users may interrogate the ntp server more closely. restrict 127.0.0.1 restrict ::1