Linux时间管理


Linux时间管理
                                                                       [email protected]
    首先介绍一些概念
    UTC :世界协调时间(Universal Time Coordinated,UTC), UTC就是0时区的时间,由于北京 在东八区,所以UTC时间比北京时晚八小时。
    CST : China Standard Time, UTC+8:00 中国沿海时间(北京时间)。
    GMT :(Greenwich Mean Time,格林威治标准时间),是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。
    GMT + 8 = UTC + 8 = CST    由于在中国,所以在这里CST时间就代表本地时间。
    然后列出一些一会可能用到的关于时间的一些命令

  1. date:  显示或设置 系统 时间与日期
  2. hwclock:  显示与设定硬件时钟
  3. rdate:  显示其他主机的日期与时间
  4. ntpdate: 使用网络 时间协议(NTP)设置日期和时间
复制代码

以上命令具体用法,请参考manual。  
       接下来给出linux 系统关闭和启动过程中,硬件时间与系统时间之间的同步

  1. 方式A: 使用UTC(对linux就是 /etc/sysconfig/clock 中 UTC=true)
  2.        开机: BIOS--------->UTC(将BIOS中的时间看成是UTC)------(时区变化)----->CST
  3.     关机: CST -------(时区变化)----->UTC-------存储到------>BIOS

  4. 方式B: 不使用UTC(对linux就是 /etc/sysconfig/clock 中 UTC=false)
  5.        开机: BIOS----------------------->CST(将BIOS中的时间看成是CST)
  6.     关机: CST ---------存储到------>BIOS
复制代码

1.系统时间           直接执行date显示本地时间,想要显示UTC时间加上参数 -u

  1. [root@localhost ~]# date
  2. 2010年 10月 09日 星期六 22:33:41 CST
  3. [root@localhost ~]# date -u
  4. 2010年 10月 09日
复制代码

2.硬件时间,/sbin/hwclock  
             直接调用 /sbin/hwclock 显示的时间就是 BIOS 中的时间吗?未必!这要看 /etc/sysconfig/clock 中是否启用了UTC,如果启用了UTC(UTC=true),显示的其实是经过时区换算的时间而不是BIOS中真正的时间,如果加上 --localtime 选项,则得到的总是 BIOS 中实际的时间。

  1. [root@localhost ~]# hwclock
  2. 2010年10月10日 星期日 09时55分18秒  -0.689710 seconds
  3. [root@localhost ~]# hwclock --utc
  4. 2010年10月10日 星期日 09时55分24秒  -0.057533 seconds
  5. [root@localhost ~]# hwclock --localtime
  6. 2010年10月10日 星期日 01时55分32秒  -0.005559 seconds
复制代码

3.两个配置文件
             /etc /localtime:这个文件用来设置系统的时区,不论是 date 还是 hwclock都会用到这个文件,会根据这个文件的时区设置来进行UTC和本地之间之间的换算。它和/usr/share/zoneinfo目录 下 的“所设时区”文件构成符号链接,也就是“localtime -> /usr/share/zoneinfo/XXXX“。举例来说,如果你是中国人,你生活在首都北京,那么你首先应该到/usr/share /zoneinfo文件夹的Asia目录下去找shanghai这个文件(因为shanghai和beijing在一个时区),然后做一个符号链接到 localtime,即

  1. ln -sf /usr/share/zoneinfo/Aisa/Shanghai /etc/localtime
复制代码

/etc /sysconfig/clock:个文件只对 hwclock 有效,而且似乎是只在系统启动和关闭的时候才有用,比如修改了其中的 UTC=false 到 UTC=ture 的前后,执行 hwclock (--utc, 或 --localtime) 都没有变化,要重启系统后才生效。
             UTC=false的情况下

  1. [root@localhost ~]# cat /etc/sysconfig/clock
  2. # The ZONE parameter is only evaluated by system-config-date.
  3. # The timezone of the system is defined by the contents of /etc/localtime.
  4. ZONE="Asia/Shanghai"
  5. UTC=fale
  6. ARC=false
复制代码

用darte和hwclock连续输出结果如下:

  1. [root@localhost ~]# date
  2. 2010年 10月 10日 星期日 10:43:29 CST
  3. [root@localhost ~]# date -u
  4. 2010年 10月 10日 星期日 02:43:31 UTC
  5. [root@localhost ~]# hwclock
  6. 2010年10月10日 星期日 10时43分39秒  -0.482930 seconds
  7. [root@localhost ~]# hwclock --utc
  8. 2010年10月10日 星期日 18时43分44秒  -0.974832 seconds
  9. [root@localhost ~]# hwclock --localtime
  10. 2010年10月10日 星期日 10时43分57秒  -0.095316 seconds
复制代码

可见,如果不使用UTC,BIOS时间(红色部分)就是系统本地时间,而且注意这时执行 hwclock --utc 得到的结果没有任何意义,因为这里我们已经禁用了UTC
              UTC=ture情况下:

  1. [root@localhost ~]# cat /etc/sysconfig/clock
  2. # The ZONE parameter is only evaluated by system-config-date.
  3. # The timezone of the system is defined by the contents of /etc/localtime.
  4. ZONE="Asia/Shanghai"
  5. UTC=true
  6. ARC=false
复制代码

用date和hwclock命令连续输出:

  1. [root@localhost ~]# date
  2. 2010年 10月 10日 星期日 10:33:19 CST
  3. [root@localhost ~]# date -u
  4. 2010年 10月 10日 星期日 02:33:21 UTC
  5. [root@localhost ~]# hwclock
  6. 2010年10月10日 星期日 10时33分26秒  -0.338341 seconds
  7. [root@localhost ~]# hwclock --utc
  8. 2010年10月10日 星期日 10时33分32秒  -0.577395 seconds
  9. [root@localhost ~]# hwclock --localtime
  10. 2010年10月10日 星期日 02时33分38秒  -0.255537 seconds  //启用了UTC
