adjtimex(2012-12-07 16:14)
原文地址:adjtimex作者:rha030 http://blog.chinaunix.net/uid-22861548-id-3433043.html
通常调整linux系统时间和RTC时间走的一致有很多方法,在存在时间服务 器的网络内,可以利用linux系统带的NTP服务来定时同步系统时间,这是个很简便 的方法,但当不具备这些条件的时候,利用系统内部提供的时间修正工具同样可以 完成这项工作,而这个工具就是adjtimex。
adjtimex是用来显示或者修改linux内核的时间变量的工具,他提供了对 与内核时间变量的直接访问功能,可以实现对于系统时间的漂移进行修正。任何用 户都可以用adjtimex命令察看时间变量,但只有root用户才可以更改这些参数。另 外,在RHEL5上需要安装adjtimex这个软件包,而在 RHEL4的安装光盘上是没有的。
首先介绍一下adjtimex的使用
语法:adjtimex [OPTION]… 主要参数说明:
-p, –print 输出内核时间变量的值
-t, –tick val 设置内核时钟计数间隔
-f, –frequency newfreq 设置系统时钟偏移量
-c, –compare[=count] 比较系统时钟和CMOS时钟
-i, –interval tim 设置时钟比较间隔时间 (sec)
-l, –log[=file] 将当前时间记录到文件中
–host timeserver 查询时间服务器
-u, –utc 将CMOS时钟设置成UTC
下面介绍一下具体的使用:
#adjtimex -c
--- current --- -- suggested --
cmos time system-cmos error_ppm tick freq tick freq
1239841138 28861.471817
1239841148 28861.471815 -0.2 9983 6106772
1239841158 28861.471818 0.3 9983 6106772 9983 6086476
1239841168 28861.471827 0.9 9983 6106772 9983 6045850
1239841179 28861.471828 0.1 9983 6106772 9983 6099602
1239841189 28861.471834 0.5 9983 6106772 9983 6072413
1239841199 28861.471837 0.3 9983 6106772 9983 6086475
1239841209 28861.471839 0.2 9983 6106772 9983 6092725
介绍一下各个参数:
cmos time硬件RTC时间(距离1970年1月1日的秒数);
system-cmos:系统时间和RTC相差的时间(单位:s);
error_ppm:表示系统时间在当前的tick周期内system-cmos的对比值快了还是慢了
前面的tick/freq字段表示当前内核时钟计数间隔,系统时钟偏移量(tick默认值 为10s=10000ms)
后面的tick/freq表示系统对tick和freq的推荐值,用这个值可以对系统时间进行 校正。
取一行来解释:
1239841158 28861.471818 0.3 9983 6106772 9983 6086476
通过计算:
system-cmos:28861.471818 :系统时间和RTC相差的时间为28861.471818s
具体解释为:时差8小时=8*3600=28800s,系统时间比cmos时间快了 61.471818s
error_ppm:0.3:表示系统时间在当前的tick周期内,error_ppm = second_diff/interval*1000000;
(28861.471818[当前的system-cmos]-28861.471815[上次采样的system- cmos]) /10s*1000000=0.3 相当于3us.
tick:9983:表示内核时钟计数间隔为9983ms
freq:6106772:表示当前系统时钟偏移量
对于adjtimex,需要清楚可以调整的时间数量级:
9000 <= tick <= 11000
-33554432 <= frequency <= 33554432
对于时间的调整,一般使用-t这个参数。而对于微妙级别的需要使用-f参数。
(1)首先看error_ppm,系统比实际RTC快还是慢。分别为正值和负值。
(2)确认时间相差的数量级:
(3) 计算参照值:
系统tick和freq的平均值
t[参照]=error_ppm*0.01
f[参数]=error_ppm*0.1*65536
(4) 计算命令参数需要的数值:
对于ms数量级:
如果系统比实际时间快:
t[参数]=tick平均值-t[参照]平均值 执行: adjtimex -t t[参数]
如果系统比实际时间慢:
t[参数]=tick平均值+t[参照]平均值 执行: adjtimex -t t[参数]
对于us数量级:
如果系统比实际时间快:
f[参数]=tick平均值-f[参照]平均值 执行:adjtimex -f f[参数]
如果系统比实际时间慢:
f[参数]=tick平均值+f[参照]平均值 执行:adjtimex -f f[参数]
举一个实例-t参数使用:
(1)首先调整系统时间,使得RTC时间和系统时间一致
(2)#adjtimex -c
--- current --- -- suggested --
cmos time system-cmos error_ppm tick freq tick freq
1239843830 28861.482212
1239843840 28861.499212 1700.0 10000 6106772
1239843850 28861.516221 1700.9 10000 6106772 9983 6047675
1239843860 28861.533226 1700.5 10000 6106772 9983 6072675
1239843870 28861.550227 1700.1 10000 6106772 9983 6097676
1239843880 28861.567236 1700.8 10000 6106772 9983 6053925
1239843890 28861.584237 1700.1 10000 6106772 9983 6099238
1239843900 28861.601242 1700.5 10000 6106772 9983 6072676
(3)系统比RTC快了1700us,需要使用-t参数
t[参照]=error_ppm*0.01=1700*0.01=17
t[参数]=tick平均值-t[参照]平均值=10000-17=9983
执行:adjtimex -t 9983
(4)#adjtimex -c
--- current --- -- suggested --
cmos time system-cmos error_ppm tick freq tick freq
1239844092 28861.923291
1239844102 28861.923289 -0.3 9983 6106772
1239844112 28861.923293 0.4 9983 6106772 9983 6080225
1239844122 28861.923294 0.1 9983 6106772 9983 6098975
1239844131 28861.923293 -0.1 9983 6106772 9983 6111475
1239844141 28861.923293 0.0 9983 6106772 9983 6105225
1239844151 28861.923294 0.0 9983 6106772 9983 6105225
1239844161 28861.923288 -0.6 9983 6106772 9983 6145849
(5)可以看到现在系统和实际的RTC时间相差很小了。
转载于:https://blog.51cto.com/laowafang/1118063