linux的系统时钟,【总结】linux系统时间和硬件时钟问题
####一、弄清幾個概念:
1. “系統時間”與“硬件時間”
**系統時間:** 一般說來就是我們執行 date 命令看到的時間,linux系統下所有的時間調用(除了直接訪問硬件時間的命令)都是使用的這個時間。該時間為Linux 內核的時鐘系統所維護,并且被定時中斷程序所驅動,該時間僅當Linux 系統運行過程中有意義。該系統時間表示為以UTC(通用協調時間,Universal Time Coordinated) 計算,自1970 年1 月1 日0時0 分0 秒起至當前時刻所經過的秒數(該數字不是整數,以小數方式表示精度)。
**硬件時鐘系統:**該時鐘系統的運行獨立于任何系統控制程序,在CPU 內部運行,既使系統斷電,該時鐘系統仍然保持運行。硬件時鐘系統由主板電池供電來維持運行,系統開機時要讀取這個時間。此時鐘系統常常被稱為實時時鐘系統(RTC)、 BIOS 時鐘系統或CMOS 時鐘系統。
2. “UTC時間”與“本地時間”
**UTC時間:**Coordinated Universal 8 e2 i( H7 t0 ^/ ^Time 世界協調時間(又稱世界標準時間、世界統一時間),在一般精度要求下,它與GMT(Greenwich Mean Time,格林威治標準時間)是一樣的,其實也就是說 GMT≈UTC,但 UTC 是以原子鐘校準的,更精確。
**本地時間:**由于處在不同的時區,本地時間一般與UTC是不同的,換算方法就是:本地時間 = UTC + 時區 或 UTC = 本地時間 - 時區
時區東為正,西為負,例如在中國,本地時間都使用北京時間,在linux上顯示就是 CST(China Standard Time,中國標準時,注意美國的中部標準時Central Standard Time也縮寫為CST,與這里的CST不是一回事!),時區為東八區,也就是 +8 區,所以 CST=UTC+(+8小時) 或 UTC=CST-(+8小時)。
UTC=false —> 硬件時鐘是否為 UTC 或者說 GMT 時鐘
把硬件時鐘設置為 UTC 的好處就是他能自動設置夏時制,缺點是,在安裝有多重操作系統啟動的機器上,在另外的操作 系統上時鐘會錯誤。
####二、linux與windows雙系統間的時間同步
系統啟動和關閉時,硬件時間與系統時間之間的同步有兩種方式(假設在中國,用CST代表本地時間):
方式A: 使用UTC(對linux就是 /etc/sysconfig/clock 中 UTC=true)
開機: BIOS------->UTC(將BIOS中的時間看成是UTC)------(時區變化)----->CST
關機: CST -------(時區變化)----->UTC-------存儲到------>BIOS
方式B: 不使用UTC(對linux就是 /etc/sysconfig/clock 中 UTC=false)
開機: BIOS--------------------->CST(將BIOS中的時間看成是CST)
關機: CST ---------存儲到------>BIOS
通過設定 /etc/sysconfig/clock,linux可以支持這兩種方式,然而windows只支持方式B(至少是默認支持B,而我不知道怎么能讓它支 持A),那么在雙系統情況下,如果linux設成A方式,那么在linux與windows系統切換時一定會造成時間混亂的,解決辦法就是將linux中 的UTC禁用,也設成B方式就可以了。
注:可以通過 hwclock --hctosys 來利用硬件時間來設置系統時間(注意不是簡單的復制BIOS中的時間為系統時間,要看是否使用UTC,如果使用的話則要做時區換算),通過 hwclock --systohc 來根據系統時間設置硬件時間(也要看是否啟用UTC來決定是否做時區換算)。
總之,不論使用 --systohc 還是 --hctosys,同步后直接運行不帶參數的 hwclock 得到的時間與直接運行 date 得到的時間應該一致,這個時間是否就是BIOS中的時間(hwclock --localtime)那就不一定了,如果啟用了UTC就不是,沒啟用UTC就是。
而且還要注意:在系統中手動使用 hwclock hwclock --set --date='yyyy-mm-dd' 來設置BIOS時間只在系統運行時有效,因為當系統關閉時,還會按設定好的方式根據系統時間來重設BIOS時間的,于是手動的設置便被覆蓋掉了。
####三、一些理解和總結
#####1)/etc/sysconfig/clock
只對 hwclock 命令有效,且只在系統啟動和關閉的時候才有用(修改了其中的 UTC=true 到 UTC=false 的前后,執行 hwclock --systohc –localtime或重啟系統后才生效);#待考察?
在 /etc/sysconfig/clock 中 UTC=false 時,date、hwclock、hwclcok --localtime 輸出的時間應該都一致,且此時 hwclock --utc是沒有意義的;
在 /etc/sysconfig/clock 中 UTC=ture 時,date、hwclock 的輸出是一致的,hwclock --localtime 的輸出則是UTC時間;
注:如果設置 UTC=false 并重啟系統后,執行一些命令結果如下:
#date
2009年 12月 07日 星期一 19:26:29 CST
#date -u
2009年 12月 07日 星期一 11:26:29 UTC# hwclock # hwclock
2009年12月07日 星期一 19時26分30秒 -0.442668 seconds# hwclock –utc # hwclock –utc
2009年12月08日 星期二 03時26分31秒 -0.999091 seconds# hwclock --localtime # hwclock --localtime
2009年12月07日 星期一 19時26分32秒 -0.999217 seconds
可見,如果不使用UTC,BIOS時間就是系統本地時間,而且注意這時執行 hwclock --utc 得到的結果沒有任何意義,因為這里我們已經禁用了UTC,而且也明顯不符合“本地時間=UTC+時區”的關系。
#####2)/etc/rc.d/rc.sysinit
run once at boot time,其中有從硬件時鐘同步時間到系統時間的操作;
#####3)/etc/localtime
這個文件用來設置系統的時區,將 /usr/share/zoneinfo/ 中相應文件拷貝到/etc下并重命名為 localtime 即可修改時區設置,而且這種修改對 date 命令是即時生效的。不論是 date 還是 hwclock 都會用到這個文件,會根據這個文件的時區設置來進行UTC和本地之間之間的換算。
#####4)輸出不帶時區的時間
設置export LANG=C ,然后再運行 hwclock 就沒有什么CST了,免得時區誤導你;
#####5)hwclock命令
直接調用 /sbin/hwclock 顯示的時間就是 BIOS 中的時間嗎?未必!這要看 /etc/sysconfig/clock 中是否啟用了UTC,如果啟用了UTC(UTC=true),顯示的其實是經過時區換算的時間而不是BIOS中真正的時間,如果加上 --localtime 選項,則得到的總是 BIOS 中實際的時間.
hwclock --localtime
這個輸出的結果才是硬件時鐘真正的時間。如果輸出結果帶時區(比如CST),還要看/etc/sysconfig/clock里的UTC參數,如果 UTC=false,那時區有意義;如果 UTC=true,那時區沒意義,實際上是UTC時間。
hwclock --utc 很鬧騰,還是別看了,你會暈的。。。
系統關閉時會同步系統時間到硬件時鐘,系統啟動時會從硬件時鐘讀取時間更新到系統,這2個步驟都要根據 /etc/sysconfig/clock 文件中UTC的參數來設置時區轉換。
為了保持系統時間與CMOS時間的一致性,Linux每隔一段時間會將系統時間寫入CMOS。由于該同步是每隔一段時間進行的,在執行完 date -s 命令后,如果馬上重起系統,修改的時間就有可能沒有被寫入CMOS。如果要確保修改生效,最好再使用 clock -w 這個命令將系統時間強行寫入CMOS。【關于隔一段時間會將系統時間寫入硬件的問題,經過測試,好像沒有自動寫入,準確性待考察】
#####6)實際案例分析:修改了 /etc/sysconfig/clock 中UTC參數但系統未正常關閉的情況
修改 /etc/sysconfig/clock 文件后,如果系統內核突然崩潰,然后直接按電源重啟,則系統沒有進行 系統時間到硬件時鐘的 同步;但是 系統啟動時,又根據 /etc/sysconfig/clock 中UTC的參數,來同步硬件時鐘到系統,這時就會出現時間問題:
0)假設系統的時區為CST(UTC+8);
1)假設原 /etc/sysconfig/clock 中 UTC=true,修改成 UTC=false;
2)如果此時系統未正常關機,系統時間未按參數 UTC=false 同步時間到硬件時鐘(沒有+8小時);
3)但系統被按電源重啟后,系統讀取到UTC=false,認為硬件時鐘為CST時間,直接用于系統時間;
4)那么此時,系統時間將少了8小時。
部分轉自:http://www.sealinger.com/archives/221/
總結
以上是生活随笔為你收集整理的linux的系统时钟,【总结】linux系统时间和硬件时钟问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 屏幕打磨划痕注意了,小心产生亮点,黄点,
- 下一篇: 2020-JAVA-大数据-面试汇总