如何设定与维持准确的电脑时钟

资讯 驱动中国 3,429 次阅读
分享 Q

作者:RonBean,rbean@execpc.com
译者:Da-WeiChiang,dawei@sinica.edu.tw
v,December1996翻译日期:2-16July1998
--------------------------------------------------------------------------------

1.介绍
个人电脑(甚至於昂贵的工作站)主机板上所使用的real-time-clock晶片不够准确是众所皆知的事情.然而Linux作业系统提供了一个简单的方法来校正这个不准确的电脑时钟,使得电脑时钟就算是不倚赖外面的校时源也可以达到*相当*准确的地步.但是似乎大多数人都还不知道有这个方法,其原因如下:


在一般``如何设定linux作业系统''的文件中并未述及这个方法,而且在安装作业系统时很难自动地完成设定(但是理论上并不是不可能的,如果你有一台数据机的话).
若你使用``manclock''来查看设定时钟的说明时,你可能会取得非预期的clock(3)说明内容.(试著使用``man8clock'').
似乎大多数人并不在意现在的正确时刻是多少.
那些少数在意的人往往会采用louie.udel.edu所提供的xntpd程式集以便与外面的校时源,例如网路校时伺服器或无线电时钟信号,取得同步.
如果各位对本文所讲述的低阶的时钟设定方法有著极高度的兴趣,我强烈建议各位花些时间来浏览网页http://www.eecis.udel.edu/~ntp/,这个网页有著各类你所感兴趣的内容,例如有关於xntpd的完整资讯以及NIST与USNO等站台的超连结.(我在本文後面也对xntpd作了些许的简介.)


注意
如果你在同一台机器上跑多个作业系统,你应该只让其中一个来重新设定CMOS时钟,如此它们□不会相互影响而导致混乱.假使你平常在同一台机器上跑Linux和Windows二种作业系统,而当你要寻找一些共享的校时程式便时可以忽略Windows作业系统的部分(参考前面所说网页的超连结).


--------------------------------------------------------------------------------
-------------------------------------------------------------------------------

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.0000008422149010.000000

这些数字依序是校正因子(每天偏差的秒数),上一次校正时钟的时间(由Jan1,1970开始起算的秒数),上一次校正所扣除的秒数.如果你找不到这个档案,请以root的身份产生此档案,其内容只有一行看起来像是这样(全部是零):

0.000.0

然後透过shell手动执行``clock-a''或``clock-ua''以便更新第二个数字(如果你的时钟被设定成协调国际时间而不是本地时间你得使用``u''这个参数).

2.2量测时钟的偏差率
首先你得知道现在到底是几点钟:-).你机器的本地时间可能是不准确的.我最喜欢的方法是拨电话到WWV的(303)499-7111电话报时台(这是个付费电话).如果你能够与网路校时伺服器连上线,你也可以使用xntpd程式集所提供的ntpdate程式来校时(使用-b选项以避免系统弄乱CMOS时钟).或者使用``date-shh:mm:ss''以手动方式设定系统时钟,不论那一种方法最後都得使用``clock-w''将系统时间写入CMOS时钟.你必须记得最後一次设定时钟的日期,所以你得将该日期写下来放在不会遗失的地方.如果你使用的是ntpdate程式,执行``date+%s''然後写下自从Jan1,1970算起到该程式执行的秒数.

然後等待几天或几个星期後之後再回来看看时钟到底偏差了多少时间.如果你以手动的方式设定时钟,建议至少得等待二个星期之後,再来计算时钟偏差率将可得到趋近.1sec/day的结果.几个月之後偏差率应该会趋近.01sec/day(有些人宣称应该更准确,但是我个人持保留的态度).如果你使用ntpdate程式来设定时钟你可能不必等待太久的时间,然而不论使用那种方式之後都得做些微调的工作.

你可以使用cron在一定的时间周期内执行``clock-a''以便系统时间能够与(校正过的)CMOS时间维持一致性.其实在你每次开机的时候都会从开机执行档来执行这个命令,然而只要常常做上面这个动作就可以达到你准确机器时间的目的.

注意如果系统时间的修正一次超过一秒或是时间往回修正,有些系统的clock程式可能会无法执行.如果你有这方面的问题,则可以使用xntpd或ntpdate程式来逐步地修正时间.

2.3实例
设定时间
签入系统并成为root.拨电话至(303)499-7111(语音),来聆听报时的内容.然後使用键盘打出下面几个字:

date-shh:mm:ss

一直等到哔的一声□按下enter键.(如果在此处使用``ntpdate''程式,则你可以省略拨电话的动作)这个步骤在设定``系统时间''.接著执行:
clock-w

这个步骤将系统时间写回CMOS时钟让二者时间一致.接著执行:
date+%j

(如果在前面使用``ntpdate''程式你得执行``date+%s'')将其执行的结果记录下来.
重新设定时间与检查偏差率
找出你上次写下来日期.签入系统并成为root.然後执行:

clock-a

这个步骤将CMOS时间写入系统时钟让二者时间一致.拨电话至(303)499-7111(语音),来聆听报时的内容.接著使用键盘打出下面几个字:
date

一直等到哔的一声□按下enter键,但是当你等待的时候,写下报时的内容,并且还不要挂上电话.这个动作是让你知道目前真正的时间是几点,而此时相对你的机器上的时间是几点.现在使用键盘打出下面几个字:
date-shh: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.600000845082716-0.250655

(注意每天9.6秒则一个月将近有5分钟的偏差!)



--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

3.xntpd简介
你的系统实际上有二个时钟--一个是当系统关机继续使用电池电力维持计时功能的``realtimeclock''(也就是所谓的``CMOS时钟'',``硬体时钟'',或``RTC'')而另一个是``kernelclock''(有时称为``软体时钟''或``系统时钟'')系统时钟的跳动是以计时器的中断信号为基准并在开机时从CMOS时钟处载入初始值.这二个时钟有不同的时间偏差率,所以二个时钟上的时间会逐渐地产生偏差,而且也会与``真正的''时间产生偏差.

在xntpd文件中所述及的``theclock''就是指``kernelclock''.当你执行xntpd或timed程式时(或是其他使用到adjtimex系统呼叫的程式)linux作业系统会假定系统时钟比CMOS时钟准确,而且会在开机後每隔11分钟重新设定一次CMOS时间(一直到重开机为止).这意味著``clock''程式不再知道上一次重新设定CMOS时钟的正确时间,所以你不可以使用档案/etc/adjtime中的校正因子.你可以在开机执行档上使用ntpdate程式以便在初次执行xntpd程式之前与校时伺服器对时.如果你在开机的时候一直无法连上准确的校时源,这可能会让你面临到一些困境--实际上xntpd不是被设计来在那种情况之下使用的.

Xntpd包含了许多无线电时钟的驱动程式,并且也可以被设定在一定的周期内拨电话至NIST的电话拨接电脑校时服务(当你设定好电话拨接的周期之後最好先计算一下电话帐单的花费).在与其他的校时源失去联络一段时间之後这个方式也能提供系统时钟一个校正因子.

大部分的无线电时钟大约要花费$3-4K,不过你可以采用较便宜的``gadgetbox''方案(实际上是一个300baud的数据机)他被放在你的电脑与一台短波无线电接收器之间频道调至Canada的CHU校时无线电台(参见网址ftp://ftp.udel.edu/pub/ntp/gadget.tar.Z).而HeathkitWWV接收器(``最准确的时钟'')仍然买的到(但不是一组套件),大约要花费$4-500.目前GPS的讯号里仍然包含有校时的资讯,而且部分的GPS接收器可以接上电脑的串列埠.在最近的未来这可能会成为低价位的解决方案.

理论上,一般人可以自己写程式来使用NIST的电话拨接电脑校时服务以便自动计算CMOS时钟与系统时钟的偏差率.虽然我不知道是否有单独的程式能够达到这个目的,但是大部分的程式码应该可以借用自xntpd程式集.


--------------------------------------------------------------------------------

版权声明:本文由驱动中国整理发布,转载需注明出处与原文链接。如有疑问请联系 editor@qudong.com
本文价值 成为第一个评分的人
登录后为本文打分
网友评论0 条评论
正在回复 的评论取消
评论加载中…
🔐

登录后参与互动

评论、点赞均可赚积分
连续签到、邀请好友也有奖励 🎁

电脑端: 微信扫码登录 微信内: 一键登录

微信扫一扫

打开微信「扫一扫」,分享本文到朋友圈或好友