Adjtimex介绍

Adjtimex介绍

原文链接:http://www.turbolinux.com.cn/turbo/wiki/doku.php?id=system:adjtimex%E7%AE%80%E4%BB%8B

linux系统有两个时钟:一个是由主板电池驱动的“Real Time Clock”也叫做RTC或者叫CMOS时钟,硬件时钟。当操作系统关机的时候,用这个来记录时间,但是对于运行的系统是不用这个时间的。另一个时间是 “System clock”也叫内核时钟或者软件时钟,是由软件根据时间中断来进行计数的,内核时钟在系统关机的情况下是不存在的,所以,当操作系统启动的时候,内核时钟是要读取RTC时间来进行时间同步(有些情况下,内核时钟也可以通过ntp服务器来读取时间) 这两个时钟通常会有一些误差,所以长时间可以导致这两个时钟偏离的比较多,最简单的保持两个时间同步的方法是用软件测出他们之间的误差率,然后用软件进行修正。在每次重新启动系统的时候,系统都会用hwclock命令对时间进行同步。如果内核时钟在每一个时间中断都快或者慢的话,可以用adjtimex命令进行调整,使得RTC和内核时间走的快慢一致。 adjtimex 允许用户来调整内核的时间参数,因此可以改变内核时间的速度,可以用hwclock命令来比较出内核时间和RTC时间的偏移率,然后利用adjtimex 命令根据偏移率来对内核时间进行校正,使得内核时间走的快些或者慢些,当经过调整的内核时间跟RTC时间走的同样快的时候,可以把这个命令行写到启动脚本里面,让每次机器启动的时候都可以把内核的时间参数调整正确。

Adjtimex安装

首先请到下面网址下载:

ftp://ftp.cse.cuhk.edu.hk/pub/redhat/linux/9/en/os/i386/RedHat/RPMS/adjtimex-1.13-6.i386.rpm

然后使用下面指令安装:

# rpm –ivh adjtimex-1.13-6.i386.rpm

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应用

查看当前内核时间变量的信息

# adjtimex -p
       mode: 0
     offset: 0
  frequency: 573135
   maxerror: 16384000
   esterror: 16384000
     status: 65
time_constant: 6
  precision: 1
  tolerance: 33554432
       tick: 10000
   raw time:  1189736934s 800946us = 1189736934.800946

return value = 5

比较系统时钟和CMOS时钟的误差

# adjtimex --compare
                                         --- current ---    -- suggested --
cmos time     system-cmos       2nd diff    tick      freq     tick      freq
1191706436  -1969378.503326 -1969378.503326  10000    573135
1191706446  -1969378.503351      -0.000026   10000    573135
1191706456  -1969378.503359      -0.000007   10000    573135    10000    619952
1191706466  -1969378.503403      -0.000045   10000    573135    10000    866825
1191706476  -1969378.503406      -0.000003   10000    573135    10000    591825
1191706486  -1969378.503454      -0.000048   10000    573135    10000    887140
1191706496  -1969378.503449       0.000005   10000    573135    10000    540265
1191706506  -1969378.503510      -0.000061   10000    573135    10000    973075

2nd diff表示系统时间在10秒周期内快了还是慢了几秒种,如“-0.000026”在这里表示系统时间在10秒钟内慢了0.000026秒(注意,这里系统会连续测试出好几个连续的差别,一般可以参考平均值)。 前面的tick/freq字段表示内核的tick和freq值,后面的tick/freq表示系统对tick和freq的推荐值,用这个值可以对系统时间进行校正。针对上面的误差可以不需要校正,若需要修正可使用adjtimex –t或adjtimex –f指令进行修正。

修正系统时间和CMOS时间之间的误差:

# adjtimex –t 10002

把系统10秒(10000微秒)的长度定义成实际时间的10002微秒,也就是说让系统时间走的快点,也可以说每系统时间走10秒(10000微秒)就快2微秒,从而系统时间跟上了RTC时间,达到了时间校正的目的。

