在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 inlocal time
--directisa access the ISA bus directly instead of /dev/rtc
--badyear ignore rtc's year because the bios is broken
新聞熱點
疑難解答