最近遇到一个Linux系统时间无法更改小于某个固定时间的问题。

有关部门反馈,一旦将设备的时间设置小于2012年11月3号4点34分,复位设备后,系统时间就会变成2012年11月3号4点后的时间。此问题十分诡异。负责业务的同志无法排查,于是安排我——或许天生注定,我这里,所有和Linux有关,所有“底层问题”,都可以找到我。

首先重现问题,拿到设备,用上位机设置时间,结果和反馈的一样。仔细分析,uboot时间和内核时间是一致的,但到了系统里面,时间就变了。再用nfs启动来测试就没问题,一切正常,date时间和内核时间一致。和硬件的同志交流了,虽然他们以前也发现了这个现象,但没什么头绪。甚至一度怀疑RTC电池的问题,但如果这样,RTC时间会变成2000年,而不是一个奇怪的时间。交流的结果是从系统启动脚本入手。

由于脚本较多,首先想到的是在内核RTC驱动中打印设置、读取时间,以便观察是在何处操作了RTC。然后跟踪了脚本,从rc.d目录看,发现几个和时间有关脚本,查看了一下,里面调用hwclock来读取、设置时间。最终确定了问题所在,而当我刚刚整理好思绪想在部门群里汇报的时候,那位负责业务的同志已经把问题脚本截图出来了。为了表现出自己的工作量,我还是把我的结论汇报一下。

问题是这样的。

我们使用的那套rootfs,是代号为“踢啊”公司所开发的,对于系统启动时的时间管理有一个机制,就是在启动脚本中判断当前的时间比上一次的时间戳,如果小于超过一天的时候,就会使用上一次的时间戳,如果不是,则不使用。脚本大概是这样的:

# Set the system clock from hardware clock
# If the timestamp is 1 day or more recent than the current time,
# use the timestamp instead.
test -x /etc/init.d/hwclock.sh && /etc/init.d/hwclock.sh startif test -e /etc/timestamp // !~~~~~
thenSYSTEMDATE=`date "+%Y%m%d"`TIMESTAMP=`cat /etc/timestamp | awk '{ print substr($0,9,4) substr($0,1,4);}'`NEEDUPDATE=`expr \( $TIMESTAMP \> $SYSTEMDATE \)`                                                if [ $NEEDUPDATE -eq 1 ]; thendate `cat /etc/timestamp`/etc/init.d/hwclock.sh stopfi
fi

在/etc/init.d目录里有脚本读取RTC时间和保存timestamp。在每次启动时,都会如此。

我们所用的是UBI文件系统,是只读的(先前是可读可写的,但发现flash损坏事件而改为只读)。timestamp是我之前使用rootfs时所留下的时间。因此,当设置的时候小于这个值时,就会出现上文的时间了。而我的NFS是可读可写的,所以使用NFS无问题。

——但是想想,即使是可读可写的,只要时间误差太离谱,系统都会强行改为上一启动的时间。

为此再深入研究发现,这个问题本身就是“踢啊”提供的rootfs的问题,上述分析也变得是一厢情愿了。不知何故,这个rootfs里已经没有调用保存rtc的脚本了,但判断时间戳的语句还在,/etc/timestamp文件还在,所以,无论怎样,问题还是存在的。

对于这个“bug”,我个人认为没有必要修改,我相信现在不会有人把设备时间改为几年了,我不知道某些部门是如何想的。当今的RTC芯片,为了方便(如计算闰年),把年份限制到00~99,即2000年开始的百年时间,在系统中设置时间小于2000年没问题,但写到RTC就会报错。估计这一点要向大家说明才行,不然又因认知问题导致误解。

但从电子邮件来,从测试部门的bug登记来看,这个bug很严重。由于是“在用品bug”,需要给出流出原因的预防措施,我参考前一时间发生的事件,给出原因:

应该是我没有了解到“踢啊”的rootfs有timestamp的机制,我在这方面还需要多加改进。

李迟,2015年6月19日 周五 中午




