Openwrt系统初始时间

科技 科技 2028 人阅读 | 0 人回复

<
普通Openwrt体系较多用于收集圆里的产物,好比路由器,但路由器险些皆出有硬件RTC,因而体系初初工夫不准.
正在Openwrt体系中,初初工夫能够以为有2个, 固件编译工夫战文件体系减载后的初初工夫
闭于固件编译工夫,即为Linux kernel 编译工夫, 便是/proc/version内乱容,好比:
  root@UVCOSS:~# cat /proc/version
Linux version 4.14.221 (xxxx) (gcc version 7.5.0 (OpenWrt GCC 7.5.0 r11063-85e04e9f46)) #0 Tue Aug 31 06:45:02 2021
 kernel 编译工夫经由过程宏KBUILD_BUILD_TIMESTAMP去传进
宏初初化, 从SOURCE_DATE_EPOCH获得工夫
214554dnb0xvckxatqqkzq.jpg

SOURCE_DATE_EPOCH 由剧本天生
214555d5qrlkq6nlljqkng.jpg
 
剧本get_source_date_epoch.sh以下:
别离从version.date文件,git,hg去停止初初化
version.date文件存储的即为编译时的UTC工夫
  # cat version.date
1630392302
  1. #!/usr/bin/env bash
  2. export LANG=C
  3. export LC_ALL=C
  4. [ -n "$TOPDIR" ] && cd $TOPDIR
  5. try_version() {
  6.         [ -f version.date ] || return 1
  7.         SOURCE_DATE_EPOCH="$(cat version.date)"
  8.         [ -n "$SOURCE_DATE_EPOCH" ]
  9. }
  10. try_git() {
  11.         [ -e .git ] || return 1
  12.         SOURCE_DATE_EPOCH="$(git log -1 --format=format:%ct)"
  13.         [ -n "$SOURCE_DATE_EPOCH" ]
  14. }
  15. try_hg() {
  16.         [ -d .hg ] || return 1
  17.         SOURCE_DATE_EPOCH="$(hg log --template &#39;{date}&#39; -l 1 | cut -d. -f1)"
  18.         [ -n "$SOURCE_DATE_EPOCH" ]
  19. }
  20. try_mtime() {
  21.         perl -e &#39;print((stat $ARGV[0])[9])&#39; "$0"
  22.         [ -n "$SOURCE_DATE_EPOCH" ]
  23. }
  24. try_version || try_git || try_hg || try_mtime || SOURCE_DATE_EPOCH=""
  25. echo "$SOURCE_DATE_EPOCH"
复造代码
宏传进:
214555oyrzyl8m83vvrbrz.jpg

宏利用 scripts/mkcompile_h 剧本:
  1. #!/bin/sh
  2. # SPDX-License-Identifier: GPL-2.0
  3. TARGET=$1
  4. ARCH=$2
  5. SMP=$3
  6. PREEMPT=$4
  7. CC=$5
  8. vecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; }
  9. # If compile.h exists already and we don&#39;t own autoconf.h
  10. # (i.e. we&#39;re not the same user who did make *config), don&#39;t
  11. # modify compile.h
  12. # So "sudo make install" won&#39;t change the "compiled by <user>"
  13. # do "compiled by root"
  14. if [ -r $TARGET -a ! -O include/generated/autoconf.h ]; then
  15.   vecho "  SKIPPED $TARGET"
  16.   exit 0
  17. fi
  18. # Do not expand names
  19. set -f
  20. # Fix the language to get consistent output
  21. LC_ALL=C
  22. export LC_ALL
  23. if [ -z "$KBUILD_BUILD_VERSION" ]; then
  24.         if [ -r .version ]; then
  25.                 VERSION=`cat .version`
  26.         else
  27.                 VERSION=0
  28.                 echo 0 > .version
  29.         fi
  30. else
  31.         VERSION=$KBUILD_BUILD_VERSION
  32. fi
  33. #### 获得内部界说,出有则主动天生,以当前工夫为主
  34. if [ -z "$KBUILD_BUILD_TIMESTAMP" ]; then
  35.         TIMESTAMP=`date`
  36. else
  37.         TIMESTAMP=$KBUILD_BUILD_TIMESTAMP
  38. fi
  39. if test -z "$KBUILD_BUILD_USER"; then
  40.         LINUX_COMPILE_BY=$(whoami | sed &#39;s/\\/\\\\/&#39;)
  41. else
  42.         LINUX_COMPILE_BY=$KBUILD_BUILD_USER
  43. fi
  44. if test -z "$KBUILD_BUILD_HOST"; then
  45.         LINUX_COMPILE_HOST=`hostname`
  46. else
  47.         LINUX_COMPILE_HOST=$KBUILD_BUILD_HOST
  48. fi
  49. UTS_VERSION="#$VERSION"
  50. CONFIG_FLAGS=""
  51. if [ -n "$SMP" ] ; then CONFIG_FLAGS="SMP"; fi
  52. if [ -n "$PREEMPT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT"; fi
  53. UTS_VERSION="$UTS_VERSION $CONFIG_FLAGS $TIMESTAMP"
  54. # Truncate to maximum length
  55. UTS_LEN=64
  56. UTS_TRUNCATE="cut -b -$UTS_LEN"
  57. # Generate a temporary compile.h
  58. ( echo /\* This file is auto generated, version $VERSION \*/
  59.   if [ -n "$CONFIG_FLAGS" ] ; then echo "/* $CONFIG_FLAGS */"; fi
  60.   echo \#define UTS_MACHINE "$ARCH"
  61.   echo \#define UTS_VERSION "`echo $UTS_VERSION | $UTS_TRUNCATE`"
  62.   echo \#define LINUX_COMPILE_BY "`echo $LINUX_COMPILE_BY | $UTS_TRUNCATE`"
  63.   echo \#define LINUX_COMPILE_HOST "`echo $LINUX_COMPILE_HOST | $UTS_TRUNCATE`"
  64.   echo \#define LINUX_COMPILER "`$CC -v 2>&1 | grep &#39; version &#39; | sed &#39;s/[[:space:]]*$//&#39;`"
  65. ) > .tmpcompile
  66. # Only replace the real compile.h if the new one is different,
  67. # in order to preserve the timestamp and avoid unnecessary
  68. # recompilations.
  69. # We don&#39;t consider the file changed if only the date/time changed.
  70. # A kernel config change will increase the generation number, thus
  71. # causing compile.h to be updated (including date/time) due to the
  72. # changed comment in the
  73. # first line.
  74. if [ -r $TARGET ] && \
  75.       grep -v &#39;UTS_VERSION&#39; $TARGET > .tmpver.1 && \
  76.       grep -v &#39;UTS_VERSION&#39; .tmpcompile > .tmpver.2 && \
  77.       cmp -s .tmpver.1 .tmpver.2; then
  78.    rm -f .tmpcompile
  79. else
  80.    vecho "  UPD     $TARGET"
  81.    mv -f .tmpcompile $TARGET
  82. fi
  83. rm -f .tmpver.1 .tmpver.2
复造代码
终极天生正在文件include/generated/compile.h
  /* This file is auto generated, version 0 */
  #define UTS_MACHINE "mips"
  #define UTS_VERSION "#0 Tue Aug 31 06:45:02 2021"
  #define LINUX_COMPILE_BY "gwind"
  #define LINUX_COMPILE_HOST "gwind-XX"
  #define LINUX_COMPILER "gcc version 7.5.0 (OpenWrt GCC 7.5.0 r11063-85e04e9f46)"
闭于 文件体系减载后的初初工夫, 能够了解为用户使用起去后的体系工夫
Openwrt体系启动过程当中会停止体系文件更新工夫判定,以最新的文件更新工夫设置为当前体系工夫
完成正在剧本package/base-files/files/etc/init.d/sysfixtime
  1. #!/bin/sh /etc/rc.common
  2. # Copyright (C) 2013-2014 OpenWrt.org
  3. ### 00,开始运转
  4. START=00
  5. STOP=90
  6. RTC_DEV=/dev/rtc0
  7. HWCLOCK=/sbin/hwclock
  8. boot() {
  9.         start && exit 0
  10.         local maxtime="$(maxtime)"
  11.         local curtime="$(date +%s)"
  12.         [ $curtime -lt $maxtime ] && date -s @$maxtime
  13. }
  14. start() {
  15.         [ -e "$RTC_DEV" ] && [ -e "$HWCLOCK" ] && $HWCLOCK -s -u -f $RTC_DEV
  16. }
  17. stop() {
  18.         [ -e "$RTC_DEV" ] && [ -e "$HWCLOCK" ] && $HWCLOCK -w -u -f $RTC_DEV && \
  19.                 logger -t sysfixtime "saved &#39;$(date)&#39; to $RTC_DEV"
  20. }
  21. maxtime() {
  22.         local file newest
  23.         #### 搜刮/etc下最新的文件
  24.         for file in $( find /etc -type f ) ; do
  25.                 [ -z "$newest" -o "$newest" -ot "$file" ] && newest=$file
  26.         done
  27.         ### 以最新的文件工夫设置为体系工夫
  28.         [ "$newest" ] && date -r "$newest" +%s
  29. }
复造代码
终极体系运转日记:
  root@UVCOSS:~# logread |head
Tue Aug 31 14:45:10 2021 kern.notice kernel: [    0.000000] Linux version 4.14.221  (gcc version 7.5.0 (OpenWrt GCC 7.5.0 r11063-85e04e9f46)) #0 Tue Aug 31 06:45:02 2021
  ====Kernel工夫为6:45编译工夫, 尺度UTC工夫
  === 体系工夫为14:45,  由于当前时区是CST-8
Tue Aug 31 14:45:10 2021 kern.info kernel: [    0.000000] Board has DDR2
Tue Aug 31 14:45:10 2021 kern.info kernel: [    0.000000] Analog PMU set to hw control
Tue Aug 31 14:45:10 2021 kern.info kernel: [    0.000000] Digital PMU set to hw control
Tue Aug 31 14:45:10 2021 kern.info kernel: [    0.000000] SoC Type: MediaTek MT7688 ver:1 eco:2
Tue Aug 31 14:45:10 2021 kern.info kernel: [    0.000000] bootconsole [early0] enabled
Tue Aug 31 14:45:10 2021 kern.info kernel: [    0.000000] CPU0 revision is: 00019655 (MIPS 24KEc)

免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则