<think>我们正在解决`adjtimex`工具执行时出现`'clock not synchronized'`错误的问题。结合引用内容和历史回答,我们可以推断这个错误通常与系统时钟状态有关。以下将分步骤解析问题原因和解决方案。 ### 问题分析 `adjtimex`报告`clock not synchronized`错误时,表明系统时钟处于未同步状态(通常对应`STA_UNSYNC`状态位)。这可能是由以下原因导致: 1. **NTP服务未完成初始同步**:系统依赖于NTP服务进行时间同步,若NTP未完成同步则时钟标记为未同步状态。 2. **硬件时钟故障**:RTC(实时时钟)硬件异常或驱动存在问题(参考引用[2]中关于hwclock的提示)。 3. **内核配置限制**:部分嵌入式内核可能关闭了时间同步功能(如`CONFIG_RTC_SYSTOHC`未启用)。 ### 解决步骤 #### 步骤1:检查系统时钟同步状态 在开发板上执行以下命令查看时钟状态: ```bash adjtimex -p | grep status ``` - 若输出包含`8192`(即`STA_UNSYNC`的十进制值),则确认时钟未同步[^1]。 #### 步骤2:强制同步系统时钟 ##### 方法A:通过NTP服务同步 ```bash # 启动NTP服务(若已安装) ntpd -gq && systemctl restart ntp # 简易替代方案(使用网络时间服务器) ntpdate pool.ntp.org ``` ##### 方法B:手动设置时间 ```bash # 设置系统时间(示例:2023-10-01 12:00:00) date -s "2023-10-01 12:00:00" # 将系统时间写入硬件时钟(参考引用[2]) hwclock --systohc ``` #### 步骤3:清除未同步标志 通过`adjtimex`清除`STA_UNSYNC`标志位: ```bash adjtimex --status 0 ``` > **原理**:该命令将时钟状态寄存器置零,清除包括`STA_UNSYNC`在内的所有标志位。 #### 步骤4:验证时钟状态 重新检查状态值: ```bash adjtimex -p | grep status # 期望输出:status: 0 ``` ### 嵌入式设备特殊处理 若开发板无NTP服务,需确保至少满足以下条件: 1. **每年校准RTC**(引用[2]关键提示) 创建定时任务每年写入一次硬件时钟: ```bash # /etc/crontab 添加 0 0 1 1 * root /sbin/hwclock --systohc ``` 2. **启用内核配置** 确认内核编译时启用: - `CONFIG_RTC_SYSTOHC=y` - `CONFIG_RTC_HCTOSYS=y` ### 故障排除 - **持续出现`STA_UNSYNC`**:检查RTC驱动是否正常装载: ```bash dmesg | grep rtc # 正常应显示类似:rtc-omap 4805c000.rtc: registered as rtc0 ``` - **权限问题**:`adjtimex`需root权限执行。 ### 相关问题 1. 如何检测嵌入式Linux系统的时钟漂移率? 2. `STA_UNSYNC`状态位在内核时间子系统中的作用机制是什么? 3. 没有RTC硬件的设备如何维持系统时钟? 4. 实时操作系统(RTOS)如何处理时钟同步问题? 5. 时钟未同步状态对POSIX定时器精度有何影响? [^1]: Linux内核文档`Documentation/rtc.txt`中关于时钟状态的说明 [^2]: hwclock手册页中关于RTC维护周期的警告 </think>### 解决 adjtimex 出现 "clock not synchronized" 问题的方法 adjtimex 报错 "clock not synchronized" 表示系统时钟未同步。这通常是由于时钟源状态不稳定或同步机制未完成导致的。以下是完整的解决方法: #### 1. **检查时钟同步状态** ```bash # 查看当前时钟状态 adjtimex -p | grep status ``` - 若输出 `status: 8192`(十进制),表示系统设置了 `STA_UNSYNC` 标志位[^1] - 正常状态值应为 `status: 0` #### 2. **清除未同步标志位** ```bash # 清除 STA_UNSYNC 标志 adjtimex --status 0 ``` > 该命令将时钟状态寄存器重置为零状态 #### 3. **强制时间同步** ```bash # 方法1: 通过NTP强制同步 ntpd -gq # 快速同步时钟 # 方法2: 手动设置时间 date -s "2023-10-01 12:00:00" hwclock --systohc # 写入硬件时钟(参考引用[2]) ``` #### 4. **验证时钟同步状态** ```bash # 检查状态位是否清除 adjtimex -p | grep status # 确认状态值恢复为0 # 检查时间偏移量 adjtimex -p | grep offset # 正常值应在 ±1000 微秒内 ``` #### 5. **内核级解决方案** 若问题持续存在,需检查内核配置: ```bash # 查看内核时钟源配置 cat /sys/devices/system/clocksource/clocksource0/current_clocksource # 推荐切换至稳定时钟源(如ARM开发板) echo tsc > /sys/devices/system/clocksource/clocksource0/current_clocksource ``` #### 6. **排查硬件时钟问题** ```bash # 检查RTC硬件状态 dmesg | grep rtc # 查看唤醒锁状态(参考引用[3]) cat /sys/kernel/debug/wakeup_sources | grep -v " 0" ``` - 确保无异常唤醒锁阻止时钟同步 - 关注 `active_since` 和 `total_time` 异常值 #### 7. **永久性解决方案** 在嵌入式设备中添加启动脚本: ```bash #!/bin/sh # /etc/init.d/clock-sync case "$1" in start) # 清除未同步标志 adjtimex --status 0 # 强制时钟同步 hwclock --hctosys ;; esac ``` ### 根本原因分析 "clock not synchronized" 错误通常由以下原因导致: 1. **系统首次启动**:未初始化硬件时钟(RTC) 2. **电源管理异常**:唤醒锁阻止时钟更新(参考引用[3]) 3. **硬件时钟漂移**:超出内核容忍范围(> ±16,000ppm) 4. **NTP服务未运行**:缺乏网络时间同步 5. **内核配置问题**:`CONFIG_RTC_SYSTOHC` 未启用 ### 相关问题 1. STA_UNSYNC 状态位在内核时间子系统中的作用机制是什么? 2. 如何监测嵌入式设备的时钟漂移率并及时修正? 3. ARM 开发板时钟校准的最佳实践有哪些? 4. 实时操作系统中时钟同步与通用 Linux 有何不同? 5. 硬件唤醒锁如何影响系统时钟的精确性? 6. 无 RTC 硬件的嵌入式设备如何维持时钟同步? [^1]: adjtimex 手册页中关于 STA_UNSYNC 状态标志的说明 [^2]: hwclock 手册页关于硬件时钟校准的周期建议 [^3]: Linux 内核文档中关于 wakeup_sources 的调试信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值