linux中关于时间的那些事

96
Svon_Book
2016.12.23 14:34* 字数 2043

我们在对Linux系统进行操作之前,通常都要进行环境的初始化,其中有一项工作就是时间的设置、同步。但就我在实现工作中遇到的情况来看,似乎工程师对系统时间的概念都比较淡化,也许是工作重心放在了其它的地方,因此忽略了时间这个看似不重要,确不得不重视的东西。开始之前,先来了解一下UTCGMTCST等几个关于标准时间的概念

1.世界协调时间UTC多数的两地时间表都以GMT来表示,但也有些两地时间表上看不到GMT字样,出现的反而是UTC这3个英文字母,究竟何谓UTC?事实上,UTC指的是Coordinated Universal Time-世界协调时间(又称世界标准时间、世界统一时间),是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以「秒」为单位的国际原子时所综合精算而成的时间,计算过程相当严谨精密,因此若以「世界标准时间」的角度来说,UTC比GMT来得更加精准。其误差值必须保持在0.9秒以内,若大于0.9秒则由位于巴黎的国际地球自转事务中央局发布闰秒,使UTC与地球自转周期一致。所以基本上UTC的本质强调的是比GMT更为精确的世界时间标准,不过对于现行表款来说,GMT与UTC的功能与精确度是没有差别的。

由于地球为圆形,处在的不同地理位置,就存在时间差的问题,这里在说以哪里的时间为标准,其他地区以这个标准时间修正多少偏差就是标准时间。这也就是我们所谓的时区。

2.设置时间之前的第一件事情,便是先确定服务器所在区域属于哪个时区。以下来介绍设置及查看时区的几个方法

a)CentOS-7发行版本的timedatectl

直接输入该命令就可以查看到当前的时区信息


使用以下命令,可以设置自己所在时区,这里假设要设置为亚洲/上海


时区为亚洲/上海

想要查看具体有哪些时区,自己属于哪个时区可以使用timedatectl list-timezones


timedatectl list-timezones

b)tzselect的用法

tzselect是个交互式的脚本程序,直接输入该命令即可。之后将以问答形式的交互,输入对应的数字项就能完成时区的设置,如图


tzselect

c)直接修改

说来道去,其实命令修改的都是/etc/localtime这个文件,我们需要设置为什么时区,只需要把对应的时区文件复制过来即可,但是为直观明了,我们可以直接将该文件以软连接的方式指向到真正的时区文件,如图


/etc/localtime


zoneinfo

3.接下来说说时间的设置方法及查看方法,包括如何将硬件及系统的相互进行同步

a)使用date命令

直接输入date命令查看,月份星期都一目了然,如图


设置时间可以参照这个格式,记不住的话,在系统中man date即可看到,按模板格式对应修改。从MM开始分别是月份日期小时分钟世纪年份秒钟

date [-u|--utc|--universal][MMDDhhmm[[CC]YY][.ss]]

例如设置时间为10月12日05时20分21世纪第17年01秒的格式为

date 101205202017.01


b)timedatectl命令

使用这个命令的一个好处是格式容易让人接受,人性化的时间格式更容易记忆。同样设置如上时间的格式为


c)系统及硬件时间同步命令hwclock

这里需要注意的是,系统时间和硬件时间是不一样的,设置好系统时间之后,还需要将其同步到硬件中,避免时间设置完后,重启丢失

$ hwclock --systohc#将系统时间同步到硬件当中

$ hwclock --hctosys#将硬件时间读入到系统当中

使用date命令设置时间后,需要手动执行系统及硬件时间的同步,timedatectl set-time命令会在设置时间的同时将其写入到硬件中,一步到位。

综上所术,非常推荐使用timedatectl命令来设置时间和时区

4.通常,在数据中心中各服务器都会向时间服务器自动的同步时间,在这里需要简单的了解一下ntp服务以及怎么使用ntpdate向时间服务器同步时间。ntpd与ntpdate在更新时间时有一些小区别——ntpd不仅仅是时间同步服务器,他还可以做客户端与标准时间服务器进行同步时间,在实际同步时是将时间一点点的校准过来的,属于平滑同步,最终把时间慢慢的校正对。ntpdate是立即同步,直接调整时间。一个是校准时间,一个是调整时间。另外ntpd在和时间服务器的同步过程中,会把BIOS计时器的振荡频率偏差——或者说Local Clock的自然漂移(drift)——记录下来。这样即使网络有问题,本机仍然能维持一个相当精确的走时。总体来说,1. ntpd比较适合在生产环境中使用,2.两者不可同时使用。

a)ntpd的配置使用

使用之前先安装ntpd

ntpd的配置分为两种,一种是用作给别人提供时间更新的服务,还有一种是以客户端的身份,与远端服务器同步自身时间。当然这两者同时工作的情况是允许的,在其配置文件ntp.conf中的stratum字段说明了这点,他们以“层级”的形式工作。

作为服务器方式的配置在这里暂不介绍,可参考这篇文章——

http://www.thegeekstuff.com/2014/06/linux-ntp-server-client/

作为客户端方式的配置,其实只需要一行:

 server [IP or hostname] [prefer]

例如

server 0.rhel.pool.ntp.org iburst

需要解释一下的是最后的参数,这里一共有三个,含义分别是

prefer  ——首选的

iburst  ——对server进行检测,如果有多个的话,将对他们进行轮询,每次都要对其中的一个server并行的发送8个包(这里形象的使用突发包来表示)用以检测。这时候如果目标服务器响应了,之后会每隔2秒发送一次,如果没有响应则每16秒发送一次检测包

burst  ——与iburst的作用相同,不一样的是对不响应的server发送高频率的检测包,与iburst的操作方式相反

做完这步就可以重启ntp服务了,使用ntpq –p可以查看到server是否有效

b)ntpdate配合crontab设置系统时间

使用之前先安装ntpdate

使用如下命令,向目标服务器直接校对时间,-u参数我们可以简单的理解其为能够穿越防火墙

$ ntpdate –u 0.rhel.pool.ntp.org

同步成功之后,使用hwclock --systohc将时间写入硬件。如果是对时间非常敏感的服务器,可以将该命令写入crond任务中,用以定时更新时间,当然别忘记把时间写入硬件命令一同加入进去。

Linux