首页>科技 > 正文

详解在 linux 下的时间校对工具 adjtimex 使用介绍

2021-01-20 13:55:36来源: 51CTO博客

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

责任编辑:

免责声明