Linux系統時間同步方法


在Windwos中,系統時間的設置很簡單,界面操作,通俗易懂,而且設置后,重啟,關機都沒關系。系統時間會自動保存在BIOS時鍾里面,啟動計算機的時候,系統會自動在BIOS里面取硬件時間,以保證時間的不間斷。但在Linux下,默認情況下,系統時間和硬件時間並不會自動同步。在Linux運行過程中,系統時間和硬件時間以異步的方式運行,互不干擾。硬件時間的運行,是靠BIOS電池來維持,而系統時間,是用CPU Tick來維持的。在系統開機的時候,會自動從BIOS中取得硬件時間,設置為系統時間。 

1. Linux系統時間的設置

在Linux中設置系統時間,可以用date命令:

復制代碼
1 //查看時間
2 [root@node1 ~]# date
3 Tue Feb 25 20:15:18 CST 2014
4 //修改時間
5 [root@node1 ~]# date -s "20140225 20:16:00"  #yyyymmdd hh:mm:ss
6 Tue Feb 25 20:16:00 CST 2014
7 //date 有多種時間格式可接受,查看date --help
復制代碼

2. Linux硬件時間的設置

硬件時間的設置,可以用hwclock或者clock命令。兩者基本相同,只用一個就行,只不過clock命令除了支持x86硬件體系外,還支持Alpha硬件體系。

復制代碼
1 //查看硬件時間可以是用hwclock ,hwclock --show 或者 hwclock -r
2 [root@node1 ~]# hwclock --show
3 Tue 25 Feb 2014 08:21:14 PM CST -0.327068 seconds
4 //設置硬件時間
5 [root@node1 ~]# hwclock --set --date "20140225 20:23:00"
6 [root@node1 ~]# hwclock
7 Tue 25 Feb 2014 08:23:04 PM CST -0.750440 seconds
復制代碼

 3. 系統時間和硬件時間的同步

同步系統時間和硬件時間,可以使用hwclock命令。

復制代碼
1 //以系統時間為基准,修改硬件時間
2 [root@node1 ~]# hwclock --systohc <== sys(系統時間)to(寫到)hc(Hard Clock)
3 //或者
4 [root@node1 ~]# hwclock -w
5 //以硬件時間為基准,修改系統時間
6 [root@node1 ~]# hwclock --hctosys
7 //或者
8 [root@node1 ~]# hwclock -s
復制代碼

4. 不同機器之間的時間同步

為了避免主機時間因為長期運行下所導致的時間偏差,進行時間同步(synchronize)的工作是非常必要的。Linux系統下,一般使用ntp服務器來同步不同機器的時間。一台機器,可以同時是ntp服務端和ntp客戶端。在生產系統中,推薦使用像DNS服務器一樣分層的時間服務器來同步時間。

不同機器間同步時間,可以使用ntpdate命令,也可以使用ntpd服務。

4.1 ntpdate命令 

使用ntpdate比較簡單。格式如下:

1 [root@node1 ~]# ntpdate [NTP IP/hostname]
2 [root@node1 ~]# ntpdate 192.168.0.1
3 [root@node1 ~]# ntpdate time.ntp.org

但這樣的同步,只是強制性的將系統時間設置為ntp服務器時間。如果CPU Tick有問題,只是治標不治本。所以,一般配合cron命令,來進行定期同步設置。比如,在crontab中添加:

0 12 * * * /usr/sbin/ntpdate 192.168.0.1

這樣,會在每天的12點整,同步一次時間。ntp服務器為192.168.0.1。

或者將下列腳本添加到/etc/cron.hourly/,這樣就每小時會執行一次同步:

復制代碼
 1 #!/bin/bash
 2 #
 3 # $Id: sync-clock,v 1.6 2009/12/23 15:41:29 jmates Exp $
 4 #
 5 # Use ntpdate to get rough clock sync with department of Genome Sciences
 6 # time server.
 7 
 8 NTPDATE=/usr/sbin/ntpdate
 9 SERVER="192.168.0.1 "
10 
11 # if running from cron (no tty available), sleep a bit to space
12 # out update requests to avoid slamming a server at a particular time
13 if ! test -t 0; then
14   MYRAND=$RANDOM
15   MYRAND=${MYRAND:=$$}
16 
17   if [ $MYRAND -gt 9 ]; then
18     sleep `echo $MYRAND | sed 's/.*\(..\)$/\1/' | sed 's/^0//'`
19   fi
20 fi
21 
22 $NTPDATE -su $SERVER
23 # update hardware clock on Linux (RedHat?) systems
24 if [ -f /sbin/hwclock ]; then
25   /sbin/hwclock --systohc
26 fi
復制代碼

 4.2 ntpd服務 

使用ntpd服務,要好於ntpdate加cron的組合。因為,ntpdate同步時間會造成時間的突變和跳躍,對一些依賴時間的程序和服務會造成影響。比如sleep,timer等。而且ntpd服務可以在修正時間的同時,修正CPU Tick。因此理想的做法為,在開機的時候,使用ntpdate強制同步時間,在其他時候使用ntpd服務來同步時間。

