问题来源
在工作中
同事在使用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