系统时间的显示会和实际出现不同步,这里面经常会碰到的问题主要有时区设定/系统时钟/RTC/NTP,这篇文章将相关问题简单整理一下。
几个常见的概念,进行总结如下:
项目 | 说明 |
---|---|
时区 | 因时区不同显示的时间不同,牵扯到夏令时和调整等问题,date命令可查看 |
系统时钟:System Clock | linux OS的时间,date命令可查看 |
硬件时钟:RTC:Real Time Clock | 主板上由电池供电的BIOS时间,hwclock -r可查看 |
NTP: Network Time Protocol | 本机时间和实际的时间之间的经常会有差别,一般使用NTP服务器进行时间校准 |
[root@devops ~]# hwclock -r ; date;
Sat 03 Feb 2018 09:18:26 AM EST -0.692300 seconds
Sat Feb 3 09:19:19 EST 2018
[root@devops ~]#
从这里可以看出,系统时间和硬件时间已经由几十秒的不同步了
使用hctosys选项可将硬件时间设定到系统时间上,反向操作使用systohc即可,以下是硬件时间->系统时间调整的例子:
[root@devops ~]# hwclock -r ; date; hwclock --hctosys; hwclock -r; date;
Sat 03 Feb 2018 09:29:38 AM EST -0.921131 seconds
Sat Feb 3 09:30:27 EST 2018
Sat 03 Feb 2018 09:29:40 AM EST -1.080703 seconds
Sat Feb 3 09:29:40 EST 2018
[root@devops ~]#
但是时间还是会经常性发生gap,以某个时间为主的话建议在使用之前确认或者同步一下更为准确。
有很多可以用于NTP校时的服务器,比如:
我们可以设定自己的ntpd服务用于校时,也可以用ntpdate命令随时确认和调整,在此之前需要先行安装相关的package
[root@devops ~]# yum install -y ntp ntpdate
使用ntpdate可以进行调整,如果向本例中的情形,时间会出现很大的跳跃,往往会给应用带来很多影响,一般实时性较高的应用都需要搭建内部的ntp服务器,由一台作为核准的服务器,其余与之关联,而且调整的节奏要注意性能和频度,同时最好结合硬件时钟进行同步。
[root@devops ~]# date; ntpdate 0.cn.pool.ntp.org
Sat Feb 3 09:50:49 EST 2018
3 Feb 18:30:16 ntpdate[25285]: step time server 173.255.246.13 offset 31151.519278 sec
[root@devops ~]# date
Sat Feb 3 18:30:18 EST 2018
[root@devops ~]#
date命令所显示的EST为美国六大时区中的一个,Eastern Standard Time 东部时区,比如纽约和华盛顿,与北京时间相差13个小时,我们比他们早13个小时,当他们昨天还没有过完的时候,我们已经开始了新的一天。
在这个目录下放置的是各主要时区的时间设定文件
[root@devops ~]# ls /usr/share/zoneinfo/
Africa Atlantic Chile Eire GB GMT+0 Indian Japan MST Pacific PRC Singapore UTC Zulu
America Australia CST6CDT EST GB-Eire Greenwich Iran Kwajalein MST7MDT Poland PST8PDT Turkey WET
Antarctica Brazil Cuba EST5EDT GMT Hongkong iso3166.tab Libya Navajo Portugal right UCT W-SU
Arctic Canada EET Etc GMT0 HST Israel MET NZ posix ROC Universal zone1970.tab
Asia CET Egypt Europe GMT-0 Iceland Jamaica Mexico NZ-CHAT posixrules ROK US zone.tab
[root@devops ~]#
比如常用的Asia/Shanghai
[root@devops ~]# file /usr/share/zoneinfo/Asia/Shanghai
/usr/share/zoneinfo/Asia/Shanghai: timezone data, version 2, 2 gmt time flags, 2 std time flags, no leap seconds, 16 transition times, 2 abbreviation chars
[root@devops ~]#
[root@devops ~]# more /usr/share/zoneinfo/Asia/Shanghai
TZif2--More--(80%)
CST-8
[root@devops ~]#
本地时间配置文件, 此文件一般为/etc/share/zoneinfo下面的文件的软链接,比如当前EST时间,可以清晰地看出其实际是链接到纽约的时间
[root@devops ~]# ll /etc/localtime
lrwxrwxrwx. 1 root root 38 Jan 18 17:02 /etc/localtime -> ../usr/share/zoneinfo/America/New_York
[root@devops ~]#
我们将其改变为Asia/Shanghai
[root@devops ~]# rm /etc/localtime
rm: remove symbolic link ‘/etc/localtime’? y
[root@devops ~]# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@devops ~]# ls -l /etc/localtime
lrwxrwxrwx. 1 root root 33 Feb 4 08:15 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai
[root@devops ~]#
而此时,时间已经实时地被调整为CST
[root@devops ~]# date
Sun Feb 4 08:15:46 CST 2018
[root@devops ~]#
在每次开机是Linux 会自动的读取此文件来以设定自己系统所默认要显示的时间,设定的内容主要有如下三项:
项目 | 说明 | 常用设定值 |
---|---|---|
UTC | 指定BIOS中保存的时间是否是GMT/UTC时间 | true:UTC时间,false:本地时间 |
ZONE | 指定时区,其值是一个/usr/share/zoneinfo下的时区文件的相对路径名 | “Asia/Shanghai” |
UTC | 硬件时钟是否要和UTC一致 | false |
ARC | 特殊硬件设定 | 一般设定为false,一些特殊的硬件会设定为true |
SRM | 特殊硬件设定 | 一般设定为false,一些特殊的硬件会设定为true |
没有此文件,直接vi编辑一个即可
[root@devops ~]# vi /etc/sysconfig/clock
[root@devops ~]#
[root@devops ~]# cat /etc/sysconfig/clock
ZONE="Asia/Shanghai"
UTC=false
ARC=false
SRM=false
[root@devops ~]#
时间如果发生错乱,可以使用hwclock的systohc进行调整
[root@devops ~]# date;
Sun Feb 4 08:18:43 CST 2018
[root@devops ~]#
[root@devops ~]# hwclock -r
Sat 03 Feb 2018 11:38:11 PM CST -0.308882 seconds
[root@devops ~]# hwclock --systohc
[root@devops ~]# hwclock -r
Sun 04 Feb 2018 08:19:08 AM CST -0.955669 seconds
[root@devops ~]#