什么是硬件時鐘?
????記錄在CMOS中的時鐘,和系統是沒有關系的。是靠紐扣電池來保存和計數的。硬件時鐘能記錄的信息有且僅有一個時間值(注意,和時區沒有一毛錢關系)。所以,當我們設置硬件時鐘的時候,僅僅是設置了一個數值。當我們讀取硬件時鐘的時候,也僅僅是一個數值。
????每次操作系統啟動的時候,都會讀取這個數值,然后同步到系統時鐘中。但是光讀取這個數值,對操作系統而言毫無意義(它不知道,你這個數值具體是哪個時區下的時間,自然就無法同步到系統時鐘)
????那么怎么知道硬件時鐘記錄的時間是哪個時區的呢(local or utc)?只能是人為指定了(系統啟動的時候,自己指定。我認為系統自己指定也是人為指定的一種吧),我們下面看下例子(一個讀,一個寫),看看怎么解釋(網上很多解釋我覺的不靠譜)
hwclock(讀硬件時鐘)
hwclock --set --date="2015-08-14 16:45:05"(寫硬件時鐘)
這里哪里能看出人為指定的時區是什么呢?
缺省的就是這個文件/etc/adjtime指定的(很多人說centos 6中是/etc/sysconfig/clock這個文件。不解釋了,忘記這個文件吧)
看下/etc/adjtime的內容:
0.000000 1563504450 0.000000
1563504450
UTC
這里是UTC,所以上面的讀寫含義分別是
????讀取出來的這個硬件時間是UTC的,直接同步到系統時間(我認為系統時間存的是UTC時間)。如果讀取出來的時間是LOCAL的,是不能直接同步系統時間的。先找到系統的時區文件/etc/localtime,根據當前時區計算出UTC時間,再同步到系統時間(還有一點,這里說一下,hwclock讀取的時候,最后都是以local時間顯示出來的,所以可能還有一層轉換)
????把"2015-08-14 16:45:05"這個時間直接寫入硬件時鐘,同時更新/etc/adjtime的內容(方便下一次讀的時候,找到正確的時區)
那怎么覆蓋/etc/adjtime的內容呢?
????在讀寫的時候可以顯示指定,例如hwclock --local,hwclock --utc(如果不顯示指定,則使用/etc/adjtime的值)