Linux時間同步介紹


在Linux系統中,為了避免主機時間因為在長時間運行下所導致的時間偏差,進行時間同步(synchronize)的工作是非常必要的。Linux系統下,一般使用ntp服務來同步不同機器的時間。NTP 是網絡時間協議(Network Time Protocol)的簡稱,干嘛用的呢?就是通過網絡協議使計算機之間的時間同步化。

 

系統時間與硬件時間

在展開Linux系統時間同步前,我們必須先了解一些概念:在一台計算機上我們有兩個時鍾:一個稱之為硬件時間時鍾(RTC Real Time Clock,又叫實時時鍾),還有一個稱之為系統時鍾(System Clock)。

硬件時鍾是指嵌在主板上的特殊的電路, 它的存在就是平時我們關機之后還可以計算時間的原因。RTC的英文全稱是Real-Time Clock,翻譯過來是實時時鍾芯片. RTC是PC主板上的晶振及相關電路組成的時鍾電路的生成脈沖主板上的晶振及相關電路組成的時鍾電路的生成脈沖,RTC經過8254電路的變頻產生一個頻率較低一點的OS(系統)時鍾TSC,系統時鍾每一個cpu周期加一周期加一,每次系統時鍾在系統初起時通過RTC初始化。8254本身工作也需要有自己的驅動時鍾(PIT)

系統時鍾就是操作系統的kernel所用來計算時間的時鍾. 它從1970年1月1日00:00:00 UTC時間到目前為止秒數總和的值。在Linux下系統時間在開機的時候會和硬件時間同步(synchronization),之后也就各自獨立運行了

默認情況下,系統時間和硬件時間,並不會自動同步。在Linux運行過程中,系統時間和硬件時間以異步的方式運行,互不干擾。硬件時間的運行,是靠BIOS電池來維持,而系統時間,是用CPU tick來維持的。這也是系統時間長時間運行時會產生時間偏差的原因,我小時候有買過電子手表,那個時候的電子產品還相當不靠譜,電子手表走着走着就和新聞聯播里面的時間對不上了,總會查那么幾分鍾甚至幾十分鍾,那個時候最苦惱的事情就是需要手動調整電子手表的時間,這也算是時間同步的一種吧!系統時間可以通過date命令查看,硬件時間可以通過clock或hwclock命令查看。我們來看看系統時間和硬件時間吧。

[root@db-server ~]# date
 
Wed Jan 14 14:49:16 CST 2015
 
[root@db-server ~]# 
 
[root@db-server ~]# clock
 
Wed 14 Jan 2015 02:49:24 PM CST -0.473465 seconds
 
[root@db-server ~]# 
 
[root@db-server ~]# hwclock --show
 
Wed 14 Jan 2015 02:49:36 PM CST -0.625346 seconds
 
[root@db-server ~]# 
 
[root@db-server ~]# 

clip_image001

如下所示,我們修改了系統時間,將時間修改為2015-01-14 08:00:00,然后我們查看硬件時間就可以發現,系統時間和硬件時間是異步運行。互補干擾。

[root@db-server ~]# date -s "2015-01-14 08:00:00"
 
Wed Jan 14 08:00:00 CST 2015
 
[root@db-server ~]# date
 
Wed Jan 14 08:00:02 CST 2015
 
[root@db-server ~]# clock
 
Wed 14 Jan 2015 02:52:54 PM CST -0.045672 seconds
 
[root@db-server ~]# 

clip_image002

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

 

設置硬件時間

[root@db-server ~]# clock
 
Wed 14 Jan 2015 03:24:09 PM CST -0.941272 seconds
 
[root@db-server ~]# hwclock --set --date="2015-01-15 15:24:00";
 
[root@db-server ~]# clock
 
Thu 15 Jan 2015 03:24:04 PM CST -0.476775 seconds
 
[root@db-server ~]# 

clip_image003

[root@db-server ~]# clock --help
hwclock - query and set the hardware clock (RTC)
 
Usage: hwclock [function] [options...]
 
Functions:
  --help        show this help
  --show        read hardware clock and print result
  --set         set the rtc to the time given with --date
  --hctosys     set the system time from the hardware clock
  --systohc     set the hardware clock to the current system time
  --adjust      adjust the rtc to account for systematic drift since 
                the clock was last set or adjusted
  --getepoch    print out the kernel's hardware clock epoch value
  --setepoch    set the kernel's hardware clock epoch value to the 
                value given with --epoch
  --version     print out the version of hwclock to stdout
 
