在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 ~]#
如下所示,我們修改了系統時間,將時間修改為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 ~]#
硬件時間的設置,可以用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 ~]#
[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 ~]#
系統時間和硬件時間的同步
我們可以使用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
但是如果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/





