Linux时区与时间的更改
2010-06-03 18:15:53 阿炯

时区是地球上的区域使用同一个时间定义。以前,人们通过观察太阳的位置(时角)决定时间,这就使得不同经度的地方的时间有所不同(地方时)。1863年,首次使用时区的概念。时区通过设立一个区域的标准时间部分地解决了这个问题。整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。

世界各个国家位于地球不同位置上,因此不同国家,特别是东西跨度大的国家日出、日落时间必定有所偏差,这些偏差就是所谓的时差。

关于时间的几个标准,如下所示:
CST:中国标准时间(China Standard Time)。

UTC:协调世界时,又称世界标准时间,简称UTC,从英文国际时间/法文协调时间”Universal Time/Temps Cordonné”而来。中国大陆、香港、澳门、台湾、蒙古国、新加坡、马来西亚、菲律宾、澳洲西部的时间与UTC的时差均为+8,也就是UTC+8。

GMT:格林尼治标准时间(旧译格林威治平均时间或格林威治标准时间;英语:Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。


国际上规定,每隔15°划分一个时区,全球可分为24个时区。以本初子午线为基准,从西经7.5°至东经7.5°,划分为中时区,或叫零时区 每时区区时相差一小时 东加西减。关于时区分布图,大家可以参考世界时区

Linux 时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC )时钟。系统时钟是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的时钟,这个硬件时钟可以在BIOS中进行设置。当Linux 启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作。有的时候你通过在shell执行date命令看到时间是一致的时候,并不能代表其硬件时间也是一致的。前些天有两位同事过来对说,他们在比较测试一个在oracle下的存储过程时,发现四台数据库服务器中有一台的时差总比其它的三台早12个小时,我过去在服务器通过date命令仔细一看,时间、时区、日期都不差呀,怎么会不一样?后来想起来,是不是硬件时间有问题,用'hwclock --show'一看,果然有一台的时钟成pm了。过去在跟那两位工程师一说,他们也一下想起,oracle只看硬件时间,不看系统时间的。

Linux中的所有命令(包括函数)都是采用的系统时钟设置。在Linux中,用于时钟查看和设置的命令主要有date、hwclock和clock。其中clock和hwclock用法相近,只用一个就行,只不过clock命令除了支持x86硬件体系外,还支持Alpha硬件体系。Linux的时间是系统启动时,内核会从主板的硬件资源读取时间并设置为内核中的时钟。之后系统时间和硬件的内核时间是各自分开独立运行的。由于操作系统在运行过程中CPU繁忙等各种原因,运行一段时间后很可能会导致系统时钟不精确的显现,反应在同一个集群的多台主机上其实就是集群时间不一致。虚拟机获得的CPU是虚拟出来的,并不是真正物理机上的CPU,因此出现时间误差的概率是相当的大,必须为其配置一个时间服务器,否则可能各个虚拟机的时间出现不一致的情况。

一、Linux下查看所在的时区


1、date
查看系统当前时间
# date

2、查看系统时区
# date -R
Thu, 01 Jun 2017 17:25:49 +0800
RFC 2822 格式,中国时区。

# ls -l /etc/localtime
这个文件一般是链接到/usr/share/zoneinfo/目录下的对时应时区文件,可以通过这个链接看到具体的时区,但不总有效。

对debian系与rhel系这个是不一样的,
[rhel]
more /etc/sysconfig/clock

[debian]
more /etc/timezone

设置系统时间
# date --set “02/07/10 10:19" (月/日/年时:分:秒)

3、hwclock/clock
查看硬件时间
# hwclock --show
或者# clock --show

设置硬件时间
# hwclock --set --date="02/07/10 10:39" (月/日/年 时:分:秒)
或者# clock --set --date="02/07/10 10:39" (月/日/年 时:分:秒)

4、硬件时间和系统时间的同步
按照前面的说法,重新启动系统,硬件时间会读取系统时间,实现同步,但是在不重新启动的时候,需要用hwclock或clock命令实现同步。
硬件时钟与系统时钟同步:# hwclock --hctosys(hc代表硬件时间,sys代表系统时间)或者# clock --hctosys
系统时钟和硬件时钟同步:# hwclock --systohc或者# clock --systohc

二、Linux下时区的设置

1、tzselect
# tzselect
它通过一系列交互于问答,来最终选择时区。tzselect命令只告诉你选择的时区的写法,并不会生效。可以在.profile、.bash_profile或者/etc/profile中设置正确的TZ环境变量并导出。

如果不用tzselect命令,可以修改文件变更时区。如下:

2、修改clock文件内容
# vi /etc/sysconfig/clock
ZONE=Asia/Shanghai(查/usr/share/zoneinfo下面的文件)
UTC=false
ARC=false
这个仅仅适用于rhel系列。