要注意的是,ntpd 有一個自我保護的機制:如果本機與上源時間相差太大,ntpd 不會運行時間同步操作,所以新設置的時間服務器一定要先 ntpdate 從上源取得時間初值, 然后啟動 ntpd服務。ntpd服務運行后,先是每64秒與上源NTP服務器同步一次,根據每次同步時測得的誤差值經復雜計算逐步調整自己的時間,隨着誤差減小,逐步增加同步的間隔。每次跳動,都會重復這個調整的過程。

 4.3. ntpd服務的設置

 ntpd服務的相關設置文件如下:

(1)/etc/ntp.conf:這個是NTP daemon的主要設文件,也是 NTP 唯一的設定文件。

(2)/usr /share/zoneinfo/:在這個目錄下的文件其實是規定了各主要時區的時間設定文件,例如北京地區的時區設定文件在 /usr/share/zoneinfo/Asia/Shanghai 就是了。這個目錄里面的文件與底下要談的兩個文件(clock 與localtime)是有關系的。

(3)/etc/sysconfig/clock:這個文件其實也不包含在NTP 的 daemon 當中,因為這個是 Linux 的主要時區設定文件。每次開機后,Linux 會自動的讀取這個文件來設定自己系統所默認要顯示的時間。

(4)/etc /localtime:這個文件就是"本地端的時間配置文件"。剛剛那個clock 文件里面規定了使用的時間設置文件(ZONE) 為 /usr/share/zoneinfo/Asia/Shanghai ,所以說,這就是本地端的時間了,此時, Linux系統就會將Shanghai那個文件另存為一份 /etc/localtime文件,所以未來我們的時間顯示就會以Beijing那個時間設定文件為准。

下面重點介紹 /etc/ntp.conf文件的設置。在 NTP Server 的設定上,建議不要對Internet 無限制的開放,盡量僅提供局域網內部的 Client 端聯機進行網絡校時。此外,NTP Server 總也是需要網絡上面較為准確的主機來自行更新自己的時間啊,所以在我們的 NTP Server 上面也要找一部最靠近自己的 Time Server 來進行自我校正。事實上, NTP 這個服務也是 Server/Client 的一種模式。

復制代碼
 1 [root@linux ~]# vi /etc/ntp.conf 
 2 # 1. 關於權限設定部分 
 3 #  權限的設定主要以 restrict 這個參數來設定,主要的語法為: 
 4 #   restrict IP mask netmask_IP parameter 
 5 #   其中 IP 可以是軟件地址,也可以是 default ,default 就類似 0.0.0.0 
 6 #  至於 paramter 則有: 
 7 #   ignore :關閉所有的 NTP 聯機服務 
 8 #   nomodify:表示 Client 端不能更改 Server 端的時間參數,不過Client 端仍然可以透過 Server 端來進行網絡校時。
 9 
10 #   notrust :該 Client 除非通過認證,否則該 Client 來源將被視為不信任網域 
11 #   noquery :不提供 Client 端的時間查詢
12 
13 #   notrap :不提供trap這個遠程事件登入
14 
15 #  如果 paramter 完全沒有設定,那就表示該 IP (或網域)"沒有任何限制"
16 
17 restrict default nomodify notrap noquery # 關閉所有的 NTP 要求封包
18 
19 restrict 127.0.0.1    #這是允許本機查詢
20 
21 restrict 192.168.0.1 mask 255.255.255.0 nomodify
22 
23 #在192.168.0.1/24網段內的服務器就可以通過這台NTP Server進行時間同步了 
24 # 2. 上層主機的設定 
25 #  要設定上層主機主要以 server 這個參數來設定,語法為:
26 #  server [IP|HOST Name] [prefer]
27 #  Server 后面接的就是上層 Time Server,而如果 Server 參數
28 
29 # 后面加上 perfer 的話,那表示我們的 NTP 主機主要以該部主機來
30 
31 # 作為時間校正的對應。另外,為了解決更新時間封包的傳送延遲動作,
32 
33 #  所以可以使用 driftfile 來規定我們的主機 
34 #  在與 Time Server 溝通時所花費的時間,可以記錄在 driftfile  
35 #  后面接的文件內,例如下面的范例中,我們的 NTP server 與  
36 #  cn.pool.ntp.org聯機時所花費的時間會記錄在 /etc/ntp/drift文件內 
37 server 0.pool.ntp.org
38 
39 server 1.pool.ntp.org
40 
41 server 2.pool.ntp.org
42 
43 server cn.pool.ntp.org prefer
44 
45 #其他設置值,以系統默認值即可
46 
47 server  127.127.1.0     # local clock
48 
49 fudge   127.127.1.0 stratum 10
50 
51 driftfile /var/lib/ntp/drift
52 broadcastdelay  0.008
53 
54 keys /etc/ntp/keys
復制代碼