Options: 
  --utc         the hardware clock is kept in coordinated universal time
  --localtime   the hardware clock is kept in local time
  --directisa   access the ISA bus directly instead of /dev/rtc
  --badyear     ignore rtc's year because the bios is broken
  --date        specifies the time to which to set the hardware clock
  --epoch=year  specifies the year which is the beginning of the 
                hardware clock's epoch value
  --noadjfile   do not access /etc/adjtime. Requires the use of
                either --utc or --localtime
 
[root@db-server ~]# hwclock --show
Thu 15 Jan 2015 03:40:47 PM CST  -0.544844 seconds
[root@db-server ~]# clock --set --date  "2015-01-14 15:41:00";
[root@db-server ~]# hwclock --show
Wed 14 Jan 2015 03:41:12 PM CST  -0.740512 seconds
[root@db-server ~]# 

clip_image004

 

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

我們可以使用hwclock --systohc把系統時間設置成硬件時間,如下所示(我們先修改系統時間,手工造成系統時間與硬件時間不一致)

[root@db-server ~]# date -s "2015-01-14 15:53";
Wed Jan 14 15:53:00 CST 2015
[root@db-server ~]# date 
Wed Jan 14 15:53:03 CST 2015
[root@db-server ~]# hwclock --systohc
[root@db-server ~]# date 
Wed Jan 14 15:53:35 CST 2015
[root@db-server ~]# hwclock --show
Wed 14 Jan 2015 03:53:36 PM CST  -0.149835 seconds

我們也可以把硬件時間設置成系統時間:運行以下命令即可

hwclock --hctosys

 

時間同步設置

網絡時間協議NTP(Network Time Protocol)是用於互聯網中時間同步的標准互聯網協議。NTP的用途是把計算機的時間同步到某些時間標准。目前采用的時間標准是世界協調時UTC(Universal Time Coordinated)。NTP的主要開發者是美國特拉華大學的David L. Mills教授。關於NTP概念,深入的話,都足足可以講一篇。我們暫且只是關注如何同步時間。要同步時間,就必須有一個精確地NTP Server,關於NTP Server可以參考NTP的官方網站http://www.pool.ntp.org,在這上面我們可以找到離我們城市最近的NTP Server

同步世界我們一般使用ntpd或ntpdate這兩個命令,那ntpd與ntpdate在更新時間時有什么區別?ntpd不僅僅是時間同步服務器,它還可以做客戶端與標准時間服務器進行同步時間,而且是平滑同步,並非ntpdate立即同步,在生產環境中慎用ntpdate,也正如此兩者不可同時運行

一個是校准時間,一個是調整時間。也就是說ntpd在實際同步時間時是一點點的校准過來時間的,最終把時間慢慢的校正對。而ntpdate不會考慮其他程序是否會陣痛,直接調整時間。

如下所示,我們首先修改系統時間,然后使用ntpdate命令同步系統時間。

[root@DB-Server ~]# date

Tue Jan 27 23:44:54 CST 2015

[root@DB-Server ~]# date -s "2015-12-27 23:48:50"

Sun Dec 27 23:48:50 CST 2015

[root@DB-Server ~]# ntpdate 2.cn.pool.ntp.org

27 Jan 23:45:41 ntpdate[6930]: step time server 202.112.31.197 offset -28857832.720974 sec

[root@DB-Server ~]# date

Tue Jan 27 23:45:44 CST 2015

clip_image005

但是如果cpu tick有問題,這類調整往往很難一次性解決問題,所以必須結合cron命令來徹底根治這個,例如下面cron命令。

*/30 * * * * /usr/sbin/ntpdate 192.168.7.161 1>/dev/null 2>&1

關於ntpd最好單獨一章介紹一下如何配置ntpd。在此不做詳細介紹。

 

參考資料:

http://blog.csdn.net/suer0101/article/details/7868813

http://blog.csdn.net/sjx800688/article/details/7010979

http://hoya120.blog.163.com/blog/static/520294792010612103319272/


免責聲明!

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



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