实际上,linux系统有两个时钟。 一种是主板电池的实时时钟,也称为RTC或CMOS时钟,是硬件时钟。 关闭操作系统电源时,使用它来记录时间,但运行的系统不使用这个时间。 另一个时间“系统时钟”也称为内核时钟或软件时钟,软件根据时间中断进行计数。 如果系统已关闭,则内核时钟不存在。 因此,当操作系统启动时,内核时钟将读取RTC时间并进行时间同步。 在某些情况下,内核时钟还可以在ntp服务器上读取时间。)
这两个钟通常有一些误差,所以很长时间内这两个钟经常错位。 最简单的方法是用软件测量他们之间的误差率,用软件修正。 每次重新启动系统时,系统都会使用hwclock命令同步时间。 如果内核时钟的中断每次都快或慢,可以使用adjtimex命令调整RTC以匹配内核时间的前进速度。
linux内核时间实际上记录的是从1970年1月1日到现在的秒数,以格林尼治标准时间(GMT )或统一通用时间(UTC- Coordinated Universal Time )为基准。 UTC是DST )夏时制)的转换过程中,需要更改的是APP应用程序本身完成时间转换。
通常本地时间=UTC时间段
安装linux系统时,时区可能设置正确,但如果出于某些原因需要进行调整,请参考以下方法
可以使用tzselect命令更改存储在/etc/sysconfig/clock文件(Redhat As3 )中的系统的当前时区
linux发行版附带clock (早期版本)和hwclock命令,有些版本可能安装了adjtimex程序。 脚本可以在系统启动时自动调用hwclock命令,而hwclock命令可以在设置RTC时自动进行时钟偏移补偿。 注意:同时运行其他设置RTC的程序可能会干扰hwclock命令的校准功能,因此在运行这些命令时,请只选择其中一个命令进行运行。
在adjtimex中,用户可以调整内核的时间参数,从而更改内核时间的速度。 使用hwclock命令比较内核时间和RTC时间的偏差率,使用adjtimex命令根据偏差率校正内核时间,使内核时间变快或变慢。 如果调整的内核时间以与RTC时间相同的速度前进,请将此命令行写入启动脚本,并在每次计算机启动时
因此,计算机有两个时钟:实时时钟(RTC )和系统时钟,RTC由电池驱动并正常工作,系统时钟只在系统启动后存在,系统时钟通常是精确微妙的
通常有许多方法可以调整linux系统的时间和RTC的时间匹配。 在时间服务器所在的网络中,使用linux系统的NTP服务同步系统时间是一种简单的方法,但如果不存在这些条件,也可以使用系统内部提供的时间修改工具进行同步
在Redhat linux系统下有一个名为adjtimex的工具
adjtimex是一个用于查看或修改linux内核时间变量的工具,提供对内核时间变量的直接访问,并修改系统时间漂移。
虽然可以使用adjtimex命令显示时间变量,但只有root用户可以修改这些参数
在调整系统时间之前,首先应该知道系统时间和RTC时间有多少不同。 也就是说,决定系统时间的漂移率可以通过简单的指令来实现
#adjtimex --compare
----current--------suggested----
cmostimesystem-CMOS2nddifftickfreqtickfreq
124251642-0.658092-0.65809210000
124251652-0.659612-0.00152010000
124251662-0.661111-0.00149910000100013271400
124251672-0.662609-0.00149810000100013263588
124251682-0.664108-0.00149910000100013269838
124251692-0.665607-0.00149910000100013269838
124251702-0.667104-0.00149710000100013257338
124251712-0.668605-0.0015011000010002-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在本文写作的时候在如下连接可以找到
Author Info :
引用:http://blog.csdn.net/huaxi1902/article/details/8761763
posted on 2013-11-13 11:33 回忆之城 阅读(214) 评论(0) 编辑 收藏 引用