遇到一个Linux系统时间突变问题相关推荐

  1. Linux系统时间同步方法小结

    原文装载自:https://www.cnblogs.com/ibnode/p/3573302.html 在Windwos中,系统时间的设置很简单,界面操作,通俗易懂,而且设置后,重启,关机都没关系.系 ...

  2. Linux系统时间同步方法

    在Windwos中,系统时间的设置很简单,界面操作,通俗易懂,而且设置后,重启,关机都没关系.系统时间会自动保存在BIOS时钟里面,启动计算机的时候,系统会自动在BIOS里面取硬件时间,以保证时间的不 ...

  3. 作为一个linux系统运维师必须掌握的定期任务执行命令cront

    定期执行任务的相关命令 作为一个linux系统运维师,在我们工作的时候需要定期去执行一些脚本或是命令,比如早上几点我们要开启什么服务,我们不可能守在计算机旁等到那个时候去手动执行那些需要脚本或是命令, ...

  4. linux系统取消时间同步,Linux系统时间不同步问题

    问题 : data命令查看系统时间与实际实际一致,但日志中的实际却与实际时间差了整整12个小时,可能原因是什么?如何处理.原因和解决办法? //查看时间 [root@localhost ~]# dat ...

  5. c语言linux系统时间,【整理】C语言设置Linux系统时间 | 勤奋的小青蛙

    今晚完成一个小功能,C语言设置下Linux系统时间.代码如下: #include #include #include #include using namespace std; using std:: ...

  6. C/C++更新linux系统时间和硬件时间的方法

    背景说明 我的linux板卡是不联网的,但是MCU所在的板卡通过2G模块连接物联网.但是linux板卡有时需要记录相对准确的时间.理想情况是安装一个带电池的RTC模块通过I2C连接到linux板卡上. ...

  7. Linux系统时间、系统时区和时钟同步的部分理解

    1.写在前面 因为最近一段时间以来,本人在项目遇到的因为Linux系统时间所引发的问题比较多,所以在此进行总结. 2.Linux系统时间与BIOS硬件时间之间的关系 2.1.RTC芯片.i2c总线和B ...

  8. Linux系统时间的设置

    在Linux下,默认情况下,系统时间和硬件时间并不会自动同步.在Linux运行过程中,系统时间和硬件时间以异步的方式运行,互不干扰.硬件时间的运行,是靠BIOS电池来维持,而系统时间,是用CPU Ti ...

  9. 修改Linux系统时间和时区

    服务时间显示不正确,可能有3个原因造成(数据库服务于后台服务分开时,属于俩个虚拟机): 1.数据库服务所在虚拟机的时间和时区显示正确 2.Oracle服务的的时间和时区显示正确 3.后台服务所在虚拟机 ...

最新文章

  1. Vue计算属性和监听属性
  2. python语音播报-用Python写一个语音播放软件
  3. CTO俱乐部下午茶:技术团队管理中的那些事儿
  4. 修改SSO管理员密码
  5. 微信小程序 WXBizDataCrypt 解密 报错
  6. Linux 终端下 dstat 监控工具
  7. 协方差理解,PCA以及奇异值分解(SVD)
  8. apache2.2:使一个目录允许执行cgi程序
  9. Android学习笔记09:Paint及Canvas的简单应用
  10. 免费开源:人人必备的数据分析技能
  11. 最积阴德的4件事,哪怕做过一件,也会累积大功德!
  12. 中国银保监会公布银行业金融机构目前共有4608家(附全部名录)
  13. 小鹤双拼入门和小鹤音形的搜狗输入法配置方法
  14. Guava---Joiner
  15. 有关“安装程序启动安装引擎失败:不支持此接口”错误的解决方法
  16. 高通AKM8975地磁传感器分析
  17. C#读取Word文件的方法
  18. 《设计模式》之 3 装饰者模式
  19. 层叠轮播图、小程序3D轮播图、小程序轮播图、折叠轮播图、叠式轮播图、微信小程序叠式轮播图实现、小程序层叠轮播图swiper、Taro层叠轮播图、Taro叠式轮播图
  20. 浮动( Floats )

热门文章

  1. 苹果高管:M1芯片iPad Air是为内容创作者和学生等设计
  2. 小米12 Ultra有望换装索尼传感器:牵手徕卡 搭载新一代影像旗舰
  3. 贾跃亭又造假,250亿灰飞烟灭!
  4. 圆通速递:2022年1月快递产品收入36.19亿元 同比增长20.09%
  5. 双十一临近 乐视商城宣布全场包邮
  6. 2021年德国汽车产量预计同比锐减18%
  7. 韩国浦项化学在中国斥资超2800亿韩元投建电动车电池材料厂
  8. 芯片短缺波及国内车市 5月国内汽车销量下降3.1%
  9. 苹果推出iCloud照片转移服务 能轻松转到谷歌相册
  10. 2021春节档票房超78亿元收官 总观影人次达1.6亿