3、操作/etc/localtime文件
复制相应的时区文件,替换系统时区文件或创建链接文件。
# rm /etc/localtime
# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
重新启动即可。

4、pkg-reconfigure tzdata设置时区
这个仅仅适用于debian系列。


CentOS 7中的时区设置

查看当前系统时区:$ timedatectl

如果你当前的时区不正确,请按照以下操作设置。

查看所有可用的时区:
timedatectl list-timezones

筛选式查看在亚洲S开的上海可用时区:
timedatectl list-timezones |  grep  -E "Asia/S.*"
Asia/Shanghai

设置当前系统为Asia/Shanghai上海时区:
timedatectl set-timezone Asia/Shanghai

设置完时区后,强制同步下系统时钟(如果设置没有问题却报错的话,多为没有启动时间同步进程):
chronyc -a makestep
200 OK

将用于同步时间的守护进程设定为自启动
systemctl enable chronyd.service

开启时间同步守护进程
systemctl start chronyd.service

Chrony使用设置参考

三、互联网头部公司呼吁取消闰秒

2022年7月下旬消息,Meta 的工程团队发文称,建议取消闰秒,“引入新的闰秒是一种危险的做法,弊大于利,我们认为现在是引入新技术来取代它的时候了”。谷歌、微软和亚马逊也参与共同呼吁,这一主张还得到了美国国家标准与技术研究院(NIST)及国际计量局(BIPM)的认同。Meta 的研究科学家 Ahmad Byagowi 称:“我们预测,如果我们只坚持使用国际原子时(TAI),而不进行闰秒观测,那么我们应该至少可以坚持 2000 年。就此而言,我们可能需要考虑进行修正。”

闰秒的概念由国际地球自转服务组织(IERS)在 1972 年首次提出,是指为保持协调世界时(UTC)接近于世界时时刻,由国际计量局统一规定在年底或年中(也可能在季末)对协调世界时增加或减少 1 秒的调整。由于地球自转的不均匀性和长期变慢性(主要由潮汐摩擦引起的),会使世界时(民用时)和原子时之间相差超过到 ±0.9 秒时,就把协调世界时向前拨 1 秒(负闰秒,最后一分钟为 59 秒)或向后拨 1 秒(正闰秒,最后一分钟为 61 秒); 闰秒一般加在公历年末或公历六月末。目前全球已经进行了 27 次闰秒,且均为正闰秒。最近一次闰秒在北京时间 2017 年 1 月 1 日 7 时 59 分 59 秒(时钟显示 07:59:60)出现,这也是本世纪的第五次闰秒。


Meta 方面在博客中指出,通过正闰秒简单地增加一秒会出现一个不同寻常时间戳 23:59:59 -> 23:59:60 -> 00:00:00。在最好的情况下,这样的时间跳跃会使程序崩溃甚至损坏数据。但随着地球自转模式的变化,我们很可能在未来的某个时刻出现负闰秒,届时时间戳会显示成:23:59:58 -> 00:00:00。而目前有关负闰秒的影响尚未有过大规模的测试,它可能会对依赖计时器或调度器的软件产生破坏性的影响。

无论如何,对于管理硬件基础设施的人来说,每一个闰秒都是痛苦的主要来源。

根据介绍,闰秒曾多次给一些网络平台造成故障。包括在 2012 年引发了 Reddit 的大规模中断,该网站彼时有 30 到 40 分钟内无法访问;以及 Mozilla、LinkedIn、Yelp 和 Amadeus 平台的相关问题。2017 年,Cloudflare 的一次闰秒故障导致这家网络基础设施公司的一小部分客户服务器离线。Cloudflare 的软件比较了两个时钟后计算出时间已经倒退,但却无法正确处理该结果。目前最常用的一种解决方法是通过简单地放慢或加快时钟来进行 “闰秒弥补 (leap smear)”。谷歌在 2011 年提出了闰秒弥补的解决方案,通过调整内部的网络时间协议 (NTP) 服务器,在每次更新时增加几毫秒,以弥补闰秒多出来的那一秒。目前,Meta 采用的就是一种将闰秒分散在 17 个小时内的做法。

闰秒事件在整个行业引起了问题,并继续带来许多风险。在行业中,每当引入闰秒时,我们都会遇到问题。而且由于它是一个如此罕见的事件,每次发生都会对社会造成破坏。随着所有行业对时钟精度的需求不断增长,闰秒现在造成的损害(导致干扰和中断)要大于好处。作为 Meta 的工程师,我们正在支持更大的社区推动,以阻止在未来引入闰秒并保持目前的 27 水平,我们相信这足以应付下一个千年。