總結一下,restrict用來設置訪問權限,server用來設置上層時間服務器,driftfile用來設置保存漂移時間的文件。

4.4 ntpd服務的啟動與查詢

在啟動NTP服務前,先對提供服務的這台主機手動的校正一次時間(因為啟動服務器,端口會被服務端占用,就不能手動同步時間了)。

[root@node1 ~]# ntpdate cn.pool.ntp.org
25 Feb 21:10:52 ntpdate[9549]: adjust time server 202.112.31.197 offset 0.000101 sec

然后,啟動ntpd服務:

[root@node1 ~]# /etc/init.d/ntpd start
Starting ntpd: [ OK ]
[root@node1 ~]# date
Tue Feb 25 21:11:07 CST 2014

查看端口(ntpd服務使用UDP的123端口):

復制代碼
[root@node1 ~]# netstat -ln |grep :123
udp 0 0 12.12.12.100:123 0.0.0.0:*
udp 0 0 192.168.0.100:123 0.0.0.0:*
udp 0 0 172.18.226.174:123 0.0.0.0:*
udp 0 0 10.10.10.100: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:*
udp 0 0 fe80::225:90ff:fe98:61ff:123 :::*
udp 0 0 fe80::225:90ff:fe98:61fe:123 :::*
udp 0 0 fe80::202:c903:1b:afa1:123 :::*
udp 0 0 ::1:123 :::*
udp 0 0 :::123 :::*
復制代碼

如何確認我們的NTP服務器已經更新了自己的時間呢?

復制代碼
[root@node1 ~]# ntpstat
synchronised to NTP server (202.120.2.101) at stratum 4
time correct to within 557 ms
polling server every 64 s
# 該指令可列出NTP服務器是否與上層聯機。由上述輸出結果可知,時間校正約
# 為557*10(-6)秒,且每隔64秒會主動更新時間。
復制代碼

常見的錯誤:

unsynchronized time server re-starting polling server every 64 s
// 或者
25 Apr 15:30:17 ntpdate[11520]: no server suitable for synchronization found

其實,這不是一個錯誤。而是由於每次重啟NTP服務器之后大約要3-5分鍾客戶端才能與server建立正常的通訊連接。當此時用客戶端連接服務端就會報這樣的信息。一般等待幾分鍾就可以了。

復制代碼
[root@node1 ~] # ntptrace –n
127.0.0.1:stratum 11, offset 0.000000,synch distance 0.950951
222.73.214.125:stratum 2,offset –0.000787,synch distance 0.108575
209.81.9.7:stratum 1,offset 0.000028,synch distance 0.00436,refid 'GPS'
# 這個指令可以列出目前NTP服務器(第一層)與上層NTP服務器(第二層)
# 彼此之間的關系,注意:該命令需要安裝ntp-perl包
復制代碼

ntpq命令:

[root@node1 ~]# ntpq -p

指令"ntpq -p"可以列出目前我們的NTP與相關的上層NTP的狀態,以上的幾個字段的意義如下:

remote:即NTP主機的IP或主機名稱。注意最左邊的符號,如果由"+"則代表目前正在作用鍾的上層NTP,如果是"*"則表示也有連上線,不過是作為次要聯機的NTP主機。

refid:參考的上一層NTP主機的地址

st:即stratum階層

when:幾秒前曾做過時間同步更新的操作

poll:下次更新在幾秒之后

reach:已經向上層NTP服務器要求更新的次數

delay:網絡傳輸過程鍾延遲的時間

offset:時間補償的結果

jitter:Linux系統時間與BIOS硬件時間的差異時間

最后提及一點,ntp服務默認只會同步系統時間。如果想要讓ntp同時同步硬件時間,可以設置/etc/sysconfig/ntpd 文件。

在/etc/sysconfig/ntpd文件中,添加 SYNC_HWCLOCK=yes 這樣,就可以讓硬件時間與系統時間一起同步。

5. HPC集群中時間同步示例
5.1 集群環境簡介

管理節點:192.168.0.100,192.168.0.101

計算節點:192.168.0.1~192.168.0.50

I/O節點:192.168.0.51~192.168.0.54

Internet NTP服務器:cn.pool.ntp.org

5.2 時間同步方案設計

圖 1 NTP時間同步方案設計

方案詳細解釋:

(1)管理節點1作為主NTP服務器,跟互聯網NTP服務器進行時間同步;管理節點2作為備用NTP服務器,也跟互聯網NTP服務器進行時間同步。兩個管理節點做Heartbeat,設置一個漂移IP地址192.168.0.103,並對ntpd服務進行雙機高可用;

(2)集群計算節點和IO節點,跟管理節點的虛擬IP地址192.168.0.103通過ntpd服務做時間同步;

(3)所有節點,在ntp時間同步的同時,設置硬件時間跟系統時間一致;

(4)所有計算節點和IO節點開機時,通過ntpdate跟192.168.0.103進行時間同步,然后再開啟ntpd服務。

 

注:本文轉載源文 https://www.cnblogs.com/ibnode/p/3573302.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM