Next Previous Contents

2. 使用``clock''程式

所有你須要知道的內容都在 clock(8) 的說明中, 而本文將帶領各位完成整個設定程序.

注意

要執行``clock''或是其它會影響到系統時間和 CMOS 時鐘的程式, 你必須擁有 root 的權限.

2.1 檢查你的作業系統

檢查你作業系統的開機執行檔中是否有類似``clock -a''或 ``clock -ua''的命令. 這個命令可能放在 /etc/rc.local ,或 /etc/rc.d/rc.sysinit , 或其它類似的地方, 這要看你安裝的是那一套 Linux 作業系統.

如果找到的命令是 ``clock -s'' 或 ``clock -us'' , 請將 ``s'' 更改成 ``a'' , 接著檢查看看是否有 /etc/adjtime 這個檔案, 該檔案的內容只有一行看起來像是這樣:

0.000000 842214901 0.000000

這些數字依序是校正因子 (每天偏差的秒數), 上一次校正時鐘的時間 (由 Jan 1, 1970 開始起算的秒數), 上一次校正所扣除的秒數. 如果你找不到這個檔案, 請以 root 的身份產生此檔案, 其內容只有一行看起來像是這樣 (全部是零):

0.0 0 0.0

然後透過 shell 手動執行 ``clock -a'' 或 ``clock -ua'' 以便更新第二個數字 (如果你的時鐘被設定成協調國際時間而不是本地時間 你得使用 ``u''這個參數).

2.2 量測時鐘的偏差率

首先你得知道現在到底是幾點鐘 :-). 你機器的本地時間可能是不準確的. 我最喜歡的方法是撥電話到 WWV 的 (303)499-7111 電話報時台 (這是個付費電話). 如果你能夠與網路校時伺服器連上線, 你也可以使用 xntpd 程式集所提供的 ntpdate 程式來校時 (使用 -b 選項以避免系統弄亂 CMOS 時鐘). 或者使用 ``date -s hh:mm:ss'' 以手動方式設定系統時鐘, 不論那一種方法最後都得使用 ``clock -w'' 將系統時間寫入 CMOS 時鐘. 你必須記得最後一次設定時鐘的日期, 所以你得將該日期寫下來放在不會遺失的地方. 如果你使用的是 ntpdate 程式, 執行 ``date +%s'' 然後寫下自從 Jan 1,1970 算起到該程式執行的秒數.

然後等待幾天或幾個星期後之後再回來看看時鐘到底偏差了多少時間. 如果你以手動的方式設定時鐘, 建議至少得等待二個星期之後, 再來計算時鐘偏差率將可得到趨近 .1 sec/day 的結果. 幾個月之後偏差率應該會趨近 .01 sec/day (有些人宣稱應該更準確, 但是我個人持保留的態度). 如果你使用 ntpdate 程式來設定時鐘你可能不必等待太久的時間, 然而不論使用那種方式之後都得做些微調的工作.

你可以使用 cron 在一定的時間周期內執行 ``clock -a'' 以便系統時間能夠與 (校正過的) CMOS時間維持一致性. 其實在你每次開機的時候都會從開機執行檔來執行這個命令, 然而只要常常做上面這個動作就可以達到你準確機器時間的目的.

注意如果系統時間的修正一次超過一秒或是時間往回修正, 有些系統的 clock 程式可能會無法執行. 如果你有這方面的問題, 則可以使用 xntpdntpdate 程式 來逐步地修正時間.

2.3 實例

設定時間

簽入系統並成為 root. 撥電話至 (303)499-7111 (語音), 來聆聽報時的內容. 然後使用鍵盤打出下面幾個字:

date -s hh:mm:ss
一直等到嗶的一聲纔按下 enter 鍵. (如果在此處使用 ``ntpdate'' 程式, 則你可以省略撥電話的動作) 這個步驟在設定 ``系統時間''. 接著執行:
clock -w
這個步驟將系統時間寫回 CMOS 時鐘讓二者時間一致. 接著執行:
date +%j
(如果在前面使用 ``ntpdate'' 程式你得執行 ``date +%s'') 將其執行的結果記錄下來.

重新設定時間與檢查偏差率

找出你上次寫下來日期. 簽入系統並成為 root. 然後執行:

clock -a
這個步驟將 CMOS 時間寫入系統時鐘讓二者時間一致. 撥電話至 (303)499-7111 (語音), 來聆聽報時的內容. 接著使用鍵盤打出下面幾個字:
date
一直等到嗶的一聲纔按下 enter 鍵, 但是當你等待的時候, 寫下報時的內容, 並且還不要掛上電話. 這個動作是讓你知道目前真正的時間是幾點, 而此時相對你的機器上的時間是幾點. 現在使用鍵盤打出下面幾個字:
date -s hh:mm:00
其中分針部分所設定的數字就是目前報時內容 *之後的* 下一分鐘, 一直等到嗶的一聲纔按下 enter 鍵 (現在可以掛上電話了). 而 hh 的部分則使用機器本地的時針數字即可. 這個步驟在設定 ``系統時間''. 然後執行:
clock -w
將新的 (校正過的) 系統時間寫回 CMOS 時鐘. 然後執行:
date +%j
(或是執行 ``date +%s'' )

你現在手上有三個數字 (二個校正日期及一個正確時間) 於是你可以開始計算偏差率了.

計算校正因子

當你在某一分鐘執行 ``date'' 程式時, 你機器的本地時間是慢還是快呢? 如果是快了, 你必須將之減去一些秒數以符合正確時間, 所以你應該寫下一個負的偏差數值. 如果是慢了,你必須將之加上一些秒數以符合正確時間, 所以你應該寫下一個正的偏差數值.

現在將二個校正日期相減. 如果之前你使用的是 ``date +%j'', 則數值所代表意義為一年的第幾天 (1-365, 或 1-366 如果是閏年). 如果自從你上一次設定時鐘到現在經過1 月1 日你還須要將第二個校正日期加 365 (或 366) 如果之前你使用的是 ``date +%s'' 則數值的單位為秒數, 你必須將之除以 86400 以便取得日數.

如果你的檔案 /etc/adjtime 中已經有校正因子, 你必須將先前已校正過的秒數考慮進來, 如果你校正過度, 這個校正因子的正負號將與你量測到偏差數值相反; 如果你校正不足則二者正負號相同. 將舊的校正因子乘以日數, 然後加上新獲得的偏差秒數 (附註-- 如果二者正負號相同, 你將取得一個較大的偏差數值, 如果二者正負號相反, 你將取得一個較小的偏差數值).

接著將這個總偏差秒數除以日數以便取得新的校正因子, 然後將檔案 /etc/adjtime 中舊的校正因子代換成新的. 最後寫下新的校正日期 (以秒數或日數為單位) 以便下次使用.

這裡是我的 /etc/adjtime 檔案內容:

-9.600000 845082716 -0.250655
(注意每天 9.6 秒則一個月將近有 5 分鐘的偏差!)


Next Previous Contents