linux下shell命令之hwclock__linux

來源:互聯網
上載者:User

轉載:http://blog.gesha.net/archives/221/ linux系統時間和硬體時鐘問題(date和hwclock) 總結一下hwclock,這個容易暈:

1)/etc/sysconfig/clock 檔案,只對 hwclock 命令有效,且只在系統啟動和關閉的時候才有用(修改了其中的 UTC=true 到 UTC=false 的前後,執行 hwclock (–utc, 或 –localtime) 都沒有變化,要重啟系統後才生效);
2)/etc/rc.d/rc.sysinit 檔案,run once at boot time,其中有從硬體時鐘同步時間到系統時間的操作;
3)hwclock –localtime 的輸出,才是硬體時鐘真正的時間。如果輸出結果帶時區(比如CST),還要看/etc/sysconfig/clock裡的UTC參數,如果 UTC=false,那時區有意義;如果 UTC=true,那時區沒意義,實際上是UTC時間。
4)在 /etc/sysconfig/clock 中 UTC=false 時,date、hwclock、hwclcok –localtime 輸出的時間應該都一致,且此時 hwclock –utc是沒有意義的;
5)在 /etc/sysconfig/clock 中 UTC=ture 時,date、hwclock 的輸出是一致的,hwclock –localtime 的輸出則是UTC時間;
6)如果不想在輸出中帶時區,則 export LANG=C ,然後再運行 hwclock 就沒有什麼CST了,免得時區誤導你;
7)hwclock –utc 很鬧騰,還是別看了,你會暈的。。。
8)系統關閉時會同步系統時間到硬體時鐘,系統啟動時會從硬體時鐘讀取時間更新到系統,這2個步驟都要根據 /etc/sysconfig/clock 檔案中UTC的參數來設定時區轉換。
2、實際案例分析:修改了 /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小時。 一、首先要弄清幾個概念:

“系統時間”與“硬體時間”

系統時間: 一般說來就是我們執行 date 命令看到的時間,linux系統下所有的時間調用(除了直接存取硬體時間的命令)都是使用的這個時間。

硬體時間: 主板上BIOS中的時間,由主板電池供電來維持運行,系統開機時要讀取這個時間,並根據它來設定系統時間(注意:系統啟動時根據硬體時間設定系統時間的過程可能存在時區換算,這要視具體的系統及相關設定而定)。

“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小時)。 二、時間命令

系統時間 date

直接調用 date,得到的是本地時間。如果想得到UTC時間的話,使用 date -u。

[12-01 19:07> ~] date2009年12月07日星期一14:22:20CST[12−0119:07> ] date 2009年 12月 07日 星期一 14:22:20 CST [12-01 19:07> ~] date -u
2009年 12月 07日 星期一 06:22:22 UTC
2. 硬體時間 /sbin/hwclock

直接調用 /sbin/hwclock 顯示的時間就是 BIOS 中的時間嗎。未必。這要看 /etc/sysconfig/clock 中是否啟用了UTC,如果啟用了UTC(UTC=true),顯示的其實是經過時區換算的時間而不是BIOS中真正的時間,如果加上 –localtime 選項,則得到的總是 BIOS 中實際的時間.

[12-01 19:07> ~]# hwclock
2009年12月07日 星期一 14時28分43秒 -0.611463 seconds
[12-01 19:07> ~]# hwclock –utc
2009年12月07日 星期一 14時28分46秒 -0.594189 seconds
[12-01 19:07> ~]# hwclock –localtime
2009年12月07日 星期一 06時28分50秒 -0.063875 seconds
3. /etc/localtime

這個檔案用來設定系統的時區,將 /usr/share/zoneinfo/ 中相應檔案拷貝到/etc下並重新命名為 localtime 即可修改時區設定,而且這種修改對 date 命令是及時生效的。不論是 date 還是 hwclock 都會用到這個檔案,會根據這個檔案的時區設定來進行UTC和本地之間之間的換算。
4. /etc/sysconfig/clock

這個檔案只對 hwclock 有效,而且似乎是只在系統啟動和關閉的時候才有用,比如修改了其中的 UTC=true 到 UTC=false 的前後,執行 hwclock (–utc, 或 –localtime) 都沒有變化,要重啟系統後才生效。註:如果設定 UTC=false 並重啟系統後,執行一些命令結果如下:

