linux同步時(shí)間命令:1、hwclock命令,可以讓系統(tǒng)時(shí)間和硬件時(shí)間的同步,例“hwclock -w”或“hwclock -s”;2、ntpdate命令,可以讓不同機(jī)器間同步時(shí)間。
本教程操作環(huán)境:Ubuntu 16.04系統(tǒng)、Dell G3電腦。
在Windwos中,系統(tǒng)時(shí)間的設(shè)置很簡(jiǎn)單,界面操作,通俗易懂,而且設(shè)置后,重啟,關(guān)機(jī)都沒(méi)關(guān)系。系統(tǒng)時(shí)間會(huì)自動(dòng)保存在BIOS時(shí)鐘里面,啟動(dòng)計(jì)算機(jī)的時(shí)候,系統(tǒng)會(huì)自動(dòng)在BIOS里面取硬件時(shí)間,以保證時(shí)間的不間斷。
但在Linux下,默認(rèn)情況下,系統(tǒng)時(shí)間和硬件時(shí)間并不會(huì)自動(dòng)同步。在Linux運(yùn)行過(guò)程中,系統(tǒng)時(shí)間和硬件時(shí)間以異步的方式運(yùn)行,互不干擾。硬件時(shí)間的運(yùn)行,是靠BIOS電池來(lái)維持,而系統(tǒng)時(shí)間,是用CPU Tick來(lái)維持的。在系統(tǒng)開(kāi)機(jī)的時(shí)候,會(huì)自動(dòng)從BIOS中取得硬件時(shí)間,設(shè)置為系統(tǒng)時(shí)間。
1. Linux系統(tǒng)時(shí)間的設(shè)置
在Linux中設(shè)置系統(tǒng)時(shí)間,可以用date命令:
//查看時(shí)間 [root@node1 ~]# date Tue Feb 25 20:15:18 CST 2014 //修改時(shí)間 [root@node1 ~]# date -s "20140225 20:16:00" #yyyymmdd hh:mm:ss Tue Feb 25 20:16:00 CST 2014 //date 有多種時(shí)間格式可接受,查看date --help
2. Linux硬件時(shí)間的設(shè)置
硬件時(shí)間的設(shè)置,可以用hwclock或者clock命令。兩者基本相同,只用一個(gè)就行,只不過(guò)clock命令除了支持x86硬件體系外,還支持Alpha硬件體系。
//查看硬件時(shí)間可以是用hwclock ,hwclock --show 或者 hwclock -r [root@node1 ~]# hwclock --show Tue 25 Feb 2014 08:21:14 PM CST -0.327068 seconds //設(shè)置硬件時(shí)間 [root@node1 ~]# hwclock --set --date "20140225 20:23:00" [root@node1 ~]# hwclock Tue 25 Feb 2014 08:23:04 PM CST -0.750440 seconds
3. 系統(tǒng)時(shí)間和硬件時(shí)間的同步
同步系統(tǒng)時(shí)間和硬件時(shí)間,可以使用hwclock命令。
//以系統(tǒng)時(shí)間為基準(zhǔn),修改硬件時(shí)間 [root@node1 ~]# hwclock --systohc <== sys(系統(tǒng)時(shí)間)to(寫(xiě)到)hc(Hard Clock) //或者 [root@node1 ~]# hwclock -w //以硬件時(shí)間為基準(zhǔn),修改系統(tǒng)時(shí)間 [root@node1 ~]# hwclock --hctosys //或者 [root@node1 ~]# hwclock -s
4. 不同機(jī)器之間的時(shí)間同步
為了避免主機(jī)時(shí)間因?yàn)殚L(zhǎng)期運(yùn)行下所導(dǎo)致的時(shí)間偏差,進(jìn)行時(shí)間同步(synchronize)的工作是非常必要的。Linux系統(tǒng)下,一般使用ntp服務(wù)器來(lái)同步不同機(jī)器的時(shí)間。一臺(tái)機(jī)器,可以同時(shí)是ntp服務(wù)端和ntp客戶端。在生產(chǎn)系統(tǒng)中,推薦使用像DNS服務(wù)器一樣分層的時(shí)間服務(wù)器來(lái)同步時(shí)間。
不同機(jī)器間同步時(shí)間,可以使用ntpdate命令,也可以使用ntpd服務(wù)。
4.1 ntpdate命令
使用ntpdate比較簡(jiǎn)單。格式如下:
1 [root@node1 ~]# ntpdate [NTP IP/hostname] 2 [root@node1 ~]# ntpdate 192.168.0.1 3 [root@node1 ~]# ntpdate time.ntp.org
但這樣的同步,只是強(qiáng)制性的將系統(tǒng)時(shí)間設(shè)置為ntp服務(wù)器時(shí)間。如果CPU Tick有問(wèn)題,只是治標(biāo)不治本。所以,一般配合cron命令,來(lái)進(jìn)行定期同步設(shè)置。比如,在crontab中添加:
0 12 * * * /usr/sbin/ntpdate 192.168.0.1
這樣,會(huì)在每天的12點(diǎn)整,同步一次時(shí)間。ntp服務(wù)器為192.168.0.1。
或者將下列腳本添加到/etc/cron.hourly/,這樣就每小時(shí)會(huì)執(zhí)行一次同步:
#!/bin/bash # # $Id: sync-clock,v 1.6 2009/12/23 15:41:29 jmates Exp $ # # Use ntpdate to get rough clock sync with department of Genome Sciences # time server. NTPDATE=/usr/sbin/ntpdate SERVER="192.168.0.1 " # if running from cron (no tty available), sleep a bit to space # out update requests to avoid slamming a server at a particular time if ! test -t 0; then MYRAND=$RANDOM MYRAND=${MYRAND:=$$} if [ $MYRAND -gt 9 ]; then sleep `echo $MYRAND | sed 's/.*(..)$/1/' | sed 's/^0//'` fi fi $NTPDATE -su $SERVER # update hardware clock on Linux (RedHat?) systems if [ -f /sbin/hwclock ]; then /sbin/hwclock --systohc fi
4.2 ntpd服務(wù)
使用ntpd服務(wù),要好于ntpdate加cron的組合。因?yàn)?,ntpdate同步時(shí)間會(huì)造成時(shí)間的突變和跳躍,對(duì)一些依賴時(shí)間的程序和服務(wù)會(huì)造成影響。比如sleep,timer等。而且ntpd服務(wù)可以在修正時(shí)間的同時(shí),修正CPU Tick。因此理想的做法為,在開(kāi)機(jī)的時(shí)候,使用ntpdate強(qiáng)制同步時(shí)間,在其他時(shí)候使用ntpd服務(wù)來(lái)同步時(shí)間。
要注意的是,ntpd 有一個(gè)自我保護(hù)的機(jī)制:如果本機(jī)與上源時(shí)間相差太大,ntpd 不會(huì)運(yùn)行時(shí)間同步操作,所以新設(shè)置的時(shí)間服務(wù)器一定要先 ntpdate 從上源取得時(shí)間初值, 然后啟動(dòng) ntpd服務(wù)。ntpd服務(wù)運(yùn)行后,先是每64秒與上源NTP服務(wù)器同步一次,根據(jù)每次同步時(shí)測(cè)得的誤差值經(jīng)復(fù)雜計(jì)算逐步調(diào)整自己的時(shí)間,隨著誤差減小,逐步增加同步的間隔。每次跳動(dòng),都會(huì)重復(fù)這個(gè)調(diào)整的過(guò)程。
4.3. ntpd服務(wù)的設(shè)置
ntpd服務(wù)的相關(guān)設(shè)置文件如下:
(1)/etc/ntp.conf:這個(gè)是NTP daemon的主要設(shè)文件,也是 NTP 唯一的設(shè)定文件。
(2)/usr /share/zoneinfo/:在這個(gè)目錄下的文件其實(shí)是規(guī)定了各主要時(shí)區(qū)的時(shí)間設(shè)定文件,例如北京地區(qū)的時(shí)區(qū)設(shè)定文件在 /usr/share/zoneinfo/Asia/Shanghai 就是了。這個(gè)目錄里面的文件與底下要談的兩個(gè)文件(clock 與localtime)是有關(guān)系的。
(3)/etc/sysconfig/clock:這個(gè)文件其實(shí)也不包含在NTP 的 daemon 當(dāng)中,因?yàn)檫@個(gè)是 Linux 的主要時(shí)區(qū)設(shè)定文件。每次開(kāi)機(jī)后,Linux 會(huì)自動(dòng)的讀取這個(gè)文件來(lái)設(shè)定自己系統(tǒng)所默認(rèn)要顯示的時(shí)間。
(4)/etc /localtime:這個(gè)文件就是"本地端的時(shí)間配置文件"。剛剛那個(gè)clock 文件里面規(guī)定了使用的時(shí)間設(shè)置文件(ZONE) 為 /usr/share/zoneinfo/Asia/Shanghai ,所以說(shuō),這就是本地端的時(shí)間了,此時(shí), Linux系統(tǒng)就會(huì)將Shanghai那個(gè)文件另存為一份 /etc/localtime文件,所以未來(lái)我們的時(shí)間顯示就會(huì)以Beijing那個(gè)時(shí)間設(shè)定文件為準(zhǔn)。
下面重點(diǎn)介紹 /etc/ntp.conf文件的設(shè)置。在 NTP Server 的設(shè)定上,建議不要對(duì)Internet 無(wú)限制的開(kāi)放,盡量?jī)H提供局域網(wǎng)內(nèi)部的 Client 端聯(lián)機(jī)進(jìn)行網(wǎng)絡(luò)校時(shí)。此外,NTP Server 總也是需要網(wǎng)絡(luò)上面較為準(zhǔn)確的主機(jī)來(lái)自行更新自己的時(shí)間啊,所以在我們的 NTP Server 上面也要找一部最靠近自己的 Time Server 來(lái)進(jìn)行自我校正。事實(shí)上, NTP 這個(gè)服務(wù)也是 Server/Client 的一種模式。
[root@linux ~]# vi /etc/ntp.conf # 1. 關(guān)于權(quán)限設(shè)定部分 # 權(quán)限的設(shè)定主要以 restrict 這個(gè)參數(shù)來(lái)設(shè)定,主要的語(yǔ)法為: # restrict IP mask netmask_IP parameter # 其中 IP 可以是軟件地址,也可以是 default ,default 就類似 0.0.0.0 # 至于 paramter 則有: # ignore?。宏P(guān)閉所有的 NTP 聯(lián)機(jī)服務(wù) # nomodify:表示 Client 端不能更改 Server 端的時(shí)間參數(shù),不過(guò)Client 端仍然可以透過(guò) Server 端來(lái)進(jìn)行網(wǎng)絡(luò)校時(shí)。 # notrust :該 Client 除非通過(guò)認(rèn)證,否則該 Client 來(lái)源將被視為不信任網(wǎng)域 # noquery :不提供 Client 端的時(shí)間查詢 # notrap :不提供trap這個(gè)遠(yuǎn)程事件登入 # 如果 paramter 完全沒(méi)有設(shè)定,那就表示該 IP (或網(wǎng)域)"沒(méi)有任何限制" restrict default nomodify notrap noquery # 關(guān)閉所有的 NTP 要求封包 restrict 127.0.0.1 #這是允許本機(jī)查詢 restrict 192.168.0.1 mask 255.255.255.0 nomodify #在192.168.0.1/24網(wǎng)段內(nèi)的服務(wù)器就可以通過(guò)這臺(tái)NTP Server進(jìn)行時(shí)間同步了 # 2. 上層主機(jī)的設(shè)定 # 要設(shè)定上層主機(jī)主要以 server 這個(gè)參數(shù)來(lái)設(shè)定,語(yǔ)法為: # server [IP|HOST Name] [prefer] # Server 后面接的就是上層 Time Server,而如果 Server 參數(shù) # 后面加上 perfer 的話,那表示我們的 NTP 主機(jī)主要以該部主機(jī)來(lái) # 作為時(shí)間校正的對(duì)應(yīng)。另外,為了解決更新時(shí)間封包的傳送延遲動(dòng)作, # 所以可以使用 driftfile 來(lái)規(guī)定我們的主機(jī) # 在與 Time Server 溝通時(shí)所花費(fèi)的時(shí)間,可以記錄在 driftfile # 后面接的文件內(nèi),例如下面的范例中,我們的 NTP server 與 # cn.pool.ntp.org聯(lián)機(jī)時(shí)所花費(fèi)的時(shí)間會(huì)記錄在 /etc/ntp/drift文件內(nèi) server 0.pool.ntp.org server 1.pool.ntp.org server 2.pool.ntp.org server cn.pool.ntp.org prefer #其他設(shè)置值,以系統(tǒng)默認(rèn)值即可 server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10 driftfile /var/lib/ntp/drift broadcastdelay 0.008 keys /etc/ntp/keys
總結(jié)一下,restrict用來(lái)設(shè)置訪問(wèn)權(quán)限,server用來(lái)設(shè)置上層時(shí)間服務(wù)器,driftfile用來(lái)設(shè)置保存漂移時(shí)間的文件。
4.4 ntpd服務(wù)的啟動(dòng)與查詢
在啟動(dòng)NTP服務(wù)前,先對(duì)提供服務(wù)的這臺(tái)主機(jī)手動(dòng)的校正一次時(shí)間(因?yàn)閱?dòng)服務(wù)器,端口會(huì)被服務(wù)端占用,就不能手動(dòng)同步時(shí)間了)。
[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
然后,啟動(dòng)ntpd服務(wù):
[root@node1 ~]# /etc/init.d/ntpd start Starting ntpd: [ OK ] [root@node1 ~]# date Tue Feb 25 21:11:07 CST 2014
查看端口(ntpd服務(wù)使用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 :::*
如何確認(rèn)我們的NTP服務(wù)器已經(jīng)更新了自己的時(shí)間呢?
[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服務(wù)器是否與上層聯(lián)機(jī)。由上述輸出結(jié)果可知,時(shí)間校正約 # 為557*10(-6)秒,且每隔64秒會(huì)主動(dòng)更新時(shí)間。
常見(jiàn)的錯(cuò)誤:
unsynchronized time server re-starting polling server every 64 s // 或者 25 Apr 15:30:17 ntpdate[11520]: no server suitable for synchronization found
其實(shí),這不是一個(gè)錯(cuò)誤。而是由于每次重啟NTP服務(wù)器之后大約要3-5分鐘客戶端才能與server建立正常的通訊連接。當(dāng)此時(shí)用客戶端連接服務(wù)端就會(huì)報(bào)這樣的信息。一般等待幾分鐘就可以了。
[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' # 這個(gè)指令可以列出目前NTP服務(wù)器(第一層)與上層NTP服務(wù)器(第二層) # 彼此之間的關(guān)系,注意:該命令需要安裝ntp-perl包
ntpq命令:
[root@node1 ~]# ntpq -p
指令"ntpq -p"可以列出目前我們的NTP與相關(guān)的上層NTP的狀態(tài),以上的幾個(gè)字段的意義如下:
remote:即NTP主機(jī)的IP或主機(jī)名稱。注意最左邊的符號(hào),如果由"+“則代表目前正在作用鐘的上層NTP,如果是”*"則表示也有連上線,不過(guò)是作為次要聯(lián)機(jī)的NTP主機(jī)。
refid:參考的上一層NTP主機(jī)的地址 st:即stratum階層 when:幾秒前曾做過(guò)時(shí)間同步更新的操作 poll:下次更新在幾秒之后 reach:已經(jīng)向上層NTP服務(wù)器要求更新的次數(shù) delay:網(wǎng)絡(luò)傳輸過(guò)程鐘延遲的時(shí)間 offset:時(shí)間補(bǔ)償?shù)慕Y(jié)果 jitter:Linux系統(tǒng)時(shí)間與BIOS硬件時(shí)間的差異時(shí)間
最后提及一點(diǎn),ntp服務(wù)默認(rèn)只會(huì)同步系統(tǒng)時(shí)間。如果想要讓ntp同時(shí)同步硬件時(shí)間,可以設(shè)置/etc/sysconfig/ntpd 文件。
在/etc/sysconfig/ntpd文件中,添加 SYNC_HWCLOCK=yes 這樣,就可以讓硬件時(shí)間與系統(tǒng)時(shí)間一起同步。