2019独角兽企业重金招聘Python工程师标准>>>

概要

1)介绍Linux系统中时钟的基本概念

2)探讨hwclock命令的工作方式。

3)系统启动过程中Linux系统对系统时钟和硬件时钟的同步。

主要术语和背景知识

UTC: Coordinated Universal Time, 一种是件标准,用以规范世界各地的时间。

Time Zone: 时区,表示方式是:UTC-xx:xx, UTC+xx:xx。比如中国的时区表示是:UTC+08:00.

其他一些相关术语,比如CST,DST等,我们并不需要关心。

典型Linux对时钟和时间的管理

一个典型的Linux系统主要有两种时钟:系统时钟(System Clock)和硬件时钟(Hardware Clock)。

硬件时钟独立运行于操作系统之外,有自己的电源供给,即使当系统关机时,它也依然在跑。Hardware Clock有时也叫BIOS Clock, CMOS Clock, RTC 等。但是只有hardware clock这个词汇不容易引起误解。

系统时钟就是由操作系统维护的一个时钟。在Linux系统中,是由kernel维护,由timer的中断进行驱动的一个时钟(因为它是由计时器的中断驱动的,所以可以认为是一个软件时钟)。

有两个时钟,就需要有同步。这个同步功能由hwclock来实现。在此仅作简要介绍,详情请查询手册(man hwclock).

hwclock在各个系统上的工作方式可能并不一样,但是,在大多数情况下,它通过访问/dev/rtc来进行硬件时钟的控制。在先行的发行版上,/dev/rtc很多时候是一个symlink,指向/dev/rtcX。影响hwclock工作的还有两个因素,一个是TZ环境变量,一个是/etc下的配置文件(这个文件位置不一,也可能没有,要看系统)。

一个典型的Linux系统,对时间的同步会自动发生在系统启动和系统关闭的时候。系统启动时,将Hardware Clock中的内容同步到System Clock;系统关闭时,将System Clock中的内容同步到Hardware Clock。当然,这种同步也可以自己手动进行,或者利用脚本进行(自己编写的,或者该版本系统中自带的)。

如下是一个典型的启动和关闭系统时,对系统时钟和硬件时钟进行同步的脚本,通常存在于/etc/init.d/目录下。

#!/bin/sh
### BEGIN INIT INFO
# Provides:          hwclock
# Required-Start:
# Required-Stop:     $local_fs
# Default-Start:     S
# Default-Stop:      0 6
# Short-Description: Set system clock
# Description:       Set system clock to hardware clock, according to the UTC
#                    setting in /etc/default/rcS (see also rcS(5)).
### END INIT INFO
#
# WARNING:      If your hardware clock is not in UTC/GMT, this script
#               must know the local time zone. This information is
#               stored in /etc/localtime. This might be a problem if
#               your /etc/localtime is a symlink to something in
#               /usr/share/zoneinfo AND /usr isn't in the root
#               partition! The workaround is to define TZ either
#               in /etc/default/rcS, or in the proper place below.[ ! -x /sbin/hwclock ] && exit 0. /etc/default/rcS
[ "$UTC" = "yes" ] && tz="--utc" || tz="--localtime"case "$1" instart)if [ "$VERBOSE" != no ]thenecho "System time was `date`."echo "Setting the System Clock using the Hardware Clock as reference..."fiif [ "$HWCLOCKACCESS" != no ]thenif [ -z "$TZ" ]thenhwclock $tz --hctosyselseTZ="$TZ" hwclock $tz --hctosysfifiif [ "$VERBOSE" != no ]thenecho "System Clock set. System local time is now `date`."fi;;stop|restart|reload|force-reload)## Updates the Hardware Clock with the System Clock time.# This will *override* any changes made to the Hardware Clock.## WARNING: If you disable this, any changes to the system#          clock will not be carried across reboots.#if [ "$VERBOSE" != no ]thenecho "Saving the System Clock time to the Hardware Clock..."fiif [ "$HWCLOCKACCESS" != no ]thenhwclock $tz --systohcfiif [ "$VERBOSE" != no ]thenecho "Hardware Clock updated to `date`."fiexit 0;;show)if [ "$HWCLOCKACCESS" != no ]thenhwclock $tz --showfi;;*)echo "Usage: hwclock.sh {start|stop|show|reload|restart}" >&2echo "       start sets kernel (system) clock from hardware (RTC) clock" >&2echo "       stop and reload set hardware (RTC) clock from kernel (system) clock" >&2exit 1;;
esac

hwclock 和 date 命令中--utc选项

这两个命令虽然都有--utc选项,但是其含义是不同的。首先来看一段命令和结果。

chenqi@chenqi-OptiPlex-760:/etc/default$ date
Wed Oct 31 16:00:23 CST 2012
chenqi@chenqi-OptiPlex-760:/etc/default$ date --utc
Wed Oct 31 08:00:24 UTC 2012
chenqi@chenqi-OptiPlex-760:/etc/default$ sudo hwclock --localtime -r
Wed 31 Oct 2012 08:00:30 AM CST  -0.594038 seconds
chenqi@chenqi-OptiPlex-760:/etc/default$ sudo hwclock --utc -r
Wed 31 Oct 2012 04:00:37 PM CST  -0.937780 seconds

由上可见date --utc得到的时间和hwclock --localtime得到的时间一致,而date得到的时间和hwclock --utc得到的时间一致。这一点,容易让人困扰。

