chronyd是Linux系统中常用的网络时间同步服务,能够通过NTP协议和网络时间服务器同步系统时间,保障系统时间的准确性。但在实际使用中,部分用户会遇到chronyd已经正常运行且完成同步,系统时间却仍然出现漂移的问题,这类问题大多和RTC或者CMOS硬件时钟相关。

问题成因分析
系统时间分为两部分,一部分是系统运行时内核维护的软件时间,另一部分是主板上的RTC硬件时钟,CMOS则负责存储RTC的相关配置信息。chronyd默认只会同步系统软件时间,不会主动将同步后的时间写入RTC硬件时钟。如果RTC硬件本身存在走时不准的问题,或者CMOS电池电量不足,就会导致系统重启后从RTC读取的时间本身就有偏差,进而出现时间漂移的情况。另外如果系统时区和RTC的时区配置不一致,也会造成时间显示异常。
问题排查步骤
1. 确认chronyd同步状态
首先检查chronyd服务是否正常运行,以及是否已经完成时间同步,执行以下命令:
# 查看chronyd服务状态 systemctl status chronyd # 查看时间同步详情 chronyc tracking
如果chronyc tracking输出中System time的偏差在合理范围内,说明软件时间同步正常,问题大概率出在硬件时钟层面。
2. 检查RTC硬件时钟状态
执行以下命令查看当前RTC硬件时钟的时间:
# 查看硬件时钟时间 hwclock --show # 对比系统时间和硬件时钟时间 date
如果系统时间和硬件时钟时间偏差较大,说明硬件时钟本身存在走时不准的问题。同时可以检查CMOS电池电压,正常电压应该在3V左右,电压过低会导致RTC走时异常。
3. 检查时区配置
确认系统时区和RTC的时区配置是否一致:
# 查看系统时区 timedatectl status # 查看RTC是否使用UTC时区 timedatectl | grep "RTC in local TZ"
如果输出显示RTC in local TZ: yes,说明RTC使用的是本地时区,而如果系统时区配置和RTC时区不匹配,就会出现时间偏差。
问题处理方法
1. 手动同步系统时间到RTC硬件时钟
如果确认chronyd已经同步了正确的系统时间,可以手动将系统时间写入RTC硬件时钟:
# 将系统时间同步到硬件时钟 hwclock --systohc # 再次查看硬件时钟时间确认同步成功 hwclock --show
2. 配置chronyd自动同步硬件时钟
为了避免每次都需要手动同步,可以修改chronyd的配置文件,让其自动将同步后的时间写入RTC硬件时钟。编辑/etc/chrony.conf文件,添加或修改以下配置:
# 允许chronyd将同步后的时间写入RTC硬件时钟 rtcsync
修改完成后重启chronyd服务使配置生效:
systemctl restart chronyd
3. 修复时区配置不一致问题
如果时区配置不一致,可以执行以下命令将RTC配置为使用UTC时区,和系统默认配置保持一致:
# 设置RTC使用UTC时区 timedatectl set-local-rtc 0
4. 更换CMOS电池
如果检查到CMOS电池电压不足,需要关闭服务器电源,更换主板上的CR2032纽扣电池,更换后重新同步时间即可。
验证处理效果
完成上述处理后,可以重启系统,检查重启后的系统时间是否正常,同时可以持续观察几天,确认时间是否还会出现漂移。如果问题仍然存在,可能需要检查主板RTC硬件是否存在故障,必要时更换主板相关硬件。