问题描述 linux中使用date设置时间后用hwclock -w同步到RTC,重启后,时间不能往前设置; 原因分析 1.timestamp时间戳文件怎么生成的,他的作用是什么? 时间戳表示unix当初订立的时间,简单用 1970-1-1 , 0:00:00 到现在经过的秒数 /etc/rc6.d/S25save-rtc.sh 内容如下,其实就是生成时间戳文件 date -u +%4Y%2m%2d%2H%2M > /etc/timestamp 通过对文件系统运行级别的了解 # Runlevel 0 is halt. # Runlevel 1 is single-user. # Runlevels 2-5 are multi-user. # Runlevel 6 is reboot. rc6.d是运行级别是6,即只有reboot的时候才能运行。如上述代码 到这就解决了为什么我一直没有生成时间戳文件的原因,是通过reboot重启才能生成,而我是通过断电重启。 运行级别相关知识 init进程读取“/etc/inittab”文件中的信进入inittab中预设的运行级别,按顺序运行该运行级别对应文件夹(init*.d)下的脚本,通常情况下,“/etc/rcS.d/”目录下的启动脚本首先被执行,然后是“/etc/rcN.d/”目录。例如您设定的运行级别为3,那么它对应的启动目录为“/etc/rc3.d/”。 2.思考为什么这个时间戳会导致时间不能往前面设置,看如下代码 脚本是/etc/rcS.d/S55bootmisc.sh # Set the system clock from hardware clock # If the timestamp is more recent than the current time, # use the timestamp instead. test -x /etc/init.d/hwclock.sh && /etc/init.d/hwclock.sh start if test -e /etc/timestamp #如果/etc/timestamp文件存在 then SYSTEMDATE=`date -u +%4Y%2m%2d%2H%2M` #获取系统时间 read TIMESTAMP < /etc/timestamp #读取/etc/timestamp保存的时间戳 if [ ${TIMESTAMP} -gt $SYSTEMDATE ]; then #如果上次保存的时间戳大于系统时间,将时间戳设置为系统时间 date -u ${TIMESTAMP#????}${TIMESTAMP%????????} #${}在shell中可以得到不同的值 #????删除左边四位 %????????删除右边八位 test -x /etc/init.d/hwclock.sh && /etc/init.d/hwclock.sh stop fi fi 分析到这里,客户很可能如果先设置一个比较未来的时间,然后reboot重启的话,会调用/etc/rc6.d/S25save-rtc.sh去生成时间戳;之后设置比较前的时间,再断电重启,由于时间戳存在,就会比较时间,将最大的时间保存成系统时间,所以导致无法往前设置时间。 但是我这边一直复现不了,原因是下面的脚本引起的 其中hwclock.sh,不管输入start参数还是stop参数 实际就是这一句hwclock --systohc实现的就是 将rtc用做系统时间 而我在github找到的这个脚本的源码 对应关系则是 Start hwclock --systohc 将rtc用做系统时间 Stop hwclock -w 将系统时间保存在rtc 问题总结 该问题是linux在RTC时间设置上的一个bug,应该对应的关系是不管start和stop,都应该是将rtc用做系统时间 /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 |
|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )
GMT+8, 2024-11-25 11:09
Powered by Discuz! X3.4
© 2001-2013 Comsenz Inc.