在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
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。在此不做詳細介紹。