date 2009年 12月 07日 星期一 19:26:29 CSTdate -u 2009年 12月 07日 星期一 11:26:29 UTChwclock 2009年12月07日 星期一 19時26分30秒 -0.442668 secondshwclock --utc 2009年12月08日 星期二 03時26分31秒 -0.999091 secondshwclock --localtime 2009年12月07日 星期一 19時26分32秒 -0.999217 seconds

可見,如果不使用UTC,BIOS時間(紅色部分)就是系統本地時間,而且注意這時執行 hwclock –utc 得到的結果沒有任何意義,因為這裡我們已經禁用了UTC,而且也明顯不符合“本地時間=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時間的,於是手動的設定便被覆蓋掉了。 四、執行個體

Linux時鐘分為系統時鐘(System Clock)和硬體(Real Time Clock,簡稱RTC)時鐘。系統時鐘是指當前Linux Kernel中的時鐘,而硬體時鐘則是主板上由電池供電的時鐘,這個硬體時鐘可以在BIOS中進行設定。當Linux啟動時,硬體時鐘會去讀取系統時鐘的設定,然後系統時鐘就會獨立於硬體運作。
Linux中的所有命令(包括函數)都是採用的系統時鐘設定。在Linux中,用於時鐘查看和設定的命令主要有date、hwclock和clock。其中,clock和hwclock用法相近,只用一個就行,只不過clock命令除了支援x86硬體體系外,還支援Alpha硬體體系。

1、date
查看系統時間
# date
設定系統時間
# date --set “07/07/06 10:19" (月/日/年 時:分:秒)
2、hwclock/clock
查看硬體時間
# hwclock --show
或者
# clock --show
設定硬體時間
# hwclock --set --date="07/07/06 10:19" (月/日/年 時:分:秒)
或者
# clock --set --date="07/07/06 10:19" (月/日/年 時:分:秒)
3、硬體時間和系統時間的同步
按照前面的說法,重新啟動系統,硬體時間會讀取系統時間,實現同步,但是在不重新啟動的時候,需要用hwclock或clock命令實現同步。

硬體時鐘與系統時鐘同步:
# hwclock --hctosys(hc代表硬體時間,sys代表系統時間)
或者
# clock --hctosys
系統時鐘和硬體時鐘同步:
# hwclock --systohc
或者
# clock –systohc`

4、時區的設定 tzselect

# tzselectPlease identify a location so that time zone rules can be set correctly.Please select a continent or ocean.1) Africa2) Americas3) Antarctica4) Arctic Ocean5) Asia6) Atlantic Ocean7) Australia8) Europe9) Indian Ocean10) Pacific Ocean11) none - I want to specify the time zone using the Posix TZ format.#? 輸入5,亞洲Please select a country.1) Afghanistan 18) Israel 35) Palestine2) Armenia 19) Japan 36) Philippines3) Azerbaijan 20) Jordan 37) Qatar4) Bahrain 21) Kazakhstan 38) Russia5) Bangladesh 22) Korea (North) 39) Saudi Arabia6) Bhutan 23) Korea (South) 40) Singapore7) Brunei 24) Kuwait 41) Sri Lanka8) Cambodia 25) Kyrgyzstan 42) Syria9) China 26) Laos 43) Taiwan10) Cyprus 27) Lebanon 44) Tajikistan11) East Timor 28) Macau 45) Thailand12) Georgia 29) Malaysia 46) Turkmenistan13) Hong Kong 30) Mongolia 47) United Arab Emirates14) India 31) Myanmar (Burma) 48) Uzbekistan15) Indonesia 32) Nepal 49) Vietnam16) Iran 33) Oman 50) Yemen17) Iraq 34) Pakistan#? 輸入9,中國Please select one of the following time zone regions.1) east China - Beijing, Guangdong, Shanghai, etc.2) Heilongjiang3) central China - Gansu, Guizhou, Sichuan, Yunnan, etc.4) Tibet & most of Xinjiang Uyghur5) southwest Xinjiang Uyghur#? 輸入1,北京時間The following information has been given:Chinaeast China - Beijing, Guangdong, Shanghai, etc.Therefore TZ='Asia/Shanghai' will be used.Local time is now: Fri Jul 7 10:32:18 CST 2006.Universal Time is now: Fri Jul 7 02:32:18 UTC 2006.Is the above information OK?1) Yes2) No#? 輸入1,確認

如果不用tzselect命令,可以修改檔案變更時區。

# vi /etc/sysconfig/clockZONE=Asia/Shanghai(查/usr/share/zoneinfo下面的檔案)UTC=falseARC=false# rm /etc/localtime# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

重新啟動即可。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.