Kbase #3: Aliyun Linux 2 实例启动或重启后系统时间同步存在延时-阿里云开发者社区

开发者社区> 云计算> 正文

Kbase #3: Aliyun Linux 2 实例启动或重启后系统时间同步存在延时

简介: 问题解决状态:已解决 1. 问题所处环境 / Environment 镜像ID:aliyun-2.1903-x64-20G-alibase-20190327.vhd内核版本:kernel-4.19.24-10.al7.x86_64 或更旧版本 2. 问题描述 / Issue 1、ECS 上,Aliyun Linux 2.1903 镜像启动后,内核的时间一直与 ntp 相差8个小时,重启后可 100% 复现;2、执行 hwclock -w 无法更改内核时间。

问题解决状态:已解决

1. 问题所处环境 / Environment

镜像IDaliyun-2.1903-x64-20G-alibase-20190327.vhd
内核版本kernel-4.19.24-10.al7.x86_64 或更旧版本

2. 问题描述 / Issue

1、ECS 上,Aliyun Linux 2.1903 镜像启动后,内核的时间一直与 ntp 相差8个小时,重启后可 100% 复现;
2、执行 hwclock -w 无法更改内核时间。

3. 解决手段 / Resolution

3.1 临时解决方案

/etc/rc.d/rc.local 中增加 hwclock --hctosys ,使得在启动过程中同步。

echo "hwclock --hctosys" >>/etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local

3.2 最终解决方案

升级内核至 kernel-4.19.34-11.al7.x86_64 或更新版本。

4. 根因分析 / Root Cause

硬件时钟RTC是正确的,同时也设置了 _set-local-rtc_,但没有在启动过程中同步到 local time(system time)。
需要在内核打开相应的内核配置:

# Set system time from RTC on startup and resume
CONFIG_RTC_HCTOSYS=y
#  RTC used to set the system time
CONFIG_RTC_HCTOSYS_DEVICE="rtc0"

5. 分析步骤 / Diagnostic Steps

1、执行 journalctl,发现 chronyd 在打印选择时钟源时,存在约8小时的跳变;如:

......
Apr 22 09:18:56 iZuf6h1kfgutxc3el68z2lZ systemd[1]: Started Session c1 of user root.
Apr 22 17:19:20 iZuf6h1kfgutxc3el68z2lZ chronyd[1696]: Selected source 120.25.115.20
......

2、重启后执行 timedatectl,发现RTC的时间是正确的,但Local时间不对,数秒后会同步;

# timedatectl
      Local time: Mon 2019-04-22 09:22:30 CST
  Universal time: Mon 2019-04-22 01:22:30 UTC
        RTC time: Mon 2019-04-22 17:22:30
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: yes
      DST active: n/a

Warning: The system is configured to read the RTC time in the local time zone.
         This mode can not be fully supported. It will create various problems
         with time zone changes and daylight saving time adjustments. The RTC
         time is never updated, it relies on external facilities to maintain it.
         If at all possible, use RTC in UTC by calling
         'timedatectl set-local-rtc 0'.

3、读取 /sys/class/rtc/rtc0/hctosys 为0,且手动执行 hwclock --hctosys 会立即同步。

# cat /sys/class/rtc/rtc0/hctosys
0

4、阅读内核代码,发现当 CONFIG_HCTOSYS 内核配置项关闭时,系统初始化过程中,start_kernel() 中会调用 timekeeping_init() 初始化 system time 的初始值,其中调用 read_persistent_clock64() 读取 persistent clock 的值,实际读取 RTC time,并用于设置 system time 的初始值。

在物理机环境下,read_persistent_clock64() 实际读取 RTC time,并将 system time 设置为读取的 RTC time,这个结果是符合预期的。

在KVM虚拟化环境下,read_persistent_clock64() 实际调用 kvm_get_wallclock(),其返回的值从结果上来看应该来自 UTC 格式的 host system time,此时当 RTC time 为 local time 格式时,VM 中 system time 就与 RTC time 相差 8 个小时 (假设时区为 CST),这是不符合预期的。

而当内核 CONFIG_HCTOSYS 配置项开启时,内核初始化过程中会调用 rtc_hctosys(),将 system time 重新设置为 RTC time,因此结果也是符合预期的。

6. 外部链接 / Reference Links

N/A

版权声明:本文中所有内容均属于阿里云开发者社区所有,任何媒体、网站或个人未经阿里云开发者社区协议授权不得转载、链接、转贴或以其他方式复制发布/发表。申请授权请邮件developerteam@list.alibaba-inc.com,已获得阿里云开发者社区协议授权的媒体、网站,在转载使用时必须注明"稿件来源:阿里云开发者社区,原文作者姓名",违者本社区将依法追究责任。 如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
云计算
使用钉钉扫一扫加入圈子
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

其他文章