RTC时间不能往前调

问题来源

在工作中
同事在使用RTC接口时,发现了一个奇怪但又很有意思的问题

linux中使用date设置时间后用hwclock -w同步到RTC,重启后,时间不能往前设置
在使用的时候发现/etc中有一个timestamp,删除就能设置时间;
但是我这边测试一直没有复现同事说的问题,一直没有出现时间戳文件;
出现时间戳之后,也能往前设置时间。

原因分析

1.timestamp时间戳文件怎么生成的,他的作用是什么?

时间戳表示unix当初订立的时间,简单用 1970-1-1 , 0:00:00 到现在经过的秒数

通过grep寻找到/etc/rc6.d/S25save-rtc.sh
内容如下,其实就是生成时间戳文件
在这里插入图片描述
通过对文件系统运行级别的了解
在这里插入图片描述
rc6.d是运行级别是6,即只有reboot的时候才能运行。如上图

到这就解决了为什么我一直没有生成时间戳文件的原因,同事一直是通过reboot重启,而我是通过断电重启。

运行级别相关知识

init进程读取“/etc/inittab”文件中的信进入inittab中预设的运行级别,按顺序运行该运行级别对应文件夹(init*.d)下的脚本,通常情况下,“/etc/rcS.d/”目录下的启动脚本首先被执行,然后是“/etc/rcN.d/”目录。例如你设定的运行级别为5,那么它对应的启动目录为“/etc/rc5.d/”。
在这里插入图片描述

2.思考为什么这个时间戳会导致时间不能往前面设置

通过搜索找到调用timestamp的脚本是/etc/rcS.d/S55bootmisc.sh

在这里插入图片描述
分析到这里,同事很可能如果先设置一个比较未来的时间,
然后reboot重启的话,
会调用/etc/rc6.d/S25save-rtc.sh去生成时间戳;
之后设置比较前的时间,再断电重启,
由于时间戳存在,就会比较时间,将最大的时间保存成系统时间,
所以导致无法往前设置时间。

但是我这边一直复现不了,原因是下面的脚本引起的
其中hwclock.sh,不管输入start参数还是stop参数
实际就是这一句hwclock --systohc实现的就是 从硬件时钟设置系统时间

在这里插入图片描述
在这里插入图片描述
而我在github找到的这个脚本的源码

对应关系则是
Start hwclock --systohc 将rtc用做系统时间
Stop hwclock -w 将系统时间保存在rtc

这样设置 同事所说的bug存在的,同事一直用的老版本的代码,所以我一直没有复现是因为我的脚本已经修改了。

问题总结

/etc/rc6.d/S25save-rtc.sh 生成时间戳
/etc/rcS.d/S55bootmisc.sh 对比时间戳和RTC时间
/etc/init.d/hwclock.sh 保存时间到RTC或者把RTC时间设置到系统

时间和时间戳的转换

将时间变成时间戳

date -d '202504100543' +%s

输出 1744234980

将时间戳变成时间

date -d @1744234980

输出 Thu Apr 10 05:43:00 CST 2025

查看当前时间戳

date +%s

查看实际保存的时间戳

cat /etc/timestamp
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值