查看完整版本: [-- Debian 系統時間BUG解決 --]
如果給你陽光,請隨便燦爛 -> 〖Unix/Linux〗 -> Debian 系統時間BUG解決 [打印本頁] 登錄 -> 註冊 -> 回覆主題 -> 發表主題
violetmoon 2008-05-16 22:07
先說時區的配置。以前Debian有個好用的時區配置工具,叫tzconfig,現在也沒有了。但配置時區倒也簡單,主要是兩個文件:
/etc/localtime
/etc/timezone
timezone這個文件是個文本,裏面只需要寫一行自己的時區就行,我們這裏就是上海,Asia/Shanghai(誰知道爲什麼不是北京呢?)。 localtime這個文件的類型不清楚,裏面就寫了些timezone data,它可以從系統自帶時區文件那裏拷貝,位置在:
/usr/share/zoneinfo
從這個目錄下找到Shanghai拷貝到/etc下的localtime即可。有人說建個連接也可,這樣還可以保證系統數據有變化時不必再管。
設定了時區,還要確定Linux的時間方案。Linux支持UTC時間,Coordinated Universal Time,也就是世界協調時,也就是本初子午線上的時間,它和以前的格林威治標準時(GMT)的區別似乎是它是由多個原子鐘平均出來的。在 /etc/default/rcS這個文件中,設定了系統是否使用UTC,UTC=yes就是用。
計算機自己還有自己的時間,也就是硬件時間,hard clock,也就是存在BIOS裏那個時間,關機也不會丟失。計算機啓動時,就要讀取這個時間。這個時間如果設定爲UTC(GMT),也就是倫敦那地方的時間,就要在rcS文件中設定UTC=yes,反之則要設爲no。
總之就是兩種正確的設置:
BIOS=本地時間,UTC=no
BIOS=UTC時間,UTC=yes
一般來講,BIOS裏面都設定爲當地時間,這是因爲如果裝雙系統的話,Windows似乎不懂utc,就會出問題。這時UTC=no。
如果一切順利,到這時,進入Linux之後顯示的時間應該是正確的了。但不少人的機器,包括這回這臺640m,仍舊不正確,而是比正確時間再往前跑了8小時。這裏的問題出在Linux讀取硬件時間上了。
Linux讀取這個硬件時間要用到hwclock這個命令:
hwclock --show :顯示硬件時間
hwclock --systohc :將系統時間寫入硬件
hwclock --hctosys :將硬件時間寫入系統時間
在出問題的時候,hwclock 這一組命令的運行通常是不能成功的,錯誤經常是這樣的:
select() to /dev/rtc to wait for clock tick timed out
也就是不能讀取/dev/rtc,也就是硬件時間。這又是因爲某些機器的BIOS處理方式和Linux的rtc內核模塊之間出現了問題。
Linux又有3個這類模塊,rtc/genrtc/rtc_dev,似乎是一個比一個新,而debian通常自己用的是rtc這個老模塊;但 Dell/ibm/acer等等廠商現在都可能使用新的BIOS,這種BIOS和這個rtc就可能不對付。如果出現了上面那個timeout的問題,有兩種方法可以解決:
1, 給hwclock加參數,--directisa,也就是:
hwclock --directisa --show
如果運行成功,說明這個辦法可行。則把此參數添加爲hwclock的缺省參數即可。在debian 4.0之後,可以直接在/etc/default/rcS中添加一行:
HWCLOCKPARS="--directisa“
而在4.0以前,可能只能在hwclock啓動腳本中添加,/etc/init.d/hwclock.sh,把裏面的”/sbin/hwclock“ 全部替換爲 ”/sbin/hwclock --directisa"。現在在debian sid中,這個腳本的第一行其實是HWCLOCKPARS=,也可以像rcS一樣添加參數了。
2, 換用其他內核rtc模塊,用如下方法測試哪個模塊好用:
# modprobe rtc
# hwclock --show
# rmmod rtc
# modprobe genrtc
# hwclock --show
# rmmod genrtc
# modprobe rtc_dev
# hwclock --show
# rmmod rtc_dev
沒有顯示time out的就是好用的了,然後可以在blacklist中阻止不好用的,在modules裏面加上好用的那個。
用完這兩個方法,hwclock應該能直接工作了,也就是可以讀取硬件時間了。再配上utc設置正確,重啓之後時間就是對的了。
爲了讓BIOS時間更準確,除了可以找個精確的時間源,比如CDMA手機或是GPS,靠自己的手指來精確設定BIOS時間之外,還可以用hwclock把準確的時間寫入BIOS。前一種方法細心點可以做到幾秒誤差,而後一種怎麼也在1秒以下了。
安裝ntpdate這個包,它可以從時間服務器上讀取到正確的時間,精度還是很高的:
aptitude install ntpdate
ntpdate pool.ntp.org
此時系統時間就已經是ntp的時間了,相當精確,把它寫入硬件:
hwclock --systohc
這樣BIOS時間也就很準了。以後開機沒網絡,沒辦法運行ntpdate的時候也都是準的。
這裏的關鍵有:bios時間,utc設定,rtc模塊,hwclock讀取,ntpdate對時。
在Debian的老bug裏還看到因爲系統有多個分區,比如/usr單獨分,fsck運行時會對時,並因此又造成快幾個小時的問題,不知道怎麼處理的。
在新裝Debian的時候,重啓後就會進入base-config程序。
提示你是否設定時間爲GMT,選否,時區選shanghai。
如果你選擇失誤,就會被時間的不準所困擾,下面是解決方案。
第一步#編輯文件/etc/timezone爲以下內容
Asia/Shanghai
第二步# date MMDDhhmmCCYY
設定系統時間和硬件時間爲MM/DD hh:mm, CCYY。
顯示時間爲本地時間而硬件時間使用UTC。
例1:設置時間爲下午14點36分。
# date -s 14:36:00
Fri Nov 26 14:15:00 CST 1999
例2:設置時間爲1999年11月28號。
# date -s 991128
Sun Nov 28 00:00:00 CST 1999
第三步# hwclock --utc --systohc
第四步# hwclock --show
附錄:
UTC Universal Time Coordinated,世界標準時間
GMT Greenwich Mean Time,格林尼治時間
CST China standard Time ,中國標準時間
#date -u 顯示標準時間
四 3月 10 03:51:56 UTC 2005
#date 顯示本地時間
四 3月 10 11:52:54 CST 2005