CentOS 7 有两种类型的时间:
- 实时时间(Real-Time Clock,RTC),通常称为硬件时间,完全独立于操作系统运行,一般是由主板上的COMS负责维护,因此在操作系统关闭后也能运行。
- 系统时间(System Time),也称为软件时间,由Linux内核维护,其初始值基于硬件时间,一旦Linux启动并且系统时间被初始化,系统时间就完全独立于硬件时间。
CentOS 7 提供了三个命令行工具,可以用来显示和配置时间:timedatectl,date,hwclock;timedatectl是CentOS 7的新工具,可以同时管理系统时间和硬件时间,date是CentOS 6就有的工具,只能管理系统时间,一般是脚本中用于格式化输出时间,hwclock主要用于管理硬件时间。
使用timedatectl命令
CentOS 7 中以ctl结尾的命令,几乎都是systemd的一部分,timedatectl也不例外。
显示当前日期和时间
[root@localhost ~]# timedatectl
Local time: Fri 2018-07-20 17:46:09 CST
Universal time: Fri 2018-07-20 09:46:09 UTC
RTC time: Fri 2018-07-20 09:46:09
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
[root@localhost ~]# timedatectl
Local time: 本地时间,与系统设置的时区有关系,北京时间简写CST
Universal time: 协调世界时,简写为UTC
RTC time: 硬件时间,默认显示时间是UTC时间
Time zone: 当前时区
NTP enabled: 是否设置NTP服务开机启动
NTP synchronized: NTP服务是否已经同步时间
RTC in local TZ: 硬件时间是否是本地时区
DST active: 夏令时是否可用 n/a(Not applicable,不可用)
这里的NTP服务由chronyd或者ntpd提供,具体取决于安装的是哪个服务,手动改变chronyd
或ntpd的状态(systemctl enable|disable设置是否开机启动,是否同步时间),
不会立即同步给timedatectl
。如果更改了这些它们的设置或状态,请输入以下命令立即获取它们的状态:
[root@localhost ~]# systemctl restart systemd-timedated.service
修改本地时间
[root@localhost ~]# timedatectl set-time 12:12:12 //修改为12:12:12
该命令同时修改系统时间和硬件时钟,其结果类似于同时使用date -set(设置系统时间)加上hwclock -systohc(将系统时间写入硬件时间,-systohc同-w)命令,如果timedatectl set-time出现以下提示
Failed to set time: Automatic time synchronization is enabled
是因为启用了NTP
[root@localhost ~]# timedatectl
Local time: Fri 2018-07-20 17:46:09 CST
Universal time: Fri 2018-07-20 09:46:09 UTC
RTC time: Fri 2018-07-20 09:46:09
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
既然已经设置了NTP服务,也没手动设置时间的必要了,强制立即同步时间
[root@CentOS_7_4 ~]# chronyc makestep //适用与chronyc做NTP服务,实际测试未成功,原因未知
[root@CentOS_7_4 ~]# ntpdate 210.72.145.44 //chronyc和ntpd做ntp服务都可以使用该命令
如果确实有手动设置时间的需求,timedatectl手动关闭NTP服务,或者使用date -s
[root@localhost ~]# timedatectl set-ntp false //禁用NTP
默认情况下,系统配置硬件时间使用UTC,使硬件时间使用本地时间,请使用以下命令
[root@localhost ~]# timedatectl set-local-rtc boolean
若要配置系统以在本地时间保持时钟,请用“yes”(或者y,true,t,1)替换boolean,若要配置系统使用UTC,请用NO(或者n,false,f,0)替换boolean,默认值为no
修改本地日期
[root@localhost ~]# timedatectl set-time 2011-12-01 //设置日期为2011年12月1日
请注意,只更改日期而不指定时间将会导致时间设置为00:00:00,设置完整时间格式如下
[root@localhost ~]# timedatectl set-time "2022-10-10 11:11:11"
设置时区
列出所有时区
[root@localhost ~]# timedatectl list-timezones
设置时区为 亚洲/上海
[root@localhost ~]# timedatectl set-timezone Asia/Shanghai
查找亚洲时区
[root@localhost ~]# timedatectl list-timezones |grep Asia
设置时间同步
timedatectl
命令还允许您使用NTP
协议,启用与远程服务器的系统时钟自动同步;启用NTP将启用chronyd
或ntpd
服务,具体取决于安装的是哪个。
[root@localhost ~]# timedatectl set-ntp boolean
请用“yes”(或者y,true,t,1)替换boolean,若要禁用,请用NO(或者n,false,f,0)替换boolean
如果NTP
未安装服务,该命令将失败
使用date命令设置时间
date
实用程序适用于所有Linux系统,并允许您显示和配置当前日期和时间,在脚本中经常使用它以自定义格式显示有关系统时钟的详细信息。与timedatectl不同的是date命令只设置系统时间,而不设置硬件时间(RTC)
[root@localhost ~]# date
Mon Jul 23 11:47:04 CST 2018
默认情况下,date
命令显示本地时间,若要以UTC显示时间,请使用--utc
或-u
命令行选项运行命令:
[root@localhost ~]# date -u
Mon Jul 23 03:48:21 UTC 2018
可以通过在命令行上提供选项来自定义显示信息的格式:
[root@localhost ~]# date +"%Y-%m-%d %H:%M"
2018-07-23 11:53
常用控制项见下表
控制序列 |
描述 |
---|---|
|
HH格式的小时(例如 |
|
MM格式的分钟(例如 |
|
SS格式的第二个(例如 |
|
DD格式的月份日期(例如 |
|
MM格式的月份(例如 |
|
YYYY格式的年份(例如 |
|
时区缩写(例如 |
|
YYYY-MM-DD格式的完整日期(例如 |
|
HH:MM:SS格式的完整时间(例如,17 :30: 24)。此选项等于 |
设置本地时间
设置本地时间为20:20:20
[root@localhost ~]# date -s 20:20:20
Mon Jul 23 20:20:20 CST 2018
设置时间为 utc 时间 20:20:20
[root@localhost ~]# date -s "12:00:00" -u
Fri Sep 7 12:00:00 UTC 2018
[root@localhost ~]# date
Fri Sep 7 20:00:02 CST 2018
UTC时间比CST快8个小时 ,也就是说设置时间为UTC 12:00:00等同于设置时间为CST 20:00:00
设置本地日期
[root@localhost ~]# date -s 2012-12-12
Wed Dec 12 00:00:00 CST 2012
设置完整日期
[root@localhost ~]# date -s "2012-12-12 12:12:12"
Wed Dec 12 12:12:12 CST 2012
使用hwclock命令
hwclock
是用于访问硬件时钟的实用程序,硬件时钟存储的值为:年、月、日、小时、分钟和秒。不能存储时间标准、本地时间或协调世界时(UTC),也不能设置夏令时(DST)。hwclock实用程序将其设置保存在/etc/adjtime文件中,该文件是使用您所做的第一个更改创建的,例如,当您手动设置时间或将硬件时钟与系统时间同步时。
在Red Hat Enterprise Linux 6中,hwclock
命令在每次系统关闭或重新启动时自动运行,但它不在Red Hat Enterprise Linux 7中。当系统时钟通过网络时间协议(NTP)或精确时间协议(PTP)同步时),内核每11分钟自动将硬件时钟与系统时钟同步。
显示当前硬件时间
[root@localhost ~]# hwclock
Wed 12 Dec 2012 12:07:24 AM CST -0.672664 seconds
设置硬件时间
如果要将日期和时间设置为特定值(例如,“2016年10月21日21:17”),请root
按以下格式运行命令:
[root@localhost ~]# hwclock --set --date "21 Oct 2016 21:17"
以UTC时间 hwclock --set --date "21 Oct 2016 21:17" 设置硬件时间
[root@localhost ~]# hwclock --set --date "21 Oct 2016 21:17" -u
我在实际验证中,这里的 -u参数并没有起到作用
同步时间和日期
- 设置硬件时间为系统时间
[root@localhost ~]# hwclock -w
- 设置系统时间为硬件时间
[root@localhost ~]# hwclock -s
关于CentOS时间的杂谈
系统时间原理
系统时间由Linux内核维护,其初始值基于硬件时间,一旦Linux启动并且系统时间被初始化,系统时钟就完全独立于硬件时间。这也是为什么date修改系统时间后要hwclock -w,将系统时间同步给硬件时间,如果不同步,重启操作系统,系统时间将再次基于硬件时间初始化,这也就失去了修改系统时间的意义。timedatectl set-time 是同时设置系统时间和硬件时间。
要验证这个原理也非常简单,在Linux关机后,进入BIOS修改硬件时间,再开机查看Linux的系统时间,不出意外此时系统时间应会出现相应变化,做这个测试建议把杂谈看完后再做,不然会有一些困惑。
系统时间误差
Linux内核初始化系统时间后,只要不关机或做特殊设置,Linux的系统时间就一直由Linux内核维护,也正是因为这个原因Linux运行久了,会出现系统时间和硬件时间偏差(一个是靠Linux内核维护,一个是靠硬件维护),一般是几秒钟左右。因此需要设置定时任务,将硬件时间同步至系统时间,避免系统重启后,系统时间出现偏差。
对于一些集群而言,则需要设置NTP时间同步,保证系统时间的准确性,详细的设置NTP时间同步后续文章再写。
本地时间
系统时间、硬件时间始终是协调世界时(UTC),Linux会根据需要在应用程序中将系统时间转换为本地时间。比如直接执行date,是输出本地时间;此时date就是根据当前时区设置将系统时间换算为本地时间输出;如果修改时区后,再执行date,date会根据修改后的时区用系统时间计算出修改后的本地时间。
这也是很多命令-u的参数的意义,不过这一点倒没必要过于区分,比如大家一般都会认为系统时间就是本地时间,如果因为时区设置问题,导致执行date输出时间不是所处时区的时间的这种情况,大家都是说系统时间时区未正确设置。
实际上系统时间和硬件时间都是UTC时间运行,只不过大家都平时都没有去关注date、hwclock的-u,--utc项的意义,但那种通用的说法也不会影响平时使用。
夏令时
自1992年起,我国就没有再使用夏令时,系统时间也就不必设置开启夏令时。前面说到系统时间是根据硬件时间计算出来的,本地时间是当前时区的实际时间,考虑到夏令时(DST),硬件时钟可以使用UTC或本地时间,一般建议使用UTC。夏令时这部分内容简单了解一下就可以了,毕竟我国不用夏令时,全部关闭就可以了。
综述:根据这些杂谈,应该能够理解为什么hwclock -w后,进入BIOS查看硬件时间和系统时间和硬件时间刚好相差8个小时。因为真正的硬件时间是没有时区的概念,为了通用性,Linux默认是将硬件时间当作为UTC时间(当然这个可以更改设置),而UTC时间和你经常设置的北京时间就是恰好相差了8小时,同时也解释了类似date -u的意义。
看了杂谈可能会有点逻辑混乱,实际操作时还是按照平常的理解就可以了,毕竟时间这一块没那么复杂,只要设置对了时区,时间可以了,像timedatectl set-time、hwclock -w的时候需要考虑那么多,Linux会自动将本地时间计算为UTC时间记录到硬件时间上。
小知识
通常,英文文档中的time译作时间,也就是我们平时说的几点几分;date的译作日期,也就是我们平时说的几月几日;clock译作时钟,可以是硬件,也可以是一些工具,比如是real-time clock (RTC),准确的翻译应该是硬件时钟,是个硬件,系统时钟(system clock),Linux内核维护的一个“工具”。
来源:oschina
链接:https://my.oschina.net/u/4306388/blog/3892644