Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

解决 Red Hat Enterprise Linux 中的闰秒问题

Updated -

Red Hat 已就 2015 闰秒问题准备了完整指南,供您在使用 Red Hat Enterprise Linux 时准备和预防由闰秒引起的包括停机在内的任何问题。

内容

  1. 简介
  2. 闰秒事件预告
  3. 环境
  4. 了解闰秒
  5. 处理闰秒
  6. 已知问题
  7. 测试
  8. 附加资源

简介

闰秒是对协调世界时(UTC)的周期性一秒钟调整,目的是要让系统的时间信息接近平均太阳时。但地球的自传速度会因气候和地理活动发生变化,因此,UTC 闰秒是不规律的,也是无法预测的。本文试图为您提供有关闰秒的信息,以及 Red Hat Enterprise Linux 处理插入闰秒的方法。

闰秒事件预告

下一次闰秒插入预计将于 2015 年 6 月 30 日 23:59:60 UTC 进行。

环境

  • Red Hat Enterprise Linux versions 4
  • Red Hat Enterprise Linux versions 5
  • Red Hat Enterprise Linux versions 6
  • Red Hat Enterprise Linux versions 7

了解闰秒

我们将世界绝大多数地方时区的基本时间称为协调世界时,即 UTC,它源自分布在世界一些国家的大量原子时钟。地球的自转并不是非常恒定的,有时会有一些变化,平均自转速度会缓慢下降。这就是为什么会在 UTC 时标中插入所谓秒的原因,它们可将 UTC 时间进程调整到真实地球自转时间。

为什么会多出这一秒呢?它的存在时因为决定昼夜更替的地球绕轴自转会在很长的一段时间内慢下来,主要是由月亮-太阳引力造成。另外,地球也受其内部(地核、地幔)和外部(气候、海洋)构成影响。目前,时间主要由分属几个国家的 250 台原子时钟测量,这些原子钟是通过测量原子的能量转换水平工作。使用这些时钟计算 UTC,同时因为这个时间测量原理周期性地与地球不同步,因此必须使用闰秒进行校正。另外,我们必须考虑到现在的一天比 1820 年的一天要长 2 毫秒。不出所料,地球自转慢慢就与 UTC 不同步了。

国际地球自转服务局IERS 测量的是真实地球自转,并决定何时插入闰秒。插入闰秒一般总是在某个月的最后一天进行,首选六月或十二月的 UTC 午夜时间。过去每次添加闰秒都是在六月或十二月进行(*)。有关是否添加闰秒的声明由 IERS 在其 Bulletin C 中发布。目前,在可能添加闰秒日期前半年会公布 Bulletin C 。

2005 年 7 月 的 IERS Bulletin C #30 宣布将在 2005 年 12 月 31 日 UTC 午夜时间插入闰秒。这是在 1998 年底插入闰秒后首次插入闰秒。这是为什么在之前的七年中开发的应用程序无法正确处理闰秒的原因。

因为闰秒是在全世界同时插入,插入闰秒的本地(民用)时间取决于本地时间与 UTC 之间的偏差,例如:在时区 UTC+3h 中,闰秒会在时钟显示午夜后 3 小时的时候插入。

闰秒时计算 UTC 时间的标准方法为:

  2011-12-31 23.59.57
  2011-12-31 23.59.58
  2011-12-31 23.59.59
  2011-12-31 23.59.60 <-- 闰秒
  2012-01-01 00.00.00
  2012-01-01 00.00.01
  2012-01-01 00.00.02