复制代码

4.更改时间
           date更改系统时间:

  1. [root@localhost ~]# date -s "2010-09-10 12:00:00" //可接很多种时间格式,个人认为这种格式最容易明白
  2. 2010年 09月 10日 星期五 12:00:00 CST
复制代码

这时虽然更改了系统时间,但是硬件时间没有变化,hwclock -w命令将当前时间写入CMOS中:

  1. [root@localhost ~]# date -s "2010-09-10 12:00:00"
  2. 2010年 09月 10日 星期五 12:00:00 CST
  3. [root@localhost ~]# date
  4. 2010年 09月 10日 星期五 12:01:27 CST
  5. [root@localhost ~]# date -u
  6. 2010年 09月 10日 星期五 04:01:34 UTC
  7. [root@localhost ~]# hwclock
  8. 2010年10月10日 星期日 11时02分08秒  -0.872432 seconds
  9. [root@localhost ~]# hwclock --utc
  10. 2010年10月10日 星期日 19时02分34秒  -0.279553 seconds
  11. [root@localhost ~]# hwclock --localtime
  12. 2010年10月10日 星期日 11时02分47秒  -0.282827 seconds
  13. [root@localhost ~]# hwclock -w
  14. [root@localhost ~]# hwclock
  15. 2010年09月10日 星期五 12时02分49秒  -0.278192 seconds
  16. [root@localhost ~]# hwlock --localtime
  17. -bash: hwlock: command not found
  18. [root@localhost ~]# hwclock --localtime
  19. 2010年09月10日 星期五 12时03分22秒  -0.944008 seconds
复制代码

hwclock更改硬件时间

  1. [root@localhost ~]# hwclock --set --date="2010-08-10 12:00:00" //用法类似于date -s
  2. [root@localhost ~]# hwclock
  3. 2010年08月10日 星期二 12时00分06秒 -0.699864 seconds //硬件时间已修改
  4. [root@localhost ~]# date
  5. 2010年 09月 10日 星期五 12:13:18 CST  //date时间没有受硬件时间改变而改变,除非重新启动
  6. [root@localhost ~]# hwclock --hctosys //此命令的用法是将硬件时间赋予系统时间
  7. [root@localhost ~]# date
  8. 2010年 08月 10日 星期二 12:00:51 CST //时间已改变

  9. [root@localhost ~]# date -s "2010-07-10 12:00:00"
  10. 2010年 07月 10日 星期六 12:00:00 CST
  11. [root@localhost ~]# date
  12. 2010年 07月 10日 星期六 12:00:04 CST
  13. [root@localhost ~]# hwclock --systohc //将系统时间写入CMOS
  14. [root@localhost ~]# hwclock
  15. 2010年07月10日 星期六 12时00分27秒  -0.400429 seconds
复制代码

可 以通过 hwclock --hctosys来利用硬件时间来设置系统时间(注意不是简单的复制BIOS中的时间为系统时间,要看是否使用UTC,如果使用的话则要做时区换算), 通过hwclock --systohc 来根据系统时间设置硬件时间(也要看是否启用UTC来决定是否做时区换算)。总之,不论使用 --systohc还是 --hctosys,同步后直接运行不带参数的 hwclock 得到的时间与直接运行 date得到的时间应该一致,这个时间是否就是BIOS中的时间(hwclock--localtime)那就不一定了,如果启用了UTC就不是,没启用 UTC就是。而且好要注意:在系统中手动使用 hwclock hwclock --set --date='yyyy-mm-dd' 来设置BIOS时间只在系统运行时有效,因为当系统关闭时,还会按设定好的方式根据系统时间来重设BIOS时间的,于是手动的设置便被覆盖掉了。
           5.同步时间
              从网络同步时间可以使用rdate和ntpdate两个命令。
               ntpdate命令使用如下:

  1. [root@localhost ~]# date -s "2010-07-10 12:00:00"
  2. 2010年 07月 10日 星期六 12:00:00 CST
  3. [root@localhost ~]# date
  4. 2010年 07月 10日 星期六 12:00:03 CST
  5. [root@localhost ~]# ntpdate 210.72.145.44 //用ntpdate更新时间,后面ip地址是ntp授时服务器
  6. 10 Oct 12:03:43 ntpdate[7906]: step time server 210.72.145.44 offset 7948997.508213 sec
  7. [root@localhost ~]# date
  8. 2010年 10月 10日 星期日 12:03:46 CST
复制代码

rdate命令用法如下:

  1. [root@localhost ~]# date -s "2010-07-10 12:00:00"
  2. 2010年 07月 10日 星期六 12:00:00 CST
  3. [root@localhost ~]# date
  4. 2010年 07月 10日 星期六 12:00:08 CST
  5. [root@localhost ~]# rdate time-a.nist.gov  //不加参数使用返回服务器时间
  6. rdate: [time-a.nist.gov]        Sun Oct 10 12:11:58 2010
  7. [root@localhost ~]# rdate -s time-a.nist.gov  //加上参数s,同步本地时间
  8. rdate: couldn't connect to host time-a.nist.gov: Connection refused  //看来网络不是很好
  9. [root@localhost ~]# rdate -s time-a.nist.gov  //同步成功
  10. [root@localhost ~]# date
  11. 2010年 10月 10日 星期日 12:12:48 CST  //时间已经同步
复制代码

到这里Linux时间的一些问题就没有了,希望能给大家带来帮助。

猜你喜欢

转载自312788172.iteye.com/blog/825647