linux同步時間命令:1、hwclock命令,可以讓系統時間和硬件時間的同步,例“hwclock -w”或“hwclock -s”;2、ntpdate命令,可以讓不同機器間同步時間。
本教程操作環境:ubuntu 16.04系統、Dell G3電腦。
在Windwos中,系統時間的設置很簡單,界面操作,通俗易懂,而且設置后,重啟,關機都沒關系。系統時間會自動保存在BIOS時鐘里面,啟動計算機的時候,系統會自動在BIOS里面取硬件時間,以保證時間的不間斷。
但在Linux下,默認情況下,系統時間和硬件時間并不會自動同步。在Linux運行過程中,系統時間和硬件時間以異步的方式運行,互不干擾。硬件時間的運行,是靠BIOS電池來維持,而系統時間,是用CPU Tick來維持的。在系統開機的時候,會自動從BIOS中取得硬件時間,設置為系統時間。
1. Linux系統時間的設置
在Linux中設置系統時間,可以用date命令:
//查看時間 [root@node1?~]#?date Tue?Feb?25?20:15:18?CST?2014 //修改時間 [root@node1?~]#?date?-s?"20140225?20:16:00"??#yyyymmdd?hh:mm:ss Tue?Feb?25?20:16:00?CST?2014 //date?有多種時間格式可接受,查看date?--help
2. Linux硬件時間的設置
硬件時間的設置,可以用hwclock或者clock命令。兩者基本相同,只用一個就行,只不過clock命令除了支持x86硬件體系外,還支持Alpha硬件體系。
//查看硬件時間可以是用hwclock?,hwclock?--show?或者?hwclock?-r [root@node1?~]#?hwclock?--show Tue?25?Feb?2014?08:21:14?PM?CST?-0.327068?seconds //設置硬件時間 [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. 系統時間和硬件時間的同步
同步系統時間和硬件時間,可以使用hwclock命令。
//以系統時間為基準,修改硬件時間 [root@node1?~]#?hwclock?--systohc?<h2><strong>4. 不同機器之間的時間同步</strong></h2><p>為了避免主機時間因為長期運行下所導致的時間偏差,進行時間同步(synchronize)的工作是非常必要的。Linux系統下,一般使用ntp服務器來同步不同機器的時間。一臺機器,可以同時是ntp服務端和ntp客戶端。在生產系統中,推薦使用像DNS服務器一樣分層的時間服務器來同步時間。</p><p>不同機器間同步時間,可以使用ntpdate命令,也可以使用ntpd服務。</p><p><span style="font-size: 18px;"><strong>4.1 ntpdate命令</strong></span></p><p>使用ntpdate比較簡單。格式如下:</p><pre class="brush:js;toolbar:false;">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/,這樣就每小時會執行一次同步:
#!/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服務
使用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 的一種模式。
[root@linux?~]#?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?端的時間查詢 # notrap?:不提供trap這個遠程事件登入 # 如果?paramter?完全沒有設定,那就表示該?IP?(或網域)"沒有任何限制" restrict?default?nomodify?notrap?noquery #?關閉所有的?NTP?要求封包 restrict?127.0.0.1 ?#這是允許本機查詢 restrict?192.168.0.1?mask?255.255.255.0?nomodify #在192.168.0.1/24網段內的服務器就可以通過這臺NTP?Server進行時間同步了? #?2.?上層主機的設定? # 要設定上層主機主要以?server?這個參數來設定,語法為: # server?[IP|HOST?Name]?[prefer] # Server?后面接的就是上層?Time?Server,而如果?Server?參數 #?后面加上?perfer?的話,那表示我們的?NTP?主機主要以該部主機來 #?作為時間校正的對應。另外,為了解決更新時間封包的傳送延遲動作, # 所以可以使用?driftfile?來規定我們的主機? # 在與?Time?Server?溝通時所花費的時間,可以記錄在?driftfile?? # 后面接的文件內,例如下面的范例中,我們的?NTP?server?與?? # cn.pool.ntp.org聯機時所花費的時間會記錄在?/etc/ntp/drift文件內? server?0.pool.ntp.org server?1.pool.ntp.org server?2.pool.ntp.org server?cn.pool.ntp.org?prefer #其他設置值,以系統默認值即可 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
總結一下,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 這樣,就可以讓硬件時間與系統時間一起同步。
相關推薦:《Linux視頻教程》