如果系统时钟采用国际原子时(TAI),并使用正确的 /* 时区,那么就会列出 23:59:60;但因为在 Unix 的 UTC 使用中不存在 23:59:60,Linux 内核会采用倒回一秒的方法在 0:00 UTC 后第一次时钟更新时插入闰秒。在本地时间计时中,根据不同的时区偏差,比如 UTC+3h,您会观察到以下现象:

2012-01-01  02:58:00.000
2012-01-01  02:58:00.500
2012-01-01  02:59:00.000
2012-01-01  02:59:00.500
2012-01-01  03:00:00.0xx <-- 插入闰秒
2012-01-01  02:59:00.0xx
2012-01-01  02:59:00.500
2012-01-01  03:00:00.000
2012-01-01  03:00:00.500

闰秒是一个不连续的民用时。这个时间不是无变化地增加,而是直接累加一秒。让我们看一下所插入闰秒的时间戳以及闰秒后一秒的时间戳:

  2011-12-31 23.59.60 <-- 闰秒
  2012-01-01 00.00.00

我们可以将闰秒的时间和日期正常化:
60 秒为 1 分钟,这就让分钟从 59 增加到 60。
60 分钟为 1 小时,这就让小时从 23 增加到 24。
24 小时为 1 天, 这样可以让天数增长,以此类推。
最后我们可以说这两行代表完全相同的时间,或者这连续的 2 秒有相同的时间戳

IERS 确定闰秒后,一些时间传播服务还会发布闰秒通知。这包括德国长波发射机 DCF77 和卫星巡航系统 GPS 示例。因此,可解码从那些系统获取信号的接收器也可以解码闰秒通知。如果在所应用协议中包含闰秒信息(例如接收器传送的时间字符串),则从那些接收器读取时间的应用程序也可以确定闰秒通知。

请注意,时间代码接收器只能将闰秒通知转发到应用程序,同时正确计时。正确处理闰秒是应用程序和(/或)操作系统的任务。

(*):北美地区有些 NTP(网络时间协议)服务器在 2012 年 8 月 31 日 UTC 午夜时间错误地发布了一个额外闰秒通知。确定两个层 1 服务器(即 truechimer.cites.illinois.edu 和 time-b.nist.gov)错误地发出闰秒通知。所有在其层级中包含这两个服务器的更高层(层 2 、3、4)NTP 服务器都应被视为错误地提供闰秒。使用这些服务器的 NTP 客户端将设置内核的 leap indicator 标签,系统重启前不会清除该标签。

处理闰秒

对这个问题的处理具体要看 Red Hat Enterprise Linux 系统运行的是 NTP(网络时间协议)还是 PTP(精确时间协议)守护进程。

运行 NTP 的系统

运行 Red Hat Enterprise Linux 任何版本的系统,如果使用 NTP(网络时间协议)守护进程将其本地计时与 NTP 服务器同步,则都应自动进行闰秒调整。进行闰秒调整的前一天,NTP 服务器应通知其客户端第二天的 23:59:59 UTC 会发生发生闰秒,Linux 内核应通过两次显示第 60 秒或彻底删除它,以便添加或者删除额外一秒。因此,在闰秒调整期间,运行 NTP 的 Red Hat Enterprise Linux 系统应有如下计时显示:

2008-12-31 23:59:59 UTC
2008-12-31 23:59:59 UTC
2009-01-01 00:00:00 UTC

发生闰秒时,内核会在系统 log.  中写入信息。

运行 PTP 的系统

PTP 中交换的时间戳通常采用不包含闰秒的 TAI(国际原子时);但 ptp4lphc2sys 将设置内核标签,插入闰秒以便系统时钟继续以 UTC 运行。然后该内核就可以正常插入闰秒。

未运行 NTP 或者 PTP 的系统

默认情况下,不使用 NTP 或者 PTP 同步其计时的 Linux 系统不会修正闰秒,且这些系统报告的时间与修正闰秒后的 UTC 时间有一秒钟的差别。闰秒发生后应手动重置时钟。

您还可以将 tzdata 更新至最新版本,将 /usr/share/zoneinfo/right 目录层级中的正确文件复制到 /etc/localtime,并将时钟重置到正确的本地时间,以便将这些系统配置可正确报告时间。  /usr/share/zoneinfo/right 中的文件包含自该世纪开始,从 1970 年 1 月 1 日 00:00:00 UTC 发生的所有闰秒修正的本地时间信息。  /usr/share/zoneinfo 中的其他时区文件未添加闰秒修正。  2008 年闰秒后,本世纪共添加了 24 次闰秒。

例如:如果某个系统位于北美/洛杉矶(美国太平洋)时区,您可以将其重新配置为通过运行以下命令报告闰秒修正时间,并将时钟重设为太平洋时间:

cp /usr/share/zoneinfo/right/America/Los_Angeles /etc/localtime

已知问题

勘误 RHEA-2012-0356 可保证在 RHEL3/4/5/6 以及不是通过 NTP 所连接系统中正确识别 2012 年 6 月底插入的闰秒。

RHEL 4
  1. 输出此信息可能会在 Red Hat Enterprise Linux 4 中造成内核崩溃;这个问题已记录在 输出闰秒插入信息时系统停止 中。
  2. 确定安装了 tzdata-2015a-1.el4 或之后的版本,以便在没有使用 ntpd 同步的系统中插入闰秒;这个软件包由 RHEA-2015:0141-1 发布。
RHEL 5
  1. 输出此信息可能会在 Red Hat Enterprise Linux 5 中造成内核崩溃;这个问题已记录在 输出闰秒插入信息时系统停止 中。
  2. 确定安装了 tzdata-2015a-1.el5 或之后的版本,以便在没有使用 ntpd 同步的系统中插入闰秒;这个软件包由 RHEA-2015:0141-1 发布。
RHEL 6
  1. 系统收到插入闰秒通知后有可能会停止响应;这个问题已记录在 闰秒活锁造成系统停止 中。
  2. 插入闰秒后,大量采用 futex 的应用程序开始消耗大量 CPU;这个问题已记录在 插入闰秒后为什么会出现高 CPU 消耗? 中。
  3. 确定安装了 tzdata-2015a-1.el6 或之后的版本,以便在没有使用 ntpd 同步的系统中插入闰秒;这个软件包由 RHEA-2015:0141-1 发布。
  4. 闰秒期间未正确更新国际原子时(TAI)偏移;这个问题已记录在 闰秒过程中国际原子时(TAI)偏移不正确 中。
  5. 在 ntp 中使用 -x 仍可在发生闰秒时造成瞬时时钟变化;这个问题已记录在 Red Hat 是否计划发布 npt 的 xleap.patch? 中。
RHEL 7
  1. 确定安装了 tzdata-2015a-1.el7 或之后的版本,以便在没有使用 ntpd 同步的系统中插入闰秒;这个软件包由 RHEA-2015:0141-1 发布。
  2. 在 ntp 中使用 -x 仍可在发生闰秒时造成瞬时时钟变化;这个问题已记录在 Red Hat 是否计划发布 npt 的 xleap.patch? 中。

注: Red Hat 建议使用 PPC 和 IA64 架构的用户采用 未运行 NTP 或者 PTP 的系统 论述的方法。

测试

Red Hat 将继续对所有出现问题进行测试,如有任何与完成测试有关的可用信息,我们就会更新这篇文章。

已成立了执行这个测试的实验室,您可以通过 闰秒漏洞探测程序 访问。

另外,Red Hat 强烈建议用户测试其构建和环境,我们是否容易受到闰秒事件的影响? 中提供了如何进行测试的步骤,其中包含一个示例程序。

附加资源

您可以在以下链接中找到闰秒、如何在 Linux 处理闰秒、以及如何使用 NTP 处理闰秒的信息:

Was this helpful?

We appreciate your feedback. Leave a comment if you would like to provide more detail.
It looks like we have some work to do. Leave a comment to let us know how we could improve.