实际上,linux系统有两个时钟:一个是由主板电池驱动的“Real Time Clock”也叫做RTC或者叫CMOS时钟,硬件时钟。当操作系统关机的时候,用这个来记录时间,但是对于运行的系统是不用这个时间的。另一个时间是 “System clock”也叫内核时钟或者软件时钟,是由软件根据时间中断来进行计数的,内核时钟在系统关机的情况下是不存在的,所以,当操作系统启动的时候,内核时 钟是要读取RTC时间来进行时间同步(有些情况下,内核时钟也可以通过ntp服务器来读取时间)

这两个时钟通常会有一些误差,所以长时间可以导致 这两个时钟偏离的比较多,最简单的保持两个时间同步的方法是用软件测出他们之间的误差率,然后用软件进行修正。在每次重新启动系统的时候,系统都会用 hwclock命令对时间进行同步。如果内核时钟在每一个时间中断都快或者慢的话,可以用adjtimex命令进行调整,使得RTC和内核时间走的快慢一 致。

linux的内核时间实际上是记录从1970年1月1日距离现在的秒数,并且以GMT(格林尼治时间)(或者叫UTC- Coordinated Universal Time)为标准,UTC是不随着DST(夏令时)变换,需要有变化的是由应用程序自身来完成时间的转换。

通常,本地时间=UTC时间+时区

在安装linux系统的时候,可能正确设置了时区,但由于某些原因需要调整的时候,请参考以下方法

利用tzselect命令可以修改系统的当前时区,配置文件储存在/etc/sysconfig/clock文件中(Redhat As3)

linux 发行版本中会带有clock(老版本)和hwclock命令,有些还可能安装adjtimex程序,系统在启动的时候会有脚本自动调用 hwclock命令,hwclock命令在设置RTC的时候,可以自动进行时钟偏移校正。注意:如果同时运行其他设置RTC的程序有可能会干扰 hwclock命令的校正功能,因此,运行这些命令的时候请只选择其中一个来运行。

adjtimex 允许用户来调整内核的时间参数,因此可以改变内核时间的速度,可以用hwclock命令来比较出内核时间和RTC时间的偏移率,然后利用adjtimex 命令根据偏移率来对内核时间进行校正,使得内核时间走的快些或者慢些,当经过调整的内核时间跟RTC时间走的同样快的时候,可以把这个命令行写到启动脚本 里面,让每次机器启动的时候都可以把内核的时间参数调整正确。

因此应该已经清楚,计算机是有两个时钟的,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在本文写作的时候在如下连接可以找到

Author Info :

引用:http://blog.csdn.net/huaxi1902/article/details/8761763

posted on 2013-11-13 11:33 回忆之城 阅读(214) 评论(0)  编辑 收藏 引用

linux 时间 偏差,【转】Linux系统时间偏差的纠正 adjtimex相关推荐

  1. Linux下通过命令设置系统时间

    Linux下通过命令设置系统时间: date -s "09/22/2012 09:30:30" clock -w

  2. Linux —— 时间(date设置系统时间)

    Date命令的作用:以给定的格式显示当前的时间,或者设置系统时间 一.了解date命令的参数 date命令使用方式: 用法:date [选项]... [+格式] 或:date [-u|--utc|-- ...

  3. 获取系统时间出错oracle-,oracle 获取系统时间(转)

    Oracle中如何获取系统当前时间 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; ORACLE里获取一个时间的年.季.月.周.日 ...

  4. js如何获取计算机当前时间,js获取当前系统时间

    搜索热词 下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. var myDate = new Date(); myDate.getYear( ...

  5. Win8系统如何设置时间自动同步方法 电脑系统时间不能同步怎么设置

    Win8系统如何设置时间自动同步方法 电脑系统时间不能同步怎么设置 我们在使用电脑的时候,总是会遇到很多的电脑难题.当我们在遇到了需要在win8系统中对时间设置自动同步的时候,我们应该怎么操作呢?今天 ...

  6. 【Linux】40.date设定系统时间

    date -s 2021-11-16 sync date -s就是date --set 可以强制系统使用本地时间作为实时时钟(硬件时钟): sudo timedatectl set-local-rtc ...

  7. linux在shell中获取系统时间,linux在shell中获取时间

    获得当天的日期 date +%Y-%m-%d 输出: 2011-07-28 将当前日期赋值给DATE变量 DATE=$(date +%Y%m%d) 有时候我们需要使用今天之前或者往后的日期,这时可以使 ...

  8. linux查看和修改当前系统时间

    一.查看和修改Linux的时区 1. 查看当前时区 命令 : "date -R" 2. 修改设置Linux服务器时区 方法 A 命令 : "tzselect" ...

  9. linux 下Qt 如何修改系统时间

    Qt 提供日期时间的类有 QDate QTime 和QDateTime,这三个类. 一.获取系统时间 可以通过三个静态函数来获取 1.QDate::currentDate() 来获取当前系统的日期 2 ...

  10. linux时间树,linux小知识之查看系统时间

    有个朋友想查看服务器一天的网卡流量,但是没有安装cacti.所以我推荐他使用ifconfig查看下网卡流量,然后看下系统运行时间,除出来参考一下.他居然问我系统时间怎么查看.好吧,那我就写篇文章记录下 ...

最新文章

  1. Java多线程相关知识
  2. k8s v1.9.6 超详细搭建步骤
  3. GridView内嵌DropDownList操作
  4. 夏普深陷亏损 郭台铭何以执著寻求“联姻”?
  5. 异常处理程序和软件异常——Windows核心编程学习手札之二十四
  6. .Net 垃圾回收和大对象处理
  7. sohu邮箱outlook设置_Outlook2016如何配置QQ邮箱详细步骤
  8. centos7 如何安装部署k8s_架构运维篇(五):Centos7/Linux中安装部署RocketMQ
  9. 榛子云短信-微信小程序60秒倒计时插件
  10. SmartUpload实现文件上传时file和表单文本同时提交的问题
  11. 主成分分析(PCA)实现代码
  12. 【算法笔记+BZOJ3676】回文串(回文树/回文自动机模版题)
  13. 百度地图api之固定标记点(标记点自己设置样式)
  14. 大数据技术闲侃之岗位选择解惑
  15. 【睡觉中的阿狸!真的被萌到啦】
  16. 打小都说我聪明,自从学了Linux,我才如梦初醒
  17. matlab awgn函数加入高斯白噪声
  18. 什么是BGP线路,跟普通线路有什么不同
  19. 手机php网站开发工具,4款好用的网站开发工具推荐
  20. C/C++中的日期和时间 TIME_T与STRUCT TM转换

热门文章

  1. huntshowdown服务器维护吗,huntshowdown怎么玩?新手玩法指南
  2. 苹果手机如何使用IP直连?
  3. 计算机应用基础第2章相关知识,大学计算机应用基础第2章计算机基础知识.ppt
  4. 第4章 Python 数字图像处理(DIP) - 频率域滤波8 - 二维DFT和IDFT的一些性质 - 二维离散卷积定理
  5. C语言编写学生成绩管理系统
  6. 解决电脑出现 R6034 Runtime Error
  7. DIY植物生长机——《取经篇》
  8. 11贴图控件-09图片背景日历-imagecalendar
  9. java 检查 URL 合法性
  10. Car-创建车机模拟器