如果有人问你说现在几点? 你看了看表回答他说晚上8点了. 这样回答看上去没有什么问题,但是如果问你的这个人在欧洲的话那么你的回答就会让他很疑惑,因为他那里还太阳当空呢!这里就有产生了一个如何定义时间的问题. 因为在地球环绕太阳旋转的24个小时中,世界各地日出日落的时间是不一样的.所以我们才有划分时区(timezone) 的必要,也就是把全球划分成24个不同的时区. 所以我们可以把时间的定义理解为一个时间的值加上所在地的时区(注意这个所在地可以精确到城市)
GMT 格林威治时间,0时区时间
UTC (coordinated Universal Time): 协和标准时间,利用 Atomic Clock 为基准定义出来的正确时间(世界统一时间,世界标准时间,国际协调时间)
CST Chinese Standard Time,北京时间
Atomic Clock: 现在计算时间最准确的是使用原子震荡周期所计算的物理时钟(Atomic Clock),因此也被定义为标准时间(International Atomic Time)
Linux发行版使用了时区信息数据库(tzdatabase),这是一个被广泛应用的、开放的、维护着世界时区信息的数据库。
数据库里的时区不仅是时间相同的地区,还要按照行政区划进行划分,另外需要记录历史上的变化,因此划分比一般的时区图详细的多。
Linux发行版中的城市选择来自于tzdatabase中独特的命名方法,一般包括区域、地点两级,区域一般是大洲大洋,地点则一般为本时区中最具代表性(通常也就是最大)的城市名,写作「[区域]/[地点]」,如: America/New_York 。
对于中国大陆的几个时区,也基本遵循了此规定,重庆、哈尔滨、喀什、上海、乌鲁木齐分别对应原陇蜀时区、长白时区、昆仑时区、中原时区、回藏时区。
tzdatabase 中的中国大陆地区划分为五个区域,分别是:
1. Asia/Chongqing
2. Asia/Harbin
3. Asia/Kashgar
4. Asia/Shanghai
5. Asia/Urumqi
这五个时区的时间均为中国标准时间(北京时间,UTC+8)。
这五个时区来自于曾经的中国时区,是在 1918 年由民国政府划分的:
1. 中原(标准)时区:GMT+8 以东经120度为中央子午线。
2. 陇蜀时区:GMT+7 以东经105度为中央子午线。
3. 回藏时区「新藏时区」:GMT+6 以东经90度为中央子午线。
4. 昆仑时区:GMT+5:30 以东经75(82.5)度为中央子午线。
5. 长白时区:GMT+8:30 以东经135(127.5)度为中央子午线。
1949 年后中华人民共和国将各地区统一为「北京时间」(GMT+8),台湾一度沿用中原标准时间。
授时中心:北京时间由此制定
中国科学院国家授时中心前身是陕西天文台,始建于1966年,总部位于西安市临潼区,授时部位于陕西蒲城县。它是我国唯一的专门从事时间频率科学和卫星导航定位技术研究的科研机构,承担着我国标准时间的产生、保持和发播任务,建设和维护的长短波授时系统,是国家不可或缺的基础性工程和社会公益设施。
硬件时钟: 硬件时钟是指嵌在主板上的特殊的电路, 它的存在就是平时我们关机之后还可以计算时间的原因
系统时钟: 就是操作系统的kernel所用来计算时间的时钟. 它从1970年1月1日00:00:00 UTC时间到目前为止秒数总和的值
CST(Chinese Standard Time),也就是我们通常所说的北京时间
不管通过任何渠道我们想要同步系统的时间,通常提供方只会给出UTC+0的时间值而不会提供时区(因为它不知道你在哪里).所以当我们设置系统时间的时候,设置好时区是首先要做的工作。
更改时区
一、 使用tzselect命令查询需要的时区
1. 查看命令最后的提示,添加变量到~/.bash_profile文件中
将追加TZ='Africa/Nairobi'; export TZ
2. 重新登陆生效
二、使用timedatectl 命令更改时区
#查看当前时区信息
timedatectl
#列出所有时区
#timedatectl list-timezones
[root@haha ~]# timedatectl set-timezone Europe/Lisbon
[root@haha ~]# date -R 以RFC22格式输出日期和时间
Tue, 05 Apr 2016 05:46:55 +0100
#修改日期
timedatectl set-time 2016-04-25
#修改时间
timedatectl set-time '2016-04-26 21:53:50'
#设置系统时区为上海
timedatectl set-timezone Asia/Shanghai
三: ntp
安装软件
yum install -y ntp
配置文件
/etc/ntp.conf
#系统时间和硬件时间的偏差记录
driftfile /var/lib/ntp/drift
#允许所有的访问,
restrict default nomodify notrap nopeer noquery
restrict [192.168.221.0] mask [255.255.255.0] [parameter]
其中parameter的参数主要有:
ignore : 拒绝所有类型的ntp连接
nomodify : 客户端不能使用ntpc与ntpq两支程式来修改服务器的时间参数
noquery : 客户端不能使用ntpq、ntpc等指令来查询服务器时间,等于不提供ntp的网络校时
notrap : 不提供trap这个远程时间登录的功能
notrust : 拒绝没有认证的客户端
nopeer : 不与其他同一层的ntp服务器进行时间同步
#上层时间服务器地址
server 0.rhel.pool.ntp.org iburst
server 1.rhel.pool.ntp.org iburst
server 2.rhel.pool.ntp.org iburst
server 3.rhel.pool.ntp.org iburst
使用local时间作为ntp服务提供给ntp客户端。
server 127.127.1.0 本机地址用来测试网络连通性的。
fudge 127.127.1.0 stratum 8 不管怎么写都表示本机
remote 远程主机的主机名或IP
*目前正在使用的上层NTP
+已连线,可提供时间更新的候补服务器
-远程服务器被clustering algorithm认为是不合格的NTP Server
x 远程服务器不可用
refid 上级NTP的时间基准服务器
st 就是stratum 上层NTP的层级,层级0-15
when 几秒钟前曾做过时间同步更新
poll 下一次更新在几秒后,逐步增大
reach 八进制数,已经向上层服务器要求更新的次数
delay 网络传输过程中的延迟时间
offset 本地和服务器之间的时间差别,越接近0,说明和服务器的时间越接近
jitter linux 系统时间与bios硬件时钟之间的差异
案例:129主机做NTP服务端,让128主机同步该服务端
服务端192.168.88.129:
[root@localhost ~]# yum install -y ntp
[root@localhost ~]# systemctl restart ntpd
[root@localhost ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
+mail.moe.cat 103.1.106.69 2 u 178 64 4 157.197 17.956 0.000
-uk.cluster.ntp. 185.134.196.169 2 u 42 64 7 303.189 -11.727 30.037
*85.199.214.101 .GPS. 1 u 39 64 7 337.400 18.487 49.632
+ntp6.flashdance 194.58.202.148 2 u 44 64 3 319.196 19.615 27.389
将129主机作为NTP服务器,修改配置文件
[root@localhost ~]# vim /etc/ntp.conf
restrict 192.168.88.0 mask 255.255.255.0 nomodify notrap
#许可该网段主机将129作为同步主机
restrict ::1
#server 0.rhel.pool.ntp.org iburst
#server 1.rhel.pool.ntp.org iburst
#server 2.rhel.pool.ntp.org iburst
#server 3.rhel.pool.ntp.org iburst
#注释掉以上四条,添加以下两条
server 127.127.1.0 iburst
fudge 127.127.1.0 stratum 8
[root@localhost ~]# systemctl restart ntpd
客户端192.168.88.128:
[root@localhost ~]# date 121811112018.21
Tue Dec 18 11:11:21 CST 2018
[root@localhost ~]# date
Tue Dec 18 11:11:24 CST 2018
[root@localhost ~]# ntpdate 192.168.88.129
20 Dec 21:50:46 ntpdate[4358]: step time server 192.168.88.129 offset 211151.190741 sec
[root@localhost ~]# date
在实际应用中我们不可能手动同步时间,所以怎样可以自动同步呢?
#使用计划任务自动更新时间
#编辑/etc/crontab文件
* * * * * root /usr/sbin/ntpdate 192.168.88.129 > /dev/null 2>&1