本文意在介绍在linux系统下如何调整系统时间与硬件时钟匹配的问题,有关原理部分请参考如下文章
http://www.chinalinuxpub.com/read.php?wid=1075
因此应该已经清楚,计算机是有两个时钟的,RTC(Real Time Clock)和系统时钟,RTC由电池驱动,始终工作,系统时钟只存在于系统启动后,系统时钟通常比较精确,可以精确到微妙(usec),而RTC时间是始终存在的,可以长期稳定的运行。
通常调整linux系统时间和RTC时间走的一致有很多方法,在存在时间服务器的网络内,可以利用linux系统带的NTP服务来定时同步系统时间,这是个很简便的方法,但当不具备这些条件的时候,利用系统内部提供的时间修正工具同样可以完成这项工作
Redhat linux 系统下有一个工具adjtimex便可以完成此工作
adjtimex是用来显示或者修改linux内核的时间变量的工具,他提供了对与内核时间变量的直接访问功能,可以实现对于系统时间的漂移进行修正。
任何用户都可以用adjtimex命令察看时间变量,但只有root用户才可以更改这些参数
在对系统时间进行调整之前,首先应该知道系统时间和RTC时间到底差了多少,也就是决定系统时间的漂移率,可以通过简单命令来实现
#adjtimex --compare
--- current --- -- suggested --
cmos time system-cmos 2nd diff tick freq tick freq
1124251642 -0.658092 -0.658092 10000 0
1124251652 -0.659612 -0.001520 10000 0
1124251662 -0.661111 -0.001499 10000 0 10001 3271400
1124251672 -0.662609 -0.001498 10000 0 10001 3263588
1124251682 -0.664108 -0.001499 10000 0 10001 3269838
1124251692 -0.665607 -0.001499 10000 0 10001 3269838
1124251702 -0.667104 -0.001497 10000 0 10001 3257338
1124251712 -0.668605 -0.001501 10000 0 10002 -3269700
结果显示出两个时钟的差别,第一可以看出2nd diff表示系统时间在10秒周期内快了还是慢了几秒种
这里可以看出系统时间在10秒钟内慢了0.001498秒(注意,这里系统会连续测试出好几个连续的差别,一般可以参考平均值)
第二可以看到两个内核参数 tick 和freq 另外,系统也有一个对tick和freq的推荐值,用这个值可以对系统时间进行校正
从上面结果看系统时钟每10秒慢了-0.001xxx秒(相对于RTC时间),利用-t参数可以重新定义系统时间10秒的长度,由于比实际时间(RTC)慢了1微秒多,因此可以
把系统10秒(10000微秒)的长度定义成实际时间的10001微秒,也就是说让系统时间走的快点,也可以说每系统时间走10秒(10000微秒)就快1微秒,从而系统时间跟上
了RTC时间,达到了时间校正的目的
#adjtimex --tick 10001
#adjtimex -c
--- current --- -- suggested --
cmos time system-cmos 2nd diff tick freq tick freq
1124251994 -0.710396 -0.710396 10001 0
1124252004 -0.710913 -0.000517 10001 0
1124252014 -0.711411 -0.000498 10001 0 10001 3264062
1124252024 -0.711910 -0.000499 10001 0 10001 3270312
1124252034 -0.712413 -0.000503 10001 0 10001 3296875
1124252044 -0.712911 -0.000498 10001 0 10001 3262500
1124252054 -0.713409 -0.000498 10001 0 10001 3264062
1124252064 -0.713908 -0.000499 10001 0 10001 3270312
请注意,时钟的差别已经不到1微秒了,但是还存在大约0.4--0.5微秒的差别,要修正更高单位的差别,-t参数就无能为力了,需要用到偏移量参数-f
请用如下公式决定-f的修正值
f=差值*100000*65536
这里 f=0.000499*100000*65536=3270246.4
#adjtimex -f 3270246
#adjtimex -c
--- current --- -- suggested --
cmos time system-cmos 2nd diff tick freq tick freq
1124252365 -0.728704 -0.728704 10001 3270246
1124252375 -0.728723 -0.000019 10001 3270246
1124252385 -0.728721 0.000002 10001 3270246 10001 3256184
1124252395 -0.728722 -0.000001 10001 3270246 10001 3278058
1124252405 -0.728721 0.000001 10001 3270246 10001 3262434
1124252415 -0.728723 -0.000002 10001 3270246 10001 3284308
1124252425 -0.728719 0.000004 10001 3270246 10001 3243684
1124252435 -0.728721 -0.000002 10001 3270246 10001 3282746
可以看到两个时间已经非常接近了大约10秒种,会相差大约1-3豪秒(usec)
有关tick 和freq的数值,在suggested列里面已经由程序算出推荐值了,也可以参考推荐值
注意adjtimex在本文写作的时候在如下连接可以找到
http://ftp.redhat.com/pub/redhat ... imex-1.13-6.src.rpm