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时间相差很小了。