实际上,date命令中--utc选项表示“对标准UTC时间进行操作”,所以date --utc是输出当前的标准UTC时间;而hwclock中--utc选项的意思是,这次操作要考虑时区上的换算,比如,如果是读取hardware clock的话,那么读出的数据(从本地读出的时间),要考虑到时区,换算出当前时区的时间后,再做输出。同理,--localtime表示不用进行时区上的考虑和换算,读出什么,就输出什么。

由此,上面的困扰就比较容易解释了,hardware clock存储的时UTC标准时间,所以用--localtime去读取,得到的就是标准UTC时间,即和date --utc一致。另外一种情况就是考虑了时区换算,道理一样。

参考材料

hwclock manual

date manual

http://en.wikipedia.org/wiki/Time_zone

转载于:https://my.oschina.net/u/158589/blog/86313

对Linux系统中的时钟和时间的探讨相关推荐

  1. linux cst时间转换,linux系统中CST与EDT时间转换以及系统时间与网络时间同步

    初始时间:2012年 09月 14日 星期五 18:15:33EDT [root@test ~]# mv /etc/localtime /etc/localtime.bak [root@test ~] ...

  2. Linux系统中的日志及时间时区管理超实用

    目录 一.journal 1.journalctl命令的用法 2.用journald服务永久存放日志 二.rsyslog 1.自定义日志采集 2.日志的远程同步 3.更改日志采集格式 三.timeda ...

  3. linux 使用cst时间,linux系统中CST与EDT时间转换

    使用mosh取代ssh提高n2n网络连接稳定性 上文实现了远程n2n访问树莓派,但是ssh协议在网络状况不好的时候命令会卡住.这里发现了一个mosh协议,可以增强稳定性,使用后效果明显. 背景:使用n ...

  4. Linux系统中的时间设置(硬件时钟VS系统时钟)

    在实际工作中,我们部署在linux系统中的应用的运行通常需要使用正确的时间,而在没有时钟同步服务的时候,就需要我们手动去修改linux的系统时间.那么这里就说说如何修改linux的系统时间. 软件时钟 ...

  5. 获取系统信息1——linux系统中的时间

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 一.关于时间的概念 1.GMT时间 GMT是格林尼治时间,也就是格林尼治地区的当地时间: 用格林尼治的当地时间作为 ...

  6. 10、Linux系统中的日志管理及时间设定

    Linux系统中的日志管理 实验环境 一.journald 1.journalctl命令的用法 2.永久存放日志 二.rsyslog 1.自定义日志采集路径 2.日志的远程同步 3.更改日志采集格式 ...

  7. linux小窍门──设置时钟和时间

    本文档解释了如何从linux下设置计算机的时钟,如何设置您的时区和其它与linux如何保存时间相关的材料. 您的计算机有两个时钟,一个是始终运行的.由电池供电的( 硬件的.BIOS或CMOS )时钟, ...

  8. Linux系统中的函数

    Linux系统中的函数: 一.进程控制 fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtables ...

  9. Linux延时(延迟)函数比较:介绍Linux系统中常用的延时函数sleep、usleep、nanosleep、select和std::sleep_for()的区别和使用场景

    首先,需要了解各个睡眠函数的作用和使用场景. sleep函数用于让进程休眠指定的秒数,适用于需要较长时间的休眠场景: usleep函数用于让进程休眠指定的微秒数,适用于需要较短时间的休眠场景,不精确: ...

最新文章

  1. vs如何将工程配置,保存到属性表
  2. 大剑无锋之Hadoop的三个作业调度器【面试推荐】
  3. 怎样查看cudnn版本_tensorflowGPU版本踩坑记录
  4. 健康医疗数据库建设亟需“万象更新”式变革
  5. 【LeetCode】剑指 Offer 67. 把字符串转换成整数
  6. java开发系统架构_Java开发:ECP系统J2EE架构开发平台
  7. Confluence OGNL表达式注入漏洞复现与分析(CVE-2022-26134)
  8. 如何拼局域网所有ip_怎么查看 同一个局域网内连的所有的IP地址 - 卡饭网
  9. 关于EPCS系列芯片的说明
  10. 雷达基础系列文章之四:雷达专业国内期刊
  11. word方框中打对号
  12. 加州大学计算机系统,盘点:美国加州大学系统值得申请的专业
  13. flutter网络请求基础知识铺垫、及实战举例
  14. 计算机公司客户电话怎么打,企业微信公费电话怎么打多人通话【方法】
  15. 如何写好软件项目的工作计划(一)
  16. eye-in-hand手眼标定系统
  17. FTX与加密监管:真金白银的理想消亡史
  18. java 根据经纬度坐标查询出来附近店铺
  19. 通过百度人脸对比API进行人脸对比
  20. 数显之家快讯:【SHIO世硕心语】LCD、OLED、QLED的区别知多少?

热门文章

  1. 串结构练习——字符串匹配
  2. multiple Rational objects
  3. ECMALL SEO 问题的解决方法
  4. 人工智能算法_人工智能的灵魂——算法
  5. Kong APIGW — Plugins — Authentication
  6. SecureCRT自动保存窗口数据到文件,自动保存日志,每行添加时间戳
  7. IDE接口驱动程序移植
  8. 【NLP】Attention Model(注意力模型)学习总结
  9. jS四种函数的调用方式
  10. 通过阿里云容器服务K8S Ingress Controller实现应用服